使用cypher检测相当大小的图形中的循环的最佳方法是什么。
我有一个图表,它有大约250000个节点和大约270000个关系,我想在大约10k节点的子图中检测周期并涉及100k关系。我写的密码就像
start
n = node:node_auto_index(some lucene query that returns about 10k nodes)
match
p = n-[:r1|r2|r3*]->n
return p
然而,这并不是非常有效。
有人可以提出更好的方法来做到这一点。
答案 0 :(得分:0)
1)计算未标记的节点
2)没有外向关系的标志节点(叶子)
3)没有传入关系的标志节点(根)
4)如果任何节点被标记为2或3,则返回步骤1
5)如果未标记的节点仍然存在,则至少有一个周期
循环将在未标记的节点集合中 查看具有最少[in | out]边缘的节点可能会有所帮助 如果还有太多的东西无法识别周期
答案 1 :(得分:0)
您当前正在使用的查询将返回每个节点的所有路径。更改为
start
n = node:node_auto_index(some lucene query that returns about 10k nodes)
where (n)-[*]->(n)
return distinct p, n
一旦Neo4j找到给定节点的路径,它将让Neo4j停止。它可能仍然会很慢,但绝对不会那么慢。