我刚刚开始使用neo4j,我正在关注this教程。我正在尝试执行下面的查询,但是当单独运行每一行以及同时运行3行时,我得到的结果不同。
CREATE (sally:Person { name: 'Sally', age: 32 })
CREATE (john:Person { name: 'John', age: 27 })
CREATE (sally)-[:FRIEND_OF { since: 1357718400 }]->(john)
有人可以告诉我可能导致这个问题的原因吗?
答案 0 :(得分:2)
如果单独执行查询,则查询之间不会携带变量名称(sally
,john
)。这意味着您的第三个查询的解释没有变量sally
和john
绑定到任何内容:
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) = ...
或
使用数据库外部的其他标识符(社会安全号码等)。