GraphGists

在模式匹配时,Neo4j确保不包含同一图关系在单个模式中被多次匹配的情况。在大多数用例中,这样做是合理的。

示例:查找用户的“朋友的朋友”时不应返回该用户本身。

我们来创建一些节点和关系

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

这给了我们下面的图

现在我们来查找Adam的“朋友的朋友”

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

在此查询中,Cypher确保不返回模式关系r1r2指向同一图关系的情况。

然而,这并非总是期望的行为。如果查询应该返回用户本身,可以将匹配分散到多个MATCH子句中,例如这样

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 (user:User {name: 'Adam'})-[r1:FRIEND]-(friend),
      (friend)-[r2:FRIEND]-(friend_of_a_friend)
RETURN friend_of_a_friend.name AS fofName

在这里,MATCH子句有一个带有两条路径的单个模式,而前一个查询有两个不同的模式。