我有一堆Cypher语句,我试图使用Neo4J浏览器在节点之间创建关系:
MATCH a, b WHERE a.name = 'X' AND b.name = 'Y' CREATE (a)-[:KNOWS]->(b)
WITH 1 as dummy
MATCH a, b WHERE a.name = 'X' AND b.name = 'Z' CREATE (a)-[:KNOWS]->(b)
(我将 WITH 1作为虚拟添加为建议here的解决方法)
问题是如果节点在第一个查询中不匹配,则即使该查询中存在两个节点,第二个匹配也不起作用。当我更改上述语句的顺序时,第二个语句会创建一个关系。
当我运行第一个时,它不会抛出错误,它只显示"(没有变化,没有行)"在查询结果中。但不知何故,它会中断其余部分的执行。
如果一个节点不存在并转移到下一个语句,有没有办法让它忽略?
如果您可以推荐一种更好/更简单的方式在Cypher中创建这些关系,我将非常感激(稍后我会调查导入工具)。
感谢。
更新 我想问题只是关于Neo4J浏览器。我尝试在Neo4Jshell的cql文件中运行相同的命令,它运行得很好。只需要进行一些修改,如下所示:
MATCH a, b WHERE a.name = 'X' AND b.name = 'Y' CREATE (a)-[:KNOWS]->(b);
MATCH a, b WHERE a.name = 'X' AND b.name = 'Z' CREATE (a)-[:KNOWS]->(b);
否则会发出警告
警告:退出未终止的多行输入。
我想毕竟它的方式要好得多,因为复制/粘贴到浏览器无论如何都不适合大量的数据。而现在我可以摆脱" WITH 1 as dummy"解决方法。
答案 0 :(得分:1)
您可以将查询重写为
CREATE (a1:Label {name:'X'})-[:KNOWS]->(b1:Label {name:'Y'})
CREATE (a2:Label {name:'X'})-[:KNOWS]->(b2:Label {name:'Z'})