唯一性
在模式匹配时,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 确保不返回模式关系r1
和r2
指向相同图关系的匹配项。
但是,这并不总是我们想要的。如果查询应返回用户,则可以将匹配分散到多个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
子句只有一个具有两个路径的模式,而之前的查询则有两个不同的模式。
此页面是否有帮助?