Neo4j Cypher:Friends*.3查询性能

Neo4j Cypher:Friends*.3查询性能,neo4j,cypher,Neo4j,Cypher,我正在运行一个密码查询,让我所有的朋友都能从一个来源跳到3步之外: MATCH (:Person {id:"768"})-[:KNOWS*1..3]-(friend:Person) WITH DISTINCT friend RETURN count(friend) 查询返回正确的结果,但所用的时间比我预期的要长,因为图中只有10000人。当我分析查询时,我发现VarLengthExpand(All)操作符返回的行数惊人地多(~282k): 似乎VarLengthExpand(All)步骤所做的

我正在运行一个密码查询,让我所有的朋友都能从一个来源跳到3步之外:

MATCH (:Person {id:"768"})-[:KNOWS*1..3]-(friend:Person)
WITH DISTINCT friend
RETURN count(friend)
查询返回正确的结果,但所用的时间比我预期的要长,因为图中只有10000人。当我分析查询时,我发现
VarLengthExpand(All)
操作符返回的行数惊人地多(~282k):

似乎
VarLengthExpand(All)
步骤所做的工作超出了需要。为了验证这一点,我查看了每个最小距离处的节点数,以及事件数
知道与这些节点的关系:

----------------------------------------------------
| min. dist. from src: | 0  | 1    | 2      | 3    |
|----------------------|----|------|--------|------|
| nodes                | 1  | 12   | 2815   | 6270 |
| incident knows rels  | 12 | 3697 | 164828 |      |
----------------------------------------------------
所以我们看到节点768有12个直接好友、2815个好友的好友和6270个好友的好友。friends of friends组有164828个incident
KNOWS
关系,在这些关系所接触的所有节点中,6270个节点与源节点的最小距离为3

因此,如果遍历从源以广度优先的搜索方式进行。。。理论上,它只需要执行~12+3697+164828=168537次读取,这比282k少得多


有人知道这里发生了什么吗,以及是否有更好的方法来表述此查询?

请显示用于生成最小距离结果的查询。@ellitron您没有尝试在查询中使用方向关系?请显示用于生成最小距离结果的查询。@ellitron您没有尝试使用方向关系在查询中?
----------------------------------------------------
| min. dist. from src: | 0  | 1    | 2      | 3    |
|----------------------|----|------|--------|------|
| nodes                | 1  | 12   | 2815   | 6270 |
| incident knows rels  | 12 | 3697 | 164828 |      |
----------------------------------------------------