【问题标题】:Transactions in Tinkerpop3 DSETinkerpop3 DSE 中的事务
【发布时间】:2018-03-13 11:01:46
【问题描述】:

这是一个通过 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 后您的遍历被分离。您可以尝试通过union... 组合这两个命令

标签: gremlin tinkerpop3 datastax-enterprise-graph


【解决方案1】:

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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 2015-08-28
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多