使用Java / Scala进行远程Gremlin Server图变形

时间:2017-06-20 12:46:25

标签: java server gremlin tinkerpop

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

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远程实现是否有问题,或者我遗漏了什么?

2 个答案:

答案 0 :(得分:2)

我不确定您使用的是哪种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个实例,您获得id()的{​​{1}}而不是Traversal。所以我认为应该解决你的问题。

请注意Vertex因您解释的原因不起作用 - 该顶点是"分离的"你不能直接使用它,除非把它传回另一个遍历。您还应该能够在大多数图表上执行此操作:

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

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

答案 1 :(得分:0)

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

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

本教程也很好地阅读了结果迭代http://tinkerpop.apache.org/docs/current/tutorials/the-gremlin-console/#result-iteration