Cypher Match-MERGE 查询在 ConstraintValidationFailed 上失败

Cypher Match-MERGE query fails on ConstraintValidationFailed

我正在尝试使用带有 Unique Constraint 的 Match-Merge 查询创建带有 RelationNode 以避免重复节点。

我在 C 标签上有 Unique Constraint 属性 姓名:

| 11 | "c_name"        | "ONLINE" | 100.0             | "UNIQUE"    | "BTREE"    | "NODE"     | ["C"]   | ["name"]             | "native-btree-1.0" |
  

我正在使用这个查询:

MATCH (n:N)
where id(n)=10
MERGE (n)-[r:Relates]->(c:C {name: "Test", parts: ["Test"]})

N 节点始终存在,但节点 C 可能不存在,如果存在,我希望它会被创建。

C 与重复的 name 存在时出现此错误!

ConstraintValidationFailed: Node(373009) already exists with label `C` and property `name` = 'Test'

有什么问题? Merge查询不会合并或跳过重复的节点吗?

如果整个模式尚不存在,MERGE 将尝试创建它。

所以,要么:

  • (c:C {name: "Test"}) 已存在,但 c.parts["Test"] 不同(或缺失),或
  • (c:C {name: "Test", parts: ["Test"]}) 已经存在,但与 n.
  • 没有 Relates 关系

无论哪种情况,MERGE 都会继续尝试创建模式,从而导致违反约束。

这个查询可以避免这种情况:

MATCH (n:N)
WHERE ID(n) = 10
MERGE (c:C {name: "Test"})
ON CREATE SET c.parts = ["Test"]
MERGE (n)-[:Relates]->(c)