【问题标题】:Neo4j Cypher find all paths exploring sorted relationshipsNeo4j Cypher 找到探索排序关系的所有路径
【发布时间】:2016-06-25 13:19:16
【问题描述】:

我几天来一直在努力寻找一种方法来找到两个节点之间的所有路径(最大长度),同时通过对将要探索的关系(通过它们的一个属性)进行排序来控制 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 库函数?

【问题讨论】:

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


【解决方案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;

【讨论】:

  • 恐怕这并不完全符合我的要求,事实上,通过对关系进行排序,我想将遍历指向目标,从而提高性能。这不是这个查询所做的。实际上,我想要的是在具有良好性能的大图中找到最佳 K 路径(不一定是最短路径),但是当我运行问题中所写的查询时,我会等待很长时间。
【解决方案2】:

我有一个非常相似的问题。我试图找到从一个节点到所有其他节点的最短路径。我写了一个类似于上述答案 (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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 2020-01-13
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    相关资源
    最近更新 更多