【问题标题】:How to access the vertices of a path in Gremlin through Java?如何通过 Java 访问 Gremlin 中路径的顶点?
【发布时间】:2017-07-28 12:33:20
【问题描述】:

我正在使用 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] 在路径上是不够的。

我应该提一下,我对此有点陌生,所以如果我使用过时/不正确的做法,请告诉我。

【问题讨论】:

    标签: gremlin


    【解决方案1】:

    您最终得到了一个包含Path 对象的列表。我认为您正在寻找的是 unfold() 步骤 (see the docs),因此您可以展开/展平 路径中的元素以放入列表中。这是显示它的 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]
    

    【讨论】:

    • fill(l) 在 gremlin 控制台中不起作用。对my question that is similar to this post 有什么建议吗??? 无法设置只读属性:类列表:org.apache.tinkerpop.gremlin.structure.VertexProperty$Cardinality
    • 在 Gremlin 控制台中运行时,list 是从org.apache.tinkerpop.gremlin.structure.VertexProperty$Cardinality 静态导入的,因此不能将其用作变量名。这就是为什么在我上面的示例中使用l 而不是list。如果您尝试执行list = []list = new ArrayList(),则会显示您提到的错误消息。
    【解决方案2】:

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

    【讨论】:

    • 我有点困惑,我害怕。在最后一步中,我填写了一份清单。但是它用什么填充了?顶点?另一方面,如果我调用valueMap(),返回的数据类型是什么?
    • 是的。它充满了
    • 抱歉,我想我仍然缺少一些东西。在最后一步,如果我打印出 list.get(0) 的类,它会给我 ImmutablePath。但是,我似乎无法在该路径上执行任何操作,因为 Java 确信它只是一个对象。我显然错过了一些重要的东西......
    • 嗯,看来我不得不做一个可怕的演员表:`System.out.println(((Vertex)((ImmutablePath)list.get(0)).get(0)).value ("name"));` 那……看起来不太对
    • 也许将您的 ArrayList 声明为 ArrayList<Vertex>?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    相关资源
    最近更新 更多