Tinkerpop3 DSE 中的交易

Transactions in Tinkerpop3 DSE

这是一个通过 TinkerPop3 理解 DSE 图中交易语义的问题 Java API

据我了解,当您有 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)

drop() 步骤 "kills" 您正在删除的遍历器,这意味着 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]