Gremlin.NET是否支持提交异步字节码?

3
在Gremlin.Net中,有一些用于异步提交查询的扩展函数,其中一些使用不推荐string,另一些使用RequestMessage,但这种方式不如使用GraphTraversal函数易读。
是否有一种方法可以异步提交像下面这样的查询,而不需要提交字符串或RequestMessage
var res = _graphTraversalSource.V().Has("name", "Armin").Out().Values<string>("name").ToList();

更多背景信息

我正在编写一个查询AWS Neptune的API。以下是我在单例服务的构造函数中如何获取GraphTraversalSource(我不确定是否应该使RemoteConnection成为单例,并为每个查询生成一个GraphTraversalSource,或者这是正确的方法):

private readonly GraphTraversalSource _graphTraversalSource;

public NeptuneHandler(string endpoint, int port)
{
    var gremlinClient = new GremlinClient(new GremlinServer(endpoint, port));
    var remoteConnection = new DriverRemoteConnection(gremlinClient);
    _graphTraversalSource = AnonymousTraversalSource.Traversal().WithRemote(remoteConnection);
}

1
我不是 .Net 专家,但在使用 Gremlin 客户端和远程连接时的一般指导是在应用程序中的线程之间共享遍历源,因为这将使底层的 Web 套接字工作池和连接池得以共享。 - Kelvin Lawrence
1
你在问题中已经有了使用Gremlin.NET执行Gremlin遍历的正确方法:graphTraversalSource.V().Has("name", "Armin").Out().Values<string>("name").ToList();。那具体哪里出了问题呢? - Florian Hockmann
@FlorianHockmann,它运行得非常好,我正在寻找一种“等待”它的方法。我找到了答案:await remoteConnection.SubmitAsync(traversal.ByteCode),我的另一个问题是DriverRemoteConnection的线程安全性。我可以在线程之间共享该类型的对象吗? - Armin Bashizade
2
执行异步遍历的推荐方法是在其后添加.Promise(),例如:g.V(1).Values<string>("name").Promise(t => t.Next());。 是的,在应用程序中应共享DriverRemoteConnection。在Gremlin中通常建议实际上共享遍历源g,但这也包括DriverRemoteConnection - Florian Hockmann
@FlorianHockmann 谢谢!你能发一篇答案吗,这样我就可以批准它了吗?你能否在其中包含一个文档引用,建议共享“g”?我一直在寻找,但找不到。 - Armin Bashizade
当然,我已经发布了一个答案。不过看起来建议在TinkerPop文档中并没有提到,所以我为此创建了一个问题:TINKERPOP-2354 - Florian Hockmann
1个回答

5

您可以使用 Promise() 结束步骤来异步执行遍历。

var names = await g.V().Has("name", "Armin").Out().Values<string>("name").Promise(t => t.ToList());

Promise()以回调函数作为其参数,该回调函数调用您希望在遍历中执行的通常终止步骤,这在您的情况下是ToList。但是,如果您只想获得单个结果,则可以将ToList()替换为Next()

请注意,我已将图遍历源变量重命名为g,因为这是Gremlin的通常命名约定。

如我在评论中提到的,建议在整个应用程序中重用此图遍历源g,因为它可能包含适用于要执行的所有遍历的配置。它还包含DriverRemoteConnection,该连接使用连接池与服务器进行通信。通过重用g,您还可以在应用程序中为所有遍历使用相同的连接池。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接