唯一性
在模式匹配时,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
子句有一个带有两条路径的单个模式,而前一个查询有两个不同的模式。
此页面有帮助吗?