Neo4j最短路径在节点之间的应用

4

我需要找到包含特定类型节点的两个节点之间的最短路径。

以下是我的Cypher查询语句:

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个回答

1
这种查询的主要问题在于遍历过程中无法截断路径...只有当路径最终到达E2时,你才会知道该路径无效,因为这是唯一一个可以确定路径中没有:T节点的地方。
我所知道的唯一可能优化的方式是确保所有的扩展都在到达E2时停止,因为当前的查询将找到所有的路径,即使它们超过了E2,因为可能存在一条路径穿过E2,击中一个:T节点,然后最终返回。
不幸的是,这种优化不能用Cypher实现。APOC程序的最新版本(APOC 3.3.0.2适用于Neo4j 3.3.x或APOC 3.2.3.6适用于Neo4j 3.2.x)已经增强了路径扩展程序以处理终端节点,并且我们可以配置扩展以在到达终端节点时终止,因此我们可以停止不必要的扩展(这假设通过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()谓词的无限变长遍历通常不会表现良好,原因如上所述,特别是在不存在此类路径的情况下。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接