2013-05-29 26 views
1

我知道通過使用Cypher和Gremlin可以獲得最小節點數量的最短路徑嗎?如何獲得最小遍歷成本的路徑?我能想到的一個例子就是公交線路。一些路線可能有較少的巴士站(節點),但需要較長的時間(成本)從一個站到另一個站,有些則相反。使用Cypher或Gremlin可以通過遍歷成本獲得最短路徑嗎?

是否有可能通過使用Cypher或Gremlin以最短的旅行時間獲得最短路徑?

回答

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 

然後計算出的「成本」馬爾科和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屬性的總和,第二個值是路徑列表本身。我通過在路徑列表中找到一些常規的總重量,找到路徑中所有邊緣的項目,然後總結它們的權重值。
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,甚至小鬼/ Groovy的管道像這樣的東西:

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