逐行执行查询时,在neo4j中获得不同的结果

时间:2016-12-26 13:09:08

标签: neo4j cypher

我刚刚开始使用neo4j,我正在关注this教程。我正在尝试执行下面的查询,但是当单独运行每一行以及同时运行3行时,我得到的结果不同。

CREATE (sally:Person { name: 'Sally', age: 32 })

CREATE (john:Person { name: 'John', age: 27 })

CREATE (sally)-[:FRIEND_OF { since: 1357718400 }]->(john)

enter image description here

有人可以告诉我可能导致这个问题的原因吗?

1 个答案:

答案 0 :(得分:2)

如果单独执行查询,则查询之间不会携带变量名称(sallyjohn)。这意味着您的第三个查询的解释没有变量sallyjohn绑定到任何内容:

CREATE (sally)-[:FRIEND_OF { since: 1357718400 }]->(john)

所以,如果你写了:

,你会达到同样的目的
CREATE (node1)-[:FRIEND_OF { since: 1357718400 }]->(node2)

甚至省略了所有变量名称:

CREATE ()-[:FRIEND_OF { since: 1357718400 }]->()

您可以通过以下多种方式解决此问题:

1:使用单个查询以确保其行不会单独执行。

CREATE
  (sally:Person { name: 'Sally', age: 32 }),
  (john:Person { name: 'John', age: 27 }),
  (sally)-[:FRIEND_OF { since: 1357718400 }]->(john)

2:使用MATCH查找以前插入的节点。

CREATE (sally:Person { name: 'Sally', age: 32 })

CREATE (john:Person { name: 'John', age: 27 })

MATCH (sally {name: 'Sally'}), (john {name: 'John'})
  CREATE (sally)-[:FRIEND_OF { since: 1357718400 }]->(john)

当然,后一种方法假设名称是唯一标识符,一般情况下不是这样。要解决此问题,您可以:

  • 使用ID()函数返回节点标识符并使​​用MATCH (sally), (john) WHERE ID(sally) = ..., ID(john) = ...

  • 使用数据库外部的其他标识符(社会安全号码等)。