带有2个MATCH子句的查询有什么作用?它与具有2个不同路径的单个MATCH子句的查询有什么不同?

时间:2016-03-11 09:24:11

标签: neo4j cypher

我不明白两个查询在neo4j doc的this页面中是如何工作的。

首先,这是图表:

enter image description here

以下是我不了解的第一个查询:

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子句如何工作,我真的认为上面的查询也等同于第一个查询。我是否可以详细了解此查询的工作原理,以便了解它与第一个查询的不同之处?

2 个答案:

答案 0 :(得分:1)

当您在Cypher中使用MATCHOPTIONAL 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指定你永远不会回到亚当。

有关差异的更详细分类,请参阅此问题:

What does a comma in a Cypher query do?

答案 1 :(得分:0)

解释一下@Brian Underwood所说的内容。

如果您记得三种关系语法

  
      
  1. - [:r1] - 未定义的方向
  2.   
  3. - [:R2] - >方向向外的节点
  4.   
  5. < - [:r3] - 朝向节点的方向
  6.   

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。对不起我的英语不好。这对我来说是外语