Cypher-Neo4j中的多个匹配

Cypher-Neo4j中的多个匹配,neo4j,cypher,Neo4j,Cypher,Neo4j文档提供了以下示例: CREATE (adam:User { name: 'Adam' }),(pernilla:User { name: 'Pernilla' }), (david:User { name: 'David'   }),   (adam)-[:FRIEND]->(pernilla), (pernilla)-[:FRIEND]->(david) 及 返回 +---------+ | fofName | +---------+ | "David" |

Neo4j文档提供了以下示例:

CREATE (adam:User { name: 'Adam' }),(pernilla:User { name: 'Pernilla' }),
(david:User { name: 'David'   }),   (adam)-[:FRIEND]->(pernilla),
(pernilla)-[:FRIEND]->(david)

返回

+---------+ 
| fofName | 
+---------+ 
| "David" | 
| "Adam"  | 
+---------+ 
2 rows
我明白大卫为什么回来,但我不明白亚当为什么回来。亚当不是朋友的朋友。我感谢你的解释。

这是因为第二场比赛没有方向

MATCH (friend)-[r2:FRIEND]-(friend_of_a_friend) 
从佩尼拉开始,它在两个方向上都匹配-[:FRIEND]——虽然它匹配David,但它也把你带回了Adam

如果向下面的第二个匹配添加方向,则只应返回David。虽然佩尼拉有两个朋友关系,一个是从亚当那里来的,另一个是从大卫那里来的

MATCH (user:User { name: 'Adam' })-[r1:FRIEND]-(friend) 
MATCH (friend)-[r2:FRIEND]->(friend_of_a_friend) 
RETURN friend_of_a_friend.name AS fofName
这是因为第二场比赛没有方向

MATCH (friend)-[r2:FRIEND]-(friend_of_a_friend) 
从佩尼拉开始,它在两个方向上都匹配-[:FRIEND]——虽然它匹配David,但它也把你带回了Adam

如果向下面的第二个匹配添加方向,则只应返回David。虽然佩尼拉有两个朋友关系,一个是从亚当那里来的,另一个是从大卫那里来的

MATCH (user:User { name: 'Adam' })-[r1:FRIEND]-(friend) 
MATCH (friend)-[r2:FRIEND]->(friend_of_a_friend) 
RETURN friend_of_a_friend.name AS fofName

查询中有两个单独的匹配项。第一个找到了亚当的所有朋友,只有一个:佩尼拉

第二个匹配查找该朋友Pernilla的朋友,有两个节点通过以下方式连接:friend Relations:Adam这将遍历最初用于从Adam到Pernilla和David的关系

如果您对此使用了单个匹配项:

MATCH (user:User { name: 'Adam' })-[:FRIEND]-(friend)-[:FRIEND]-(friend_of_a_friend)
RETURN friend_of_a_friend.name AS fofName

那你只能把大卫当作朋友的朋友。原因是因为Cypher的唯一性,即匹配中的每条路径只能遍历一次关系。当存在两个匹配项时,它们之间遍历的关系之间没有限制


这在中有更深入的说明。

查询中有两个单独的匹配项。第一个找到了亚当的所有朋友,只有一个:佩尼拉

第二个匹配查找该朋友Pernilla的朋友,有两个节点通过以下方式连接:friend Relations:Adam这将遍历最初用于从Adam到Pernilla和David的关系

如果您对此使用了单个匹配项:

MATCH (user:User { name: 'Adam' })-[:FRIEND]-(friend)-[:FRIEND]-(friend_of_a_friend)
RETURN friend_of_a_friend.name AS fofName

那你只能把大卫当作朋友的朋友。原因是因为Cypher的唯一性,即匹配中的每条路径只能遍历一次关系。当存在两个匹配项时,它们之间遍历的关系之间没有限制


这一点在中得到了更深入的说明。

这证明了正确理解模式的含义对于形成能够给出正确和预期结果的查询是必要的。 模式可以是单个节点、关系或路径。 你什么时候做的 匹配用户:用户{name:'Adam'}-[r1:FRIEND]-朋友 你在寻找所有的模式,也就是“亚当”的所有朋友,这里的catch是关系不直接的。它应该是无方向的,因为朋友是双向的。当你这样做的时候 匹配朋友-[r2:朋友]-fof 你又在找“亚当”朋友的朋友,没有方向。 “亚当”是他的朋友的朋友。这就是为什么你会在结果中看到“亚当”。 更清楚的是,你不是在寻找亚当的朋友。你正在寻找“亚当”的任何朋友的所有朋友。希望有帮助

如果你不想看《亚当》,你可以做以下任何一项

MATCH (user:User { name: 'Adam' })-[r1:FRIEND]-(friend)-[r2:FRIEND]-(fof)
RETURN fof.name```

或者这个,

MATCH (user:User { name: 'Adam' })-[r1:FRIEND*2]-(fof) RETURN fof.name
我建议浏览一下这些模式文档

这证明了正确理解模式的含义对于形成能够给出正确和预期结果的查询是必要的。 模式可以是单个节点、关系或路径。 你什么时候做的 匹配用户:用户{name:'Adam'}-[r1:FRIEND]-朋友 你在寻找所有的模式,也就是“亚当”的所有朋友,这里的catch是关系不直接的。它应该是无方向的,因为朋友是双向的。当你这样做的时候 匹配朋友-[r2:朋友]-fof 你又在找“亚当”朋友的朋友,没有方向。 “亚当”是他的朋友的朋友。这就是为什么你会在结果中看到“亚当”。 更清楚的是,你不是在寻找亚当的朋友。你正在寻找“亚当”的任何朋友的所有朋友。希望有帮助

如果你不想看《亚当》,你可以做以下任何一项

MATCH (user:User { name: 'Adam' })-[r1:FRIEND]-(friend)-[r2:FRIEND]-(fof)
RETURN fof.name```

或者这个,

MATCH (user:User { name: 'Adam' })-[r1:FRIEND*2]-(fof) RETURN fof.name
我建议浏览一下这些模式文档