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

3

我正在尝试使用遍历修改远程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(),仍在努力理解为什么... - user3508638
2个回答

2
我不确定你使用的图形实现是什么,但这对于我来说可以在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") 不起作用是因为你所说的原因-该顶点是“分离的”,除了将其传回另一个 Traversal 外,无法直接使用它。你也应该能够在大多数图表上执行此操作:

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

不需要引用id()函数。


感谢您的回复。我使用了正确的顶点ID,但剥离了一些替代的Scala代码(我编辑了原始问题并添加了.next())。我想你的例子是在Gremlin Console中,那个可以工作,我也可以在Gremlin Console中这样做。但是从Scala / Java程序内部进行的远程连接不允许我修改现有的顶点。我尝试了TinkerGraph和JanusGraph,两者都无法工作,因此我认为问题出在Java实现上。 - user3508638

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接