我是一名具有中等编码技能的数据科学家,所以直到现在与neo4j一起工作,我都避免使用Java来支持Cypher和Gremlin。
我已经将一堆图形数据推送到neo4j中,每条边上都具有weight属性。如果可能,我想在这张图上从gremlin控制台中运行aStar或dijkstra。 JUNG似乎没有加权最短路径算法,因此我转向了GraphAlgoFactory,但在线对其进行的所有讨论似乎都在使用纯Java语言。
我的目标是在选择的两个顶点之间获得最短的加权路径,其中权重由边缘上的权重属性决定。
谢谢!
最佳答案
我将为您提供一个示例,以此作为探索您自己的图的起点。首先启动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);
由于控制台中的Gremlin版本在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无法理解蓝图。