【问题标题】:Using a Promise to return java Tinkerpop Gremlin Traversal results使用 Promise 返回 java Tinkerpop Gremlin 遍历结果
【发布时间】:2023-01-15 08:45:48
【问题描述】:

我想利用 Gremlin GraphTraversal.promise(final Function<Traversal<S, E>, T> traversalFunction) 方法。我不清楚我将在承诺中使用什么功能。

使用 Tinkerpop Client 对象,我做这样的事情:

GraphTraversal myTraversal = g.V().hasLabel("myLabel");
client.submitAsync(myTraversal)
        .thenAccept(result -> {
            List<Map<Object, Object>> resultList = new ArrayList<>();
            result.iterator().forEachRemaining(item ->{
                DefaultRemoteTraverser drt = (DefaultRemoteTraverser) item.getObject();
                Map<Object, Object> itemMap = (HashMap) drt.get();
                resultList.add(itemMap);
            });
            outputSuccess(resultList);
        })
        .exceptionally(throwable -> {
            // handle;
            return null;
        })

使用 .promise() 会是什么样子?我在源代码库中寻找可能提供线索的测试,但没有看到。

【问题讨论】:

    标签: java future gremlin tinkerpop


    【解决方案1】:

    首先请注意,promise() 只能在您将Traversal 用作remote connection 时使用。如 javadoc 中所述,它将在嵌入式模式下抛出异常。

    promise()Traversal 异步提交到服务器后采用一个函数来处理它。您实际上只是为 promise() 提供了一个终止符,以便将结果放入返回的 CompletableFuture

    g.V().out().promise(t -> t.toList());
    

    我想你可以把它链接起来更像你在你的例子中所拥有的:

        g.V().out().promise(t -> t.toList()).
          thenAccept(r -> outputSuccess(r)).
          exceptionally(...);
    

    【讨论】:

    • 好的,谢谢 Stephen.. 但尝试我得到“方法 toList() 未定义对象类型”。我可以投 t,但我不确定将它投射到什么,只是 Traversal ?
    • 啊,我明白了,它只是一个 ArrayList,由 toList() 返回。现在我只是收到关于“对泛型 CompletableFuture<T> 的引用应该被参数化”的类型安全警告,我不得不转换结果 r。我显然在某处需要一些类型参数,但不确定是什么以及在哪里。我不太擅长泛型,尤其是在 Future with a Function 这种复杂的情况下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多