我不明白两个查询在neo4j doc的this页面中是如何工作的。
首先,这是图表:
以下是我不了解的第一个查询:
MATCH (user:User { name: 'Adam' })-[r1:FRIEND]-(friend)
MATCH (friend)-[r2:FRIEND]-(friend_of_a_friend)
RETURN friend_of_a_friend.name AS fofName
这给出了" David"," Adam"的结果。
我原本预计结果会是" David"只是因为第一个MATCH
条款会给出" Pernilla"节点,第二个MATCH
子句将用于给出" David"节点
有人可以告诉我上述查询的实际工作方式吗?
我不理解的第二个问题是:
MATCH (user:User { name: 'Adam' })-[r1:FRIEND]-(friend),(friend)-[r2:FRIEND]-(friend_of_a_friend)
RETURN friend_of_a_friend.name AS fofName
由于文档(到目前为止)没有讨论具有两种不同模式的MATCH
子句如何工作,我真的认为上面的查询也等同于第一个查询。我是否可以详细了解此查询的工作原理,以便了解它与第一个查询的不同之处?
答案 0 :(得分:1)
当您在Cypher中使用MATCH
或OPTIONAL MATCH
子句时,可以保证,对于该路径的任何给定匹配,不会使用两次关系。因此,如果您这样做:
MATCH (user:User { name: 'Adam' })-[r1:FRIEND]-(friend)-[r2:FRIEND]-(friend_of_a_friend)
或者:
MATCH
(user:User { name: 'Adam' })-[r1:FRIEND]-(friend),
(friend)-[r2:FRIEND]-(friend_of_a_friend)
因为只有一个MATCH
指定你永远不会回到亚当。
有关差异的更详细分类,请参阅此问题:
答案 1 :(得分:0)
解释一下@Brian Underwood所说的内容。
如果您记得三种关系语法
- - [:r1] - 未定义的方向
- - [:R2] - >方向向外的节点
- < - [:r3] - 朝向节点的方向
醇>
MATCH ,如果对带有或不带逗号的模式使用单个MATCH,则不会重复模式。您可能会问,何时会重复使用模式,即使用未定义的方向时。既然你没有告诉它去哪个方向,那么它将向两个方向发展。即从亚当到大卫,再回到大卫到亚当。所以,就像我说的那样,一场比赛将会转到第一个亚当大卫。
#1
MATCH (user:User { name: 'Adam' })-[r1:FRIEND]-(friend)
MATCH (friend)-[r2:FRIEND]-(friend_of_a_friend)
RETURN friend_of_a_friend.name AS fofName
将返回David和Adam,因为它使用了未定义的方向。
#2
MATCH (user:User { name: 'Adam' })-[r1:FRIEND]->(friend)
MATCH (friend)-[r2:FRIEND]->(friend_of_a_friend)
RETURN friend_of_a_friend.name AS fofName
但这只会返回大卫,因为你正在使用无法重复的向外方向。
Cypher查询#2与以下查询相同
MATCH (user:User { name: 'Adam' })-[r1:FRIEND]-(friend),(friend)-[r2:FRIEND]-(friend_of_a_friend)
RETURN friend_of_a_friend.name AS fofName
即使它使用了在两个方向上遍历的未定义方向,只采用单个模式,我们使用单个MATCH子句。
我希望我回答你的问题。 PS。对不起我的英语不好。这对我来说是外语