使用cypher检测neo4j属性图中的循环

时间:2013-04-12 00:51:13

标签: graph neo4j cycle cypher

使用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

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

有人可以提出更好的方法来做到这一点。

2 个答案:

答案 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停止。它可能仍然会很慢,但绝对不会那么慢。