交易Tinkerpop3 DSE

时间:2018-03-13 11:01:46

标签: gremlin tinkerpop3 datastax-enterprise-graph

这是通过TinkerPop3 Java API理解DSE图中的事务语义的问题

据我所知,当您在一次交易中执行DseSession.executeGraph(String query)时。

但是使用TinkerPop3 Java API实现相同的机制是什么? 假设我想添加一个顶点,然后删除一些边,然后添加一个新的顶点等,

我试过

g.V("{~label=company, id=12345}").drop().addV("company").property("id", "1").next()

这并没有像我预期的那样奏效。 (放弃公司并在单个交易中添加一个)。确实删除了第一个顶点,但是从未创建新公司。

我得到了以下异常

Exception in thread "main" java.util.NoSuchElementException
    at com.datastax.dse.graph.internal.DseRemoteTraversal.nextTraverser(DseRemoteTraversal.java:60)

1 个答案:

答案 0 :(得分:3)

drop()步骤"杀死"您正在删除的遍历器,意味着drop()没有返回任何内容。你可以看到,如果你这样做:

gremlin> g.V().has('name','marko').drop().next()
java.util.NoSuchElementException
Type ':help' or ':h' for help.
Display stack trace? [yN]

如果没有遍历器,则无法向前面的addV()步骤前进。可能有更好的方法可以做到这一点,但是您可以通过使用inject()添加一次性值作为遍历到addV()的遍历来解决该问题。在这种情况下,您删除了一件事,因此您需要放回一个遍历器以触发对addV()的单个调用:

gremlin> g.V().has('name','marko').drop().
......1>   inject(1).
......2>   addV('person').property('name','stephen').next()
==>v[13]

我也想知道这是否是一个很好的方法:

gremlin> g.V().has('name','marko').
......1>   union(drop(),
......2>         addV('person').property('name','stephen'))
==>v[13]