cypher的关系同构策略

2022-08-19  本文已影响0人  alue

在路径匹配上,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
上一篇 下一篇

猜你喜欢

热点阅读