首页 > 解决方案 > MERGE 子句中的逗号与 MATCH 子句中的逗号一样吗?

问题描述

以下在 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)"
                     ^

如果我理解正确,merge 提供了一定程度的 upsert 功能。但是,merge 在匹配能力上是否比 match 更受限制?如何合并需要逗号分隔的复杂非线性模式

标签: neo4jcypher

解决方案


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

这就是为什么只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

推荐阅读