【问题标题】:gremlin query using promise. Can't use it to return desired result使用 promise 的 gremlin 查询。不能用它来返回想要的结果
【发布时间】:2023-03-10 21:01:01
【问题描述】:

使用以下 Gremlin 语句查询 AWS Neptune 时,completableFuture 未返回所需结果。当我尝试以下方法时:

graphTraversal.promise(Traversal::hasNext());

场景 1:

它适用于单个顶点g.V('id-1').promise(Traversal::hasNext()) 返回 true

但是,当我使用 g.V('id-1','id-2').promise(Traversal::hasNext()) 时,它仍然返回 true 而不是 false,因为 id-2 在 db 中不可用

场景 2:

如下创建边列表时,如果没有创建任何边,如何使查询返回false。

CompletableFuture<Boolean> method1() {
    List<Edge> edgeList = new ArrayList();  
    edgeList.add(edge1);// vertex2 -> vertex3`  
    edgeList.add(edge2);// vertex1(not present) -> vertex2  
    edgeList.add(edge3);// vertex3 -> vertex4
    
    GraphTraversal g = null;
    
    loop(edgeList: e) {
        g = graphTraversalQueryMethod(g, e);
    }
    
    return g.promise(Traversal::hasNext);

}

GraphTraversal graphTraversalQueryMethod(GraphTraversal g, Edge e) {
    
    g.V(e.sourceVertexId).addE("EDGE_LABEL").property(e.propKey, e.propValue).to(e.destVertexId);
    
}

它返回false,但是用例:(假设边的源/目标顶点不存在)

  • edge1 正在创建中
  • edge2 未创建,因为源顶点 1 丢失
  • edge3 也没有创​​建,即使它在 db 中同时具有可用的源顶点和目标顶点
  • 因此在 2 (edge1, edge3) 中创建 1 (edge1) 有效边时结果返回 false

是否有任何选项可以在海王星中使用 gremlin 回滚整个事务?在通过其他方式创建缺失的 vertex1 后执行此查询。

或任何处理/捕获丢失交易的想法。如果我需要更改查询格式,请纠正我。

注意:至少我需要捕获边缘/任何事务在查询执行时都没有成功。这是使用 Java。

如果有任何最佳实践的建议来实现这一点,将会很有帮助!

【问题讨论】:

    标签: java gremlin amazon-neptune


    【解决方案1】:

    我认为你误解了方法。

    1. hasNext() 可用于检查顶点是否可用。 一个简单的例子是,检查名称为xyzzyx 的顶点是否为 在数据库中可用,您可以使用此方法。它返回一个布尔值。

      g.V().has('name', 'xyzzyx').hasNext()

    2. next() 可用于从 遍历。您可以使用它来获取顶点或边。结果 将是一个Traversal 实例,它是Iterator 的一种类型。

      g.V().has('name', 'xyzzyx').next()

    3. iterate() 可用于执行任务,而不是期望任何东西 结果。通常用于插入或删除类型的查询。

      g.addVertex(label,'person', 'name', 'xyzzyx').iterate()

    4. toList()可用于获取List中的结果。

      g.V().valueMap(true).toList()

    根据您的需要,Gremlin 中还有更多方法。有4个很好的起点。

    对于事务,Neptune 已经为查询维护事务。

    Neptune 在每个 Gremlin 开始时打开一个新事务 成功完成后遍历并关闭事务 遍历。出现错误时事务回滚。 由分号 (;) 或换行符分隔的多个语句 字符 (\n) 包含在单个事务中。每一条语句 除了最后一个必须以要执行的 next() 步骤结束。仅有的 返回最终的遍历数据。

    使用 tx.commit() 和 tx.rollback() 的手动事务逻辑不是 支持。

    NeptuneDB 参考链接:https://docs.aws.amazon.com/neptune/latest/userguide/access-graph-gremlin-differences.html

    【讨论】:

    • 是的,我知道了,我推荐了这个link。但是,如何使它像休眠中的@Transactional 一样工作。我的意思是,如果无法创建边缘,则回滚整个查询/遍历执行。正如我在使用 Java 的 CompletableFuture 的多线程环境中尝试的那样。因此,使用promise(Traversal::methodName) 方法来执行这些终端方法!我如何记录不是由任何原因创建的边缘!
    • 添加了对 Neptune 中事务行为的响应。
    • 没关系。我的问题是如何从“n”个提交的交易中记录不成功的交易。此外,该示例用于字符串查询提交。我已经看到了。但是,正如问题中提到的,我正在寻找 java 实现。
    猜你喜欢
    • 2023-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 2015-12-26
    相关资源
    最近更新 更多