neo4j节点之间的最短路径

时间:2018-01-29 12:20:41

标签: neo4j cypher shortest-path

我必须找到两个节点之间的最短路径,其中包含路径中特定类型的节点。

有以下密码:

Match p = shortestpath((E1:Entity{seq:"123"}) –[*]-(E2:Entity{seq:"456"})))
Where any(x in nodes(path) where x:T)
Return path

T:标签,可以是数百万个节点 dbgraph大小:4gb

问题是它只在跳数限制为5时才有效,这还不够。

有关如何重写此优化的任何想法?当6次或更多次跳跃时,它会崩溃。

1 个答案:

答案 0 :(得分:0)

这种查询的主要问题是在遍历期间无法截断路径...您只知道当路径最终以{结尾时该路径无效时{1}},因为这是唯一可以确定路径中没有节点是:T节点的点。

我知道可以优化一点的唯一方法是确保在达到E2时所有扩展都停止,因为现在的查询将找到所有路径,即使是那些扩展超过{{1}的路径因为可能有一条路径经过E2,命中一个:T节点,然后最终返回。

不幸的是,Cypher无法进行优化。 APOC程序的最新版本(Neo4j 3.3.x的APOC 3.3.0.2或Neo4j 3.2.x的APOC 3.2.3.6)增强了与终端节点一起使用的路径扩展程序,我们可以将扩展配置为在结束时终止到达了节点,因此我们可以停止不必要的扩展(假设通过E2然后返回的路径无效)。

E2

虽然这可能有所帮助(至少在E2节点阻止扩展到图形的更大部分的情况下),无限制的可变长度遍历没有对类型和{{1}的任何限制由于上述原因,谓词在大多数情况下表现不佳,特别是在没有这种路径的情况下。