【问题标题】:Gremlin returning bad resultsGremlin 返回不好的结果
【发布时间】:2021-11-08 20:32:09
【问题描述】:

我正在编写单元测试并验证应该在我的 JanusGraph 后端中返回/创建/更新等的数据。

我也在使用 Gremlin 终端验证结果,但注意到已更新的实体并未反映我终端中的更改。删除顶点时也会发生同样的事情。它不再在图表中,但我的 gremlin 控制台返回结果。

我让同事运行与我相同的查询来证明值不一致。有没有办法将 Gremlin 与 Graph 中的实际值同步?

编辑。我的代码正在提交。我只是使用 tinkerpop 来验证数据。

【问题讨论】:

  • 您是否确保在进行更改后提交事务?在您提交 Tx 之前,您看到的内容以及查看图表的其他人看到的内容将不同步。
  • 提交在我的 Java 代码中,我只是在用 gremlin 进行检查。我发出了g.tx().commit(),它现在返回了预期值。当我没有从 tinkerpop 中执行任何操作时,为什么我必须在其中发出提交?
  • 这可能只是时间问题,但在不了解后端存储、索引、连接方式和其他变量的情况下很难知道。请记住,在 Gremlin 控制台中,您发出的查询会启动一个新事务,该事务将具有图形视图。该 Tx 保持打开状态,直到您明确关闭它。如果新项目是在您开始使用控制台后添加的 - 或非常接近同时,通过发出 commit 或很可能 rollback 也有效,您正在让事情有机会从Tx 的观点。正如我所说,它也可能是别的东西。
  • HBase 是我正在使用的存储引擎。我只是想知道为什么搜索会运行需要提交或回滚的可写事务。我想我会在每次搜索验证后发出回滚...

标签: java gremlin janusgraph


【解决方案1】:

JanusGraph 有一个叫做 Transactional Scope 的东西。根据这个概念,

所有图形元素(顶点、边和类型)都与检索或创建它们的事务范围相关联。在 TinkerPop 的默认事务语义下,事务是使用图上的第一个操作自动创建的,并使用 commit() 或 rollback() 显式关闭。一旦事务关闭,与该事务关联的所有图形元素都会变得陈旧且不可用。但是,JanusGraph 会自动将顶点和类型转换到新的事务范围中,如下例所示:

    graph = JanusGraphFactory.open("berkeleyje:/tmp/janusgraph")
    juno = graph.addVertex() //Automatically opens a new transaction
    graph.tx().commit() //Ends transaction
    juno.property("name", "juno") //Vertex is automatically transitioned

另一方面,边缘不会自动转换,并且不能在其原始事务之外访问。它们必须显式转换:

    e = juno.addEdge("knows", graph.addVertex())
    graph.tx().commit() //Ends transaction
    e = g.E(e).next() //Need to refresh edge
    e.property("time", 99)

这可能发生在你身上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-15
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 2021-08-02
    相关资源
    最近更新 更多