在运行多个独立语句时忽略不匹配的语句



我有一堆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作为dummy作为这里建议的解决方案)

问题是,如果一个节点在第一个查询中不匹配,那么第二个匹配就不起作用,即使两个节点都存在于该查询中。当我改变上面语句的顺序时,第二个语句创建了一个关系。

当我运行第一个时,它不会抛出错误,它只是在查询结果中显示"(no changes, no rows)"。但不知何故,它中断了其余部分的执行。

是否有办法让它忽略,如果它的节点不存在,并移动到下一个语句?

如果你能推荐一种在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);

否则给出警告

警告:退出未终止的多行输入。

我想毕竟这是更好的方式,因为复制/粘贴到浏览器是不适合大量的数据。现在我可以摆脱"与1为假"的解决方案。

您可以将查询重写为

CREATE (a1:Label {name:'X'})-[:KNOWS]->(b1:Label {name:'Y'})
CREATE (a2:Label {name:'X'})-[:KNOWS]->(b2:Label {name:'Z'})

最新更新