запрос gremlin с использованием обещания. Невозможно использовать его для возврата желаемого результата - PullRequest
0 голосов
/ 05 августа 2020

При использовании следующего оператора 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, но, useCase: (предположим, что исходная / конечная вершины ребра отсутствуют)

  • создается edge1
  • edge2 не создается, так как исходная вершина1 отсутствует
  • edge3 также не создается, даже если у него есть как исходная, так и конечная вершины, доступные в db
  • , поэтому результат возвращается как false с созданием 1 (edge1) допустимого ребра из 2 (edge1, edge3)

Есть ли возможность откатить всю транзакцию с помощью гремлина в нептуне? чтобы выполнить этот запрос после того, как недостающая вершина 1 была создана каким-либо другим способом.

Или любая идея для обработки / захвата отсутствующей транзакции. Пожалуйста, исправьте меня, если мне нужно изменить формирование запроса.

Примечание: по крайней мере, мне нужно захватить края / любая транзакция не выполняется при выполнении запроса. Здесь используется Java.

Было бы полезно, если бы у вас были предложения по каким-либо передовым методам для достижения этого!

1 Ответ

0 голосов
/ 05 августа 2020

Я думаю, вы неправильно поняли методы.

  1. hasNext() можно использовать, чтобы проверить, доступна ли вершина или нет. Простой пример: чтобы проверить, доступна ли вершина с именем xyzzyx в БД, вы можете использовать этот метод. Он возвращает логическое значение.

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

  2. next() может использоваться для получения следующего n результатов обхода. Вы можете использовать это, чтобы получить вершину или ребра. Результатом будет экземпляр Traversal, который является типом Iterator.

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

  3. iterate() может использоваться для выполнения задачи. и не жди ничего в результате. Обычно используется для запросов типа вставки или удаления.

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

  4. toList() можно использовать для получения результата в списке.

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

В Gremlin есть намного больше методов в зависимости от ваших потребностей. Хорошей отправной точкой являются 4.

Для транзакций Нептун уже поддерживает транзакции для запроса.

Нептун открывает новую транзакцию в начале каждого обхода Gremlin и закрывает транзакцию после успешное завершение обхода. При возникновении ошибки транзакция откатывается. В одну транзакцию включается несколько операторов, разделенных точкой с запятой (;) или символом новой строки (\ n). Каждый оператор, кроме последнего, должен заканчиваться шагом next () для выполнения. Возвращаются только окончательные данные обхода.

Ручной журнал транзакций c с использованием tx.commit () и tx.rollback () не поддерживается.

Ссылка на ссылку для NeptuneDB: https://docs.aws.amazon.com/neptune/latest/userguide/access-graph-gremlin-differences.html

...