Neo4j Cypher:Friends*.3查询性能
我正在运行一个密码查询,让我所有的朋友都能从一个来源跳到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)步骤所做的
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个incidentKNOWS
关系,在这些关系所接触的所有节点中,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 | |
----------------------------------------------------