【问题标题】:Shortest Paths with Cost Property具有成本属性的最短路径
【发布时间】:2016-10-14 11:37:06
【问题描述】:

我想在我的图表 (Neo4j 3.0.4) 中查找从 A 点到 Z 点的前 5 个(最短)路径。 该图由通过关系“CONNECTED_BY”连接的几个节点组成。此连接具有应最小化的成本属性。

我是从这个开始的:

MATCH p=(from:Stop{stopId:'A'}), (to:Stop{stopUri:'Z'}), 
path = allShortestPaths((from)-[:CONNECTED_TO*]->(to))
WITH REDUCE (total = 0, r in relationships(p) | total + r.cost) as tt, path
RETURN path, tt

这个查询总是返回跳数最少的子图,不考虑成本属性。存在另一个具有更多跳数且总成本较低的子图。我做错了什么?

此外,我真的想获得前 5 个子图。如果我执行这个查询:

MATCH p=(from:Stop{stopUri:'A'})-[r:CONNECTED_TO*10]->(to:Stop{stopUri:'Z'}) RETURN p

我可以看到多条路径,但第一个只返回一条路径。 当然,路径不应包含循环等。

我想通过 REST API 执行这个查询,所以应该使用 REST 调用或 cyhper 查询。

编辑1: 我想将其作为 REST Call 执行,所以我尝试了 dijkstra 算法。这似乎是一个好方法,但我必须通过在关系中添加 3 个不同的成本属性来计算权重。如何实现?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    allShortestPaths 将找到两点之间的最短路径,然后匹配具有相同数量 跳数的每条路径。如果您想根据成本而不是遍历长度来最小化,请尝试以下操作:

    MATCH p=(from:Stop{stopId:'A'}), (to:Stop{stopUri:'Z'}), 
    path = (from)-[:CONNECTED_TO*]->(to)
    WITH REDUCE (total = 0, r in relationships(p) | total + r.cost) as cost, path
    ORDER BY cost
    RETURN path LIMIT 5
    

    【讨论】:

    • 谢谢。是的,我知道这种方式,但这是一个很长的运行查询。而且我不能减少/限制节点之间的关系,因为我真的不知道需要多少。我想将其作为 REST Call 执行,所以我尝试了 dijkstra 算法。这似乎是一个好方法,但我必须通过在关系中添加 3 个不同的成本属性来计算权重。您知道如何使用多个成本属性吗?
    • 啊,还有更重要的。我试过: MATCH p=(from:Stop{stopId:'A'}), (to:Stop{stopId:'Z'}), path = (from)-[:CONNECTED_TO*15]->(to) RETURN path LIMIT 5 通过这种方式,我得到了循环。例如,我得到的路径不是 A -> B -> D -> Z,而是带有循环的路径,如 A -> B -> D -> E -> D -> Z。如果我可以避免循环,这可能是一种解决方法.. .
    猜你喜欢
    • 2015-09-17
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多