graph - 如何从 Gremlin 调用 neo4j GraphAlgoFactory aStar 算法?

标签 graph neo4j dijkstra a-star gremlin

我是一名编码技能一般的数据科学家,所以直到现在在使用 neo4j 时,我一直避免使用 java,而是使用 Cypher 和 Gremlin。

我已经将一堆图形数据推送到 neo4j 中,每条边上都有一个权重属性。如果可能的话,我想从 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 不理解蓝图。

关于graph - 如何从 Gremlin 调用 neo4j GraphAlgoFactory aStar 算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11675980/

相关文章:

java - 密集和稀疏运行时间

c - 带有空指针的图表的奇怪输出

javascript - 如何配置 flot 以在零点的 y 轴上绘制缺失的时间序列?

java - 在 java 中创建 Neo4j 关系时出错

neo4j - 使用 Cypher 向现有节点添加标签

通过 Dijkstra 算法从每个节点作为源计算到所有节点的最短路径时,Java 内存不足堆错误

c++ - 在五个节点的图上应用 Dijkstra 算法

excel - 如何使用matlab清除excel中的现有图形?

java - Neo4j 控制台无法启动

algorithm - 使用 Dijkstra 算法查找哈密顿路径?