neo4j节点之间的最短路径
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了neo4j节点之间的最短路径相关的知识,希望对你有一定的参考价值。
我必须在两个节点之间找到包含路径中特定类型节点的最短路径。
有以下密码:
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次或更多次跳跃时它会崩溃。
答案
这种查询的主要问题是在遍历期间没有办法截断路径...你只会知道路径最终在E2
结束时无效,因为这是你可以确定的唯一点路径中没有节点是:T节点。
我知道可能优化的唯一方法是确保所有扩展在达到E2
时停止,因为现在的查询将找到所有路径,甚至是那些扩展超过E2
的路径,因为可能存在通过的路径E2
,点击a:T节点,然后最终返回。
不幸的是,Cypher无法完成优化。 APOC程序的最新版本(Neo4j 3.3.x的APOC 3.3.0.2或Neo4j 3.2.x的APOC 3.2.3.6)增强了与终端节点一起使用的路径扩展程序,我们可以将扩展配置为在结束时终止到达节点,所以我们可以停止不必要的扩展(这假设通过E2
然后返回的路径无效)。
MATCH (E1:Entity{seq:"123"}), (E2:Entity{seq:"456"})
CALL apoc.path.expandConfig(E1, {terminatorNodes:[E2]}) YIELD path
WITH path
WHERE any(x in nodes(path) where x:T)
RETURN path
ORDER BY length(path) ASC
LIMIT 1
虽然这可能有所帮助(至少在E2
节点阻止扩展到图的更大部分的情况下),无限制的可变长度遍历没有任何类型的限制和any()
谓词在大多数情况下不会表现良好由于上述原因,特别是在没有这种路径的情况下。
以上是关于neo4j节点之间的最短路径的主要内容,如果未能解决你的问题,请参考以下文章