0

我一直在努力寻找一种方法来找到两个节点之间的所有路径(最大长度),同时通过对将要探索的关系(通过它们的一个属性)进行排序来控制 Neo4j 的路径探索。

为了清楚起见,假设我想在两个节点之间找到 K 条最佳路径,直到最大长度为 M。查询将如下所示:

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

到目前为止,一切都很好。但是可以说路径的关系有一个称为“优先级”的属性。我想要的是编写一个查询,告诉 Neo4j 在路径探索的每个步骤中应该首先探索哪些关系。

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

有没有办法在服务器模式下做到这一点?或者在服务器模式下访问图形时使用 Java 库函数?

4

2 回答 2

1
  1. 使用标签和索引来找到你的两个起始节点
  2. 也许考虑 allShortestPaths 让它更快

尝试这个:

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;
于 2016-06-25T16:28:41.660 回答
0

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

Graph DBs 能否在未指定的端节点上表现良好?向我指出了解决方案:Single Shortest Path算法。

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

于 2020-11-26T10:03:41.747 回答