我挣扎了几天,找到了找到两个节点之间所有路径(达到最大长度)的方法,同时通过排序将要探索的关系来控制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库函数?
答案 0 :(得分:1)
试试这个:
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