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

时间:2015-09-17 14:43:42

标签: neo4j cypher

我有一堆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"解决方法。

1 个答案:

答案 0 :(得分:1)

您可以将查询重写为

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