这是一个通过 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)
最佳答案
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]
关于gremlin - Tinkerpop3 DSE 中的交易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49254489/