使用neo4j 3.1.0版本进行密码查询以查找最长路径

使用neo4j 3.1.0版本进行密码查询以查找最长路径,neo4j,cypher,Neo4j,Cypher,任何人都可以使用neo4j 3.1.0版本发送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

任何人都可以使用neo4j 3.1.0版本发送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
但是,如果对查询没有任何限制,这可能不适用于大型图。在无向图中查找最长路径的成本很高:

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


您应该限制路径查询或尝试两种方法来解决问题,但不使用最长路径。

如果要查找链中每个节点与下一个节点具有相同关系的节点之间的最长路径,请查看以下显示:

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(父:实体)-[:HAS_CHILD*0..]>(CHILD:Person)工作得非常好
MATCH (parent:Entity)-[:HAS_CHILD*0..]->(child:Person)
WHERE NOT (child)-[r:HAS_CHILD]->()
RETURN child;