2017-06-20 23 views
2

我想要使用遍歷在遠程Gremlin服務器上獲取修改頂點,但似乎只有在創建頂點的遍歷中我還可以添加屬性,當啓動新的遍歷I屬性不被添加。使用Java/Scala遠程Gremlin服務器圖形突變

斯卡拉/ 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.ut il.reference.ReferenceVertex:

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

如果我使用一個小鬼控制檯和遠程連接到服務器小鬼我都沒有任何問題。

: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遠程執行錯誤還是我錯過了什麼?

+0

找到了解決辦法,只好在遍歷後面添加.iterate(),仍試圖理解爲什麼... – user3508638

回答

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") 

我認爲即使在小鬼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()

+0

感謝您的回覆。我使用了正確的vertex-id,但剝離了一些替代的Scala代碼(我編輯了我的原始問題並添加了.next())。你的例子來自Gremlin控制檯,我假設並且工作正常,我也可以在Gremlin控制檯中執行此操作。但是從Scala/Java程序中的遠程連接不允許我修改現有的頂點。 我試過TinkerGraph和JanusGraph,兩者都不工作,所以我認爲它是在Java實現中。 – user3508638