提问者:小点点

使用neo4j 3.1.0版本查找最长路径的Cypher查询


任何人都可以使用neo4j 3.1.0版本发送Cypher查询以查找两个节点之间的最长路径。


共2个答案

匿名用户

没有实现寻找最长路径的图算法。

这是一个Cypher查询,它获取所有路径并按大小对其进行排序:

// get the nodes
MATCH (a:Node), (b:Node)
WHERE ID(a) = 14 AND ID(b) = 7
WITH a,b
// match all paths
MATCH p=(a)-[*]-(b)
// return the longest
RETURN p, length(p) ORDER BY length(p) DESC LIMIT 1

但是,如果对查询没有任何限制,这可能不适用于大图。在无向图中找到最长路径的成本很高:https://en.wikipedia.org/wiki/Longest_path_problem

并且在没有对查询(方向和关系类型)的限制的情况下,查询将查找所有无向路径。

您应该限制路径查询,或者尝试在没有最长路径的情况下解决问题。

匿名用户

如果您正在寻找链中每个节点与下一个节点具有相同关系的节点之间的最长路径,请参阅使用Cypher实现long estPath,它显示:

MATCH p=(parent:Entity)-[:HAS_CHILD*1..10]->(child:Person)
WHERE size((child)-[:HAS_CHILD]->()) = 0
RETURN child;

但是我正在使用:

MATCH (parent:Entity)-[:HAS_CHILD*1..10]->(child:Person)
WHERE NOT (child)-[r:HAS_CHILD]->()
RETURN child;

如果有人可以评论性能或任何其他方面,请这样做!

我还发现了一个未记录的功能,它将在子节点也是父节点时返回子节点(仅在一个节点中):

MATCH (parent:Entity)-[:HAS_CHILD*0..]->(child:Person)
WHERE NOT (child)-[r:HAS_CHILD]->()
RETURN child;