Поддерживает ли Gremlin. NET отправку асинхронного c байт-кода? - PullRequest
3 голосов
/ 19 марта 2020

Есть функции расширения для асинхронной отправки запросов в Gremlin. Net, некоторые получают string, что не рекомендуется , а другие используют RequestMessage который не так удобен для чтения, как использование GraphTraversal функций.

Есть ли способ отправить запрос, подобный приведенному ниже, асинхронно, без отправки строки или RequestMessage?

var res = _graphTraversalSource.V().Has("name", "Armin").Out().Values<string>("name").ToList();

Немного больше контекста

Я пишу API, который запрашивает AWS Нептун. Вот как я получаю 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 Ответ

4 голосов
/ 25 марта 2020

Вы можете выполнить обход асинхронно с 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, вы также используете один и тот же пул соединений для всех обходов в вашем приложении.

...