Neo4j Cypher找到探索排序关系的所有路径

时间:2016-06-25 13:19:16

标签: neo4j cypher shortest-path neo4j-java-api neo4j-bolt

我挣扎了几天,找到了找到两个节点之间所有路径(达到最大长度)的方法,同时通过排序将要探索的关系来控制Neo4j的路径探索(由他们之一属性)。

所以要清楚,假设我想在两个节点之间找到K个最佳路径,直到最大长度为M.查询将如下:

match (source{name:"source"}), (target{name:"target"}),
p = (source)-[*..M]->(target)
return p order by length(p) limit K;

到目前为止一切顺利。但是我们可以说路径的关系有一个名为" priority"的属性。我想要的是编写一个查询,告诉Neo4j在路径探索的每个步骤中应该首先探索哪些关系。

我知道当我使用java库和嵌入式数据库时可以实现(通过实现PathExpander接口并将其作为Java的GraphAlgoFactory.allSimplePaths()函数的输入)。 但是现在我试图在使用Bolt或REST api的服务器模式数据库访问中找到一种方法。

有没有办法在服务器模式下执行此操作?或者在服务器模式下访问图表时可能使用Java库函数?

2 个答案:

答案 0 :(得分:1)

  1. 使用标签和索引查找两个起始节点
  2. 或许考虑allShortestPaths以使其更快
  3. 试试这个:

    match (source{name:"source"}), (target{name:"target"}),
    p = (source)-[rels:*..20]->(target)
    return p, reduce(prio=0, r IN rels | prio + r.priority) as priority 
    order by priority ASC, length(p) 
    limit 100;
    

答案 1 :(得分:0)

我有一个非常相似的问题。我试图找到从一个节点到所有其他节点的最短路径。我已经写了与上述答案(https://stackoverflow.com/a/38030536/783836)中的查询类似的查询,并且无法在任何合理的时间执行该查询。

Can Graph DBs perform well with unspecified end nodes?向我指出了解决方案:Single Shortest Path算法。

在Neo4j中,您需要安装Graph Data Science Library并使用此功能:gds.alpha.shortestPath.deltaStepping.stream