如何通过 Java 访问 Gremlin 中路径的顶点?

How to access the vertices of a path in Gremlin through Java?

我正在使用 Java 访问 Gremlin。我有以下代码行用于在已创建的图中的两个顶点之间创建路径:

//begin simple path finding
        Vertex fromNode = g.V().has("name", "i2").next();
        Vertex toNode = g.V().has("name", "state1").next();
        ArrayList list = new ArrayList();
        g.V(fromNode).repeat(both().simplePath()).until(is(toNode)).limit(1).path().fill(list);

然而,在这一点上我被卡住了。我可以使用 list.toString() 打印列表,我得到(我相信)在路径上的顶点。但是,我现在想自己获取这些顶点,访问并可能改变它们的数据。例如,如果我无法访问 ID 32 本身,则仅知道 v[32] 在路径上是不够的。

我应该提一下,我对此有点陌生,所以如果我正在使用 outdated/incorrect 实践,请告诉我。

您应该可以通过在 fill 步骤中使用的列表访问这些内容。 toString 方法不会打印出属性。如果您只想查看这些,您可以在遍历结束时调用 valueMap() 而不是 fill。如果您想遍历所有顶点并获取属性,可以使用 properties 方法。如果想得到具体的属性,可以使用property(key)的方法。您需要的其余内容在 the API docs

您最终得到了一个包含 Path 个对象的列表。我认为您正在寻找的是 unfold() 步骤 (see the docs) 因此您可以 unroll/flatten 出 路径 中的元素以放入列表。这是显示它的 Gremlin 控制台会话:

gremlin> graph = TinkerGraph.open()
==>tinkergraph[vertices:0 edges:0]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.addV("name", "i2").as("a").addV("name", "state1").addE("to").from("a").toList()
==>e[4][0-to->2]
gremlin> fromNode = g.V().has("name", "i2").next()
==>v[0]
gremlin> toNode = g.V().has("name", "state1").next()
==>v[2]
gremlin> l = new ArrayList()
gremlin> g.V(fromNode).repeat(both().simplePath()).until(is(toNode)).limit(1).path().fill(l)
==>[v[0],v[2]]
gremlin> l = []; g.V(fromNode).repeat(both().simplePath()).until(is(toNode)).limit(1).path().fill(l)
==>[v[0],v[2]]
gremlin> l = []; g.V(fromNode).repeat(both().simplePath()).until(is(toNode)).limit(1).path().unfold().fill(l)
==>v[0]
==>v[2]
gremlin> l[0].getClass()
==>class org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerVertex
gremlin> l[0].property("name", "j3") // mutate the vertex's name
==>vp[name->i3]
gremlin> g.V(fromNode).valueMap(true).toList()
==>[id:0,name:[j3],label:vertex]