在图表中查找最长路径

时间:2017-01-22 10:00:28

标签: neo4j cypher

我一直在努力寻找复杂网络中最长的路径。我在StackOverflow和Internet上遇到过很多问题,但没有人可以帮助我。我写了一个CQL作为

start n=node(*)
match p = (n)-[:LinkTo*1..]->(m)
with n,MAX(length(p)) as L
match p = (n)-[:LinkTo*1..]->(m)
where length(p) = L
return p,L

我没有得到任何解决方案。 Neo4J会一直在寻找答案,我也尝试在Neo4J Cloud Hosting中执行它。我没有任何解决方案,但有一个错误 “错误未定义 - 未定义” 我迫切需要一个解决方案。这个答案的结果将帮助我完成我的项目。所以,有人请帮我纠正查询。

2 个答案:

答案 0 :(得分:6)

对于一个人来说,只需要做一次非常昂贵的操作。

此外,您至少会为数据库中的每个节点返回一个路径(因为可能存在多个路径,这些路径是该节点可用的最长路径)。但是从你的问题来看,你似乎想要图中的单个最大路径,而不是每个节点都有一条路径。

我们还可以通过仅在路径头部的节点上执行最长路径匹配来改进匹配,而不是在中间的某个位置。

也许试试这个?

match (n)
where (n)-[:LinkTo]->() and not ()-[:LinkTo]->(n)
match p = (n)-[:LinkTo*1..]->(m)
return p, length(p) as L
order by L desc
limit 1

答案 1 :(得分:5)

你要解决的问题是NP难。在小型稀疏图上,蛮力方法(如InverseFalcon建议的方法)可能在合理的时间内成功,但在任何合理的大型和/或密集连接图上,您将很快遇到时间和空间问题。

如果您有加权图,则可以通过否定所有边权重,并在修改后的图上运行最短加权路径算法,找到2个节点之间的最长路径。但是,如果要在整个图形中找到最长路径,则有效地尝试求解Travelling Salesman Problem,但使用-ve边权重。你不能用Cypher做到这一点。

如果您的图表未加权,我会发现一个更简单的问题,或者看看您是否可以将图表转换为加权图并按上述方法处理。或者,看看您是否能够以不需要找到最长路径的方式构建您的需求。