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

时间:2017-01-23 11:50:14

标签: neo4j cypher

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

2 个答案:

答案 0 :(得分:4)

未实现找到最长路径的图算法。

这是一个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

对查询(方向和关系类型)没有限制,查询将查找所有无向路径。

您应该限制路径查询,或尝试两个解决问题而不使用最长路径。

答案 1 :(得分:0)

如果您正在寻找链中每个节点与下一个节点具有相同关系的节点之间的最长路径,请参阅Achieving longestPath Using Cypher,其中显示:

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;