像MATGE子句中的MERGE子句中的逗号?

问题描述

以下在neo4j 4中可以正常工作:

MATCH (a)-->(b)<--(c),(b)-->(d)
RETURN a

但是以下内容返回错误

MERGE (a)-->(b)<--(c),(b)-->(d)
RETURN a

错误文字 Neo.ClientError.Statement.SyntaxError

Invalid input ',': expected whitespace,a relationship pattern,ON,FROM GRAPH,USE GRAPH,CONSTRUCT,LOAD CSV,START,MATCH,UNWIND,MERGE,CREATE UNIQUE,CREATE,SET,DELETE,REMOVE,FOREACH,WITH,CALL,RETURN,UNION,';' or end of input (line 1,column 22 (offset: 21))
"MERGE (a)-->(b)<--(c),(b)-->(d)"
                     ^

如果我正确理解,则合并将提供一定程度的upsert功能。但是合并在匹配能力方面比匹配更受限制吗?如何合并complex non-linear patterns that require comma separations

解决方法

如果整个模式中的任何项目都不存在,则将创建整个 MERGE模式。因此,为了安全起见,必须始终确保每个MERGE模式都只有一个 项可能不存在。

这就是为什么只有MERGE支持带有单个术语的模式才有意义。

例如,代替此(仍然不是合法的Cypher):

MERGE
  (a:Foo {id: 'a'})-[:BAR]->(b:Foo {id: 'b'})<-[:BAR]-(c:Foo {id: 'c'}),(b)-[:BAR]->(d:Foo {id: 'd'})
RETURN a

您实际上应该这样做:

MERGE (a:Foo {id: 'a'})
MERGE (b:Foo {id: 'b'})
MERGE (c:Foo {id: 'c'})
MERGE (d:Foo {id: 'd'})
MERGE (a)-[:BAR]->(b)
MERGE (b)<-[:BAR]-(c)
MERGE (b)-[:BAR]->(d)
RETURN a