【问题标题】:neo4j Alternative pathneo4j 替代路径
【发布时间】:2014-05-01 11:09:45
【问题描述】:

我正在做一个简单的路由软件,实现“好产品”的经典需求是为客户提供不同的路径。

我正在使用密码,但据我所知,这是无法实现的。我只能找到我的图表的“allShortestPath”,而不是“几乎最短的”。

我的想法是多次执行 dijkstra 在前一条路径的第一条上添加一些权重,因此它“可能”会查看另一条路径。问题是我不知道如何让 cypher 在我的图表上评估临时权重。

我什至可以考虑使用neo4j的java api创建一个自定义插件,我可以直接将dijkstra算法与权重评估器一起使用,但我认为我无法获得所有可能的路径,但只有一个

提前感谢您的任何建议

【问题讨论】:

    标签: java neo4j cypher


    【解决方案1】:

    如何获得最短路径的长度,然后向 neo4j 询问该长度+1 的路径。

    也许这对你有用:

    START n1=node(167), n2=node(169) MATCH p = (n1)-[*..3]-(n2) WHERE length(p) = length(shortestPath((n1)-[]-(n2)))+1 RETURN p
    

    您可能希望限制最大路径长度。

    【讨论】:

    • START n1=node:users (name = "n1"), n2=node:users (name = "n13") MATCH p = (n1)-[length(shortestPath(( n1)-[]-(n2))) + 1]-(n2) RETURN p 我不知道问题所在。响应:无效输入“l”:预期的空格、RangeLiteral、属性映射或“]”(第 2 行,第 18 列)“MATCH p = (n1)-[length(shortestPath((n1)-[ i>]-(n2))) + 1]-(n2)" ^
    • 看来你不能使用变量作为路径长度。
    • 看来我什至不能使用变量.. 我刚开始使用 neo4j,并尝试使用 match l = length(shortest(....)) 但我没有成功,你有任何如何使用变量的例子吗?
    • 尝试答案中的(新)示例。它至少在语法上是正确的,我认为你想要@rodi
    • 您是否将路径长度限制在合理范围内。我再次更改了示例,并在 Matrix 示例图上对其进行了测试。它现在完全符合您的要求。
    【解决方案2】:

    允许dijkstra返回多条路径的工作正在进行中,目前它返回所有最短路径。

    START n1=node(167), n2=node(169) 
    MATCH p=shortestPath((n1)-[]-(n2))
    WITH n1,n2,length(p)+1 as almost_shortest
    MATCH p = (n1)-[*..3]-(n2) 
    WHERE length(p) = almost_shortest 
    RETURN p
    

    我仍然最好使用修改后的 dijkstra 或其他为您提供路径数量的寻路算法。

    使用 traversal-description 或 bidirectional-traversal-description 和自定义 PathEvaluators / PathExpander,您可以构建任何您想要的东西。

    【讨论】:

      猜你喜欢
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多