Neo4j 在图中寻找最长路径

Neo4j 在图中寻找最长路径,neo4j,cypher,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将继续运行以获得答案,我还

我一直在努力寻找复杂网络中最长的路径。我在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云托管中执行它。我甚至在那里也没有找到任何解决方案,但出现了一个错误 “错误未定义未定义”
我急需一个解决办法。这个答案的结果将帮助我完成我的项目。所以,请大家帮我纠正这个问题。

好吧,首先,你要做两次非常昂贵的操作,而你只需要做一次

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

我们也可以通过只在路径头上的节点上执行最长路径匹配,而不是在中间的某个地方来改进匹配。

也许试试这个

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

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

如果您有一个加权图,则可以通过对所有边权重求反,并在修改后的图上运行最短加权路径算法来查找两个节点之间的最长路径。但是,如果您想在整个图中找到最长路径,则可以有效地尝试使用-ve边权重来求解。你不能用Cypher那样做


如果你的图是未加权的,我会找到一个更容易的问题,或者看看你是否可以将你的图转换成加权图,并按照上面的描述处理它。或者,看看您是否能够以一种不需要找到最长路径的方式来构建您的需求

我不完全确定你在做你认为你在做的事情。对于每个节点n,该查询查找从每个n到某个节点m的最长路径。您的输出将是整个数据库中每个节点的一条路径及其长度。对于任何中等到大型数据库来说,这都是一个极端的查询。这真的是你想要的,还是你只有一个最大的路径在你的整个数据库?我想考虑完整的图表。我想返回最长路径的原因是,它还回答了5个问题。1.路径2的长度。检查源节点是否存在3。相邻节点受源节点影响的概率。4.影响5所需的时间。要隔离的最佳节点,以防止进一步传播。我可以通过邮件与您联系吗?求你了。在我的图中,所有边的公共权重都是1。那么,我应该考虑还是避免使用它?只要每个边权值是非零的,就可以在任意2个节点之间找到最短路径。但是,如果你想解决TSP问题(我想你是这样做的),最短路径算法是没有帮助的。请看一下Bellman Hard Karp算法。