Использование единого метода запроса Gremlin и его влияние на транзакции Neptune

Предположим, у меня есть граф, созданный на AWS Neptune, и я хочу получить несколько сведений о вершине.

Я использовал метод объединения, чтобы получить множественную информацию с помощью следующего запроса,

this.graphTraversalSource.V().hasLabel("label1").hasId("id1")
                .union(__.valueMap(true) ,__.outE().groupCount().by(T.label).unfold(),
                   __.inE("created_post").outV().valueMap(true))

Просто запрос пытается получить следующие 1. атрибуты самой вершины. 2. внешние границы и их количество. 3. атрибуты пользователя, создавшего сообщение с id1. Вышеупомянутый запрос возвращает

Пример результата вышеуказанного запроса на Gremlin-Server будет таким:

=>{label=label1, id=id1, text=[My sample text]}
==>has_comment=1
==>has_like=1
==>{label=user, id=user1}

Теперь предположим, что я собираюсь написать их на Java, поскольку вы знаете, что запрос должен быть завершен с помощью next () или iterate (). Если я наберу next (), то будет возвращен первый элемент в приведенном выше результате. {label=label1, id=id1, text=[My sample text]}. Однако, если я попробую использовать next (4), то получу полный результат. В качестве альтернативы я знаю, что могу использовать next() and hasNext() GraphTraversal для получения результатов по мере необходимости без использования next(4)

Меня беспокоят транзакции, отправляемые в Нептун, потому что, по их мнению,

Транзакции Neptune открывает новую транзакцию в начале каждого обхода Gremlin и закрывает транзакцию после успешного завершения обхода. При возникновении ошибки транзакция откатывается.

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

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

В соответствии с вышеизложенным я понял, что каждый оператор .next () будет вызывать передачу tx в Нептуне.

Сказав все это, мои вопросы:

  1. Верно ли мое понимание техники транзакций Нептуна?
  2. если да, значит ли это, что каждый раз, когда я пишу .next(), будет происходить транзакция?
  3. как ведет себя .next(int), например, означает ли использование .next(4), что будет выполнено 4 транзакции?
  4. Как я могу это оптимизировать? получить все необходимые данные, используя один доступ к базе данных и одну транзакцию? т.е. есть ли лучший способ удовлетворить мои потребности?
  5. Как я могу получить все результаты вышеуказанного запроса, используя одну строку? т.е. не использовать методы hasNext () и next ()? есть ли способ узнать размер набора результатов и, таким образом, использовать метод next (размер набора результатов)?

Спасибо, Хади


person Hadi Awad    schedule 15.09.2019    source источник


Ответы (1)


Вы можете завершить обход разными способами, помимо next() и iterate() - например, toList() захватывает все результаты и упаковывает их в объект List. Я бы сказал, что это наиболее распространенный способ завершения обходов (и с ним проще всего работать), если вы не против реализовать List в памяти на клиенте.

Поскольку Neptune использует драйверы TinkerPop, я могу сказать, что вызовы next() (или toList() or other terminators) on bytecode-based traversals will not trigger additional requests to Neptune and therefore not start new transactions. The call tonext () _ 8_toList () `и другие завершающие шаги работают с данными, передаваемыми обратно клиенту.

Я считаю, что эта часть документации, на которую вы указали:

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

относится к выполнению на основе сценария и, вероятно, не применяется, исходя из того факта, что вы, похоже, используете обходы на основе байт-кода.

person stephen mallette    schedule 15.09.2019
comment
Как добиться выполнения нескольких запросов в одной транзакции с использованием байт-кода JavaScript? - person Kfir Dadosh; 16.09.2019
comment
Большое спасибо, это было полезно. Кажется, вы действительно знаете о Нептуне и Гремлине. А как насчет разбивки на страницы? данные передаются клиенту, а мы просто разбиваем их на страницы? - person Hadi Awad; 16.09.2019
comment
@KfirDadosh каждый проход, который вы выполняете (запрос байт-кода), представляет собой одну транзакцию независимо от языка программирования (включая javascript). если запрос не может быть объединен в цепочку в одном обходе, вы не сможете получить несколько запросов для выполнения в рамках одной транзакции. - person stephen mallette; 16.09.2019
comment
@HadiAwad Я работаю над TinkerPop / Gremlin уже около десяти лет ... Надеюсь, я знаю несколько ответов :) Разбиение на страницы другое, и это то, что вы бы сделали с самим Gremlin с помощью range() шага. вы можете найти этот пост в блоге полезным medium.com/@jayanta.mondal/ он написан с учетом cosmosdb, но обычно применяется ко всем системам с поддержкой Gremlin. он даже ссылается на другой мой ответ здесь, SO, который также может оказаться полезным stackoverflow.com/q/39826983/1831717 - person stephen mallette; 16.09.2019