使用Cypher或Gremlin可以获得具有遍历成本的最短路径吗?

时间:2013-05-29 11:28:53

标签: neo4j cypher gremlin

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

使用Cypher或Gremlin可以以最短的行程时间获得最短路径吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

有关最短路径的更多信息,请参阅此其他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" && it.loops< 6 }.path - 抓住marko和lop之间的路径。
  • .transform{[it.findAll{it instanceof Edge}.sum{it.weight}, it]} - 将每个路径转换为一个列表,其中第一个值是weight属性的总和,第二个值是路径列表本身。我通过在路径中查找边缘的所有项目,然后将它们的权重值相加来计算路径列表本身的一些groovy的总权重。