【问题标题】:Remote Gremlin Server graph mutation with Java / Scala使用 Java / Scala 的远程 Gremlin 服务器图形变异
【发布时间】:2017-06-20 12:46:25
【问题描述】:

我正在尝试使用遍历在远程 Gremlin 服务器上修改顶点,但似乎只有在创建顶点的遍历中我还可以添加属性,在开始新的遍历时我不会添加属性。

Scala/Java 集群连接设置代码:

val mapper = GryoMapper.build()
val cluster = Cluster.build().serializer(new GryoMessageSerializerV1d0(mapper)).create
val client = cluster.connect[org.apache.tinkerpop.gremlin.driver.Client.ClusteredClient]()
val graph = EmptyGraph.instance()
val g = graph.traversal().withRemote(DriverRemoteConnection.using(cluster, "g"))

这行得通:

val v1 = g.addV("person").property("name","stephen").next()

这不是:

g.V(v1.id()).property("age","27")

这也不会,甚至会抛出 java.lang.IllegalStateException (propertyAdditionNotSupported),因为顶点是 org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertex:

v1.property("age","27")

如果我使用 Gremlin 控制台并远程连接到 Gremlin 服务器,我都可以毫无问题地进行。

:remote connect tinkerpop.server conf/remote.yaml
gremlin> :> g.addV('person').property('name','stephen')
==>v[82128]
gremlin> :> g.V(82128).property('age','27')
==>v[82128]
gremlin> :> g.V(82128).valueMap()
==>[name:[stephen],age:[27]]

Java 远程实现有问题还是我遗漏了什么?

【问题讨论】:

  • 找到了解决办法,只好在遍历后面加上.iterate(),还在想明白为什么……

标签: java server gremlin tinkerpop


【解决方案1】:

我不确定您使用的是什么 Graph 实现,但这适用于 TinkerGraph:

gremlin> graph = EmptyGraph.instance()
==>emptygraph[empty]
gremlin> cluster = Cluster.open()
==>localhost/127.0.0.1:8182
gremlin>  g = graph.traversal().withRemote(DriverRemoteConnection.using(cluster, "g"))
==>graphtraversalsource[emptygraph[empty], standard]
gremlin> v = g.addV().property('name','stephen').next()
==>v[0]
gremlin> g.V(v.id()).property('favorite','red')
==>v[0]
gremlin> g.V().valueMap()
==>[name:[stephen],favorite:[red]]

我会注意到,在您的情况下,您不会 next() 从以下位置取出顶点:

val v1 = g.addV("person").property("name","stephen")

我认为即使在 Gremlin Scala 语法中你也应该这样做:

val v1 = g.addV("person").property("name","stephen").next()

否则v1 将只是一个Traversal 实例,您将获得Traversalid() 而不是Vertex。所以我认为这应该可以解决你的问题。

请注意,v1.property("age","27") 将由于您解释的原因不起作用 - 顶点是“分离的”,您不能直接使用它,除非将其传递回另一个遍历。您还应该能够在大多数图表上执行此操作:

gremlin> g.V(v).property('favorite','red')
==>v[0]

不引用id()

【讨论】:

  • 感谢您的回复。我使用了正确的顶点 ID,但去掉了一些替代的 Scala 代码(我编辑了我的原始问题并添加了 .next())。您的示例来自我假设的 Gremlin 控制台,并且有效,我也可以在 Gremlin 控制台中执行此操作。但是来自 Scala/Java 程序的远程连接不允许我修改现有顶点。我尝试了 TinkerGraph 和 JanusGraph,两者都不起作用,所以我认为它在 Java 实现中..
【解决方案2】:

您需要确保iterate the traversal。斯蒂芬的回答提到了这一点。 Gremlin 控制台会自动迭代遍历,否则您必须自己显式执行此操作。

  • iterate() 得到零结果
  • next()得到一个结果
  • toList() 得到很多结果

本教程也是结果迭代的好读物http://tinkerpop.apache.org/docs/current/tutorials/the-gremlin-console/#result-iteration

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 2018-11-29
    • 2014-07-10
    • 2017-11-30
    • 1970-01-01
    • 2019-03-04
    • 2016-01-21
    相关资源
    最近更新 更多