问题描述
以下在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