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子句只有一个具有两个路径的模式,而之前的查询则有两个不同的模式。