【问题标题】:Is it possible to get the shortest path with traversal cost by using Cypher or Gremlin?是否可以通过使用 Cypher 或 Gremlin 获得具有遍历成本的最短路径?
【发布时间】:2013-05-29 11:28:52
【问题描述】:

我知道使用 Cypher 和 Gremlin 可以获得最少节点数的最短路径吗?如何获得具有最小遍历成本的路径?我能想到的例子之一是公交路线。有些路线可能有较少的公交车站(节点),但需要较长的时间(成本)从一个站点行驶到另一个站点,有些则相反。

是否有可能通过使用 Cypher 或 Gremlin 获得最短旅行时间的最短路径?

【问题讨论】:

    标签: neo4j cypher gremlin


    【解决方案1】:

    有关最短路径的更多信息,请参阅其他 question。不过,在回答这个特定问题时,在计算路径成本时,我首先更改了 toy graph 以使其来自 marko to josh to lop 的权重比 marko to lop 便宜:

    gremlin> g = TinkerGraphFactory.createTinkerGraph()
    ==>tinkergraph[vertices:6 edges:6]
    gremlin> g.e(8).weight = 0.1f
    ==>0.1
    gremlin> g.e(11).weight = 0.1f                                                        
    ==>0.1
    

    然后计算marko和lop之间路径的“成本”:

    gremlin> g.v(1).outE.inV.loop(2){it.object.id!="3" && it.loops< 6 }.path.transform{[it.findAll{it instanceof Edge}.sum{it.weight}, it]}
    ==>[0.4, [v[1], e[9][1-created->3], v[3]]]
    ==>[0.20000000298023224, [v[1], e[8][1-knows->4], v[4], e[11][4-created->3], v[3]]]
    

    因此请注意,路径长度 3 到 marko to josh to lopmarko to lop 便宜。无论如何,gremlin 基本上都会说:

    • g.v(1).outE.inV.loop(2){it.object.id!="3" &amp;&amp; it.loops&lt; 6 }.path - 抓取 marko 和 lop 之间的路径。
    • .transform{[it.findAll{it instanceof Edge}.sum{it.weight}, it]} - 将每个路径转换为一个列表,其中第一个值是 weight 属性的总和,第二个值是路径列表本身。我通过查找路径中所有作为边缘的项目,然后对它们的权重值求和,来计算路径列表本身的总权重。

    【讨论】:

      【解决方案2】:

      你可以看看并使用这个:

      http://components.neo4j.org/neo4j-graph-algo/stable/apidocs/org/neo4j/graphalgo/GraphAlgoFactory.html#dijkstra(org.neo4j.graphdb.RelationshipExpander, org.neo4j.graphalgo.CostEvaluator)


      这里有一些测试显示了您可能可以使用的其他内置算法。

      https://github.com/neo4j/neo4j/tree/master/community/graph-algo/src/test/java/org/neo4j/graphalgo/shortestpath


      要推出自己的算法,您可以调用 neo4j java api 甚至 gremlin/groovy 管道,如下所示:

      http://neo4j-contrib.github.io/gremlin-plugin/#rest-api-send-an-arbitrary-groovy-script---lucene-sorting

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多