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

时间:2015-04-27 15:30:47

标签: neo4j match case cypher

我想编写一个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

如果路径不存在,则返回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

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

1 个答案:

答案 0 :(得分:1)

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

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

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