如何通过 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]
我正在使用 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]