13

使用密码在相当大的图中检测循环的最佳方法是什么。

我有一个图,它有大约 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

然而,这并不是非常有效的。

有人可以建议一个更好的方法来做到这一点。

4

2 回答 2

0

您目前使用的查询将返回每个节点的所有路径。将其更改为

start 
      n = node:node_auto_index(some lucene query that returns about 10k nodes)
where (n)-[*]->(n)
return distinct p, n

一旦找到给定节点的路径,就会让 Neo4j 停止。它可能仍然会很慢,但肯定不会那么慢。

于 2018-09-03T06:24:42.643 回答
0

1) 计数未标记的节点
2) 标记没有传出关系的节点(叶子)
3) 标记没有传入关系的节点(根)
4) 如果在 2 或 3 中标记了任何节点,则返回步骤 1

5)如果未标记的节点仍然存在,您至少有 1 个周期

如果仍有太多无法识别循环,则循环将位于未标记节点的集合中,
查看具有最少 [in|out] 边的节点可能会有所帮助

于 2016-08-16T23:22:53.950 回答