Cypher - 如果节点不存在则原子插入

Cypher - atomic insert if node is absent

我想编写一个 Cypher 语句来测试路径是否存在,如果该部分不存在则添加它。

考虑路径(:A)-[:REL]->(:B{id:123}),那么路径的存在可以通过

来测试

OPTIONAL MATCH p = (:A)-[:REL]->(:B{id:123}) RETURN CASE COUNT(p) WHEN 0 THEN false ELSE true END

如果路径不存在则 returns false,如果存在则为 true。

路径可以通过

创建

CREATE (b:B{id:123}), (b)<-[:REL]-(:A)

但是,如果组合这些语句,那么如果路径丢失然后创建它,Cypher 会生成语法错误

OPTIONAL MATCH p = (:A)-[:REL]->(:B{id:123}) RETURN CASE COUNT(p) WHEN 0 THEN CREATE (b:B{id:123}), (b)<-[:REL]-(:A) END

是否有正确的方法来执行此路径的原子创建?

您实际上可以使用 MERGE 语句而不是先尝试询问节点是否存在。

如果节点和关系尚不存在,此语句将创建它;如果已经存在,则不会创建它。

MERGE (b:B {id:123} )<-[:REL]-(:A)
return *