在路径匹配上,Cypher 使用的是 关系同构 策略,也就是说,在一次路径匹配中,同一个关系最多返回一次。
这个说法不好理解,用案例来解释如下:
CREATE
(adam:User {name: 'Adam'}),
(pernilla:User {name: 'Pernilla'}),
(david:User {name: 'David'}),
(adam)-[:FRIEND]->(pernilla),
(pernilla)-[:FRIEND]->(david)
得到这样的图结构:
我们来查找朋友的朋友
MATCH (user:User {name: 'Adam'})-[r1:FRIEND]-()-[r2:FRIEND]-(friend_of_a_friend)
RETURN friend_of_a_friend.name AS fofName
返回如下结果
+---------+
| fofName |
+---------+
| "David" |
+---------+
Rows: 1
如果更改查询方式, 分成两个匹配语句
MATCH (user:User {name: 'Adam'})-[r1:FRIEND]-(friend)
MATCH (friend)-[r2:FRIEND]-(friend_of_a_friend)
RETURN friend_of_a_friend.name AS fofName
那么就会返回两个结果
+---------+
| fofName |
+---------+
| "David" |
| "Adam" |
+---------+
Rows: 2
这就是关系同构策略,在一次匹配中,一个关系不会返回两次。
如果更换匹配的写法,用逗号分成两个路径:
MATCH
(user:User {name: 'Adam'})-[r1:FRIEND]-(friend),
(friend)-[r2:FRIEND]-(friend_of_a_friend)
RETURN friend_of_a_friend.name AS fofName
实际上,这仍然是一次匹配模式,关系同构策略依旧生效,所以返回结果仍然是一个结果。
+---------+
| fofName |
+---------+
| "David" |
+---------+
Rows: 1














网友评论