2012-07-26 22 views
3

我與平庸的編碼技術數據科學家,所以直到現在與Neo4j的工作,我一直避免java的支持Cypher和小鬼的。如何從Gremlin調用neo4j GraphAlgoFactory aStar算法?

我猛一串圖形數據的進入的Neo4j與每個邊緣的權重屬性。如果可能的話,我想在gremlin控制檯內運行aStar或dijkstra的圖形。 JUNG似乎沒有加權最短路徑算法,所以我轉向了GraphAlgoFactory,但在線討論似乎都是直接使用Java。

我的目標是讓我選擇的兩個頂點,其中權重由邊緣上的重性決定之間的最短路徑加權。

謝謝!

回答

3

我給你的使用爲出發點,探索自己的圖形的例子。通過發射了Gremlin和定義一個實用的方法來創建邊緣開始:

def edge(Graph g, Vertex v1, Vertex v2, int weight) { 
    e = g.addEdge(null, v1, v2, "connects"); 
    e.setProperty("weight", weight); 
} 

現在創建一個簡單的圖形與4個節點和4個邊緣:由於精怪的控制檯版本上運行

g = new Neo4jGraph("/tmp/dijkstra") 
v1 = g.addVertex(1); 
v2 = g.addVertex(2); 
v3 = g.addVertex(3); 
v4 = g.addVertex(4); 

edge(g, v1, v2, 13); 
edge(g, v1, v4, 20); 
edge(g, v2, v3, 3); 
edge(g, v4, v3, 40); 

Groovy,你可以混合和匹配Groovy和Java無縫地使用GraphAlgoFactory:

import org.neo4j.graphalgo.GraphAlgoFactory; 
import org.neo4j.graphalgo.CommonEvaluators; 
import org.neo4j.kernel.Traversal; 

dijkstra = GraphAlgoFactory.dijkstra(Traversal.expanderForAllTypes(), CommonEvaluators.doubleCostEvaluator("weight")) 
path = dijkstra.findSinglePath(((Neo4jVertex)v1).getRawVertex(), ((Neo4jVertex)v3).getRawVertex()) 
println path 
// (1)--[connects,0]-->(2)--[connects,2]-->(3) weight:16.0 

使用GraphAlgoFactory的代碼主要來自來自Neo4j documentation。唯一的區別是您需要將每個Blueprints Vertex轉換爲org.neo4j.graphdb.Node,因爲GraphAlgoFactory不理解Blueprints。

+0

太棒了。謝謝你,先生。 – John 2012-07-27 14:08:09

+1

您也可以使用這種形式的Neo4j REST,看到http://docs.neo4j.org/chunked/snapshot/gremlin-plugin.html#rest-api-send-an-arbitrary-groovy-script---lucene-sorting – 2012-07-28 13:17:51