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