Предположим, у меня есть граф, созданный на 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 в Нептуне.
Сказав все это, мои вопросы:
- Верно ли мое понимание техники транзакций Нептуна?
- если да, значит ли это, что каждый раз, когда я пишу
.next()
, будет происходить транзакция? - как ведет себя
.next(int)
, например, означает ли использование.next(4)
, что будет выполнено 4 транзакции? - Как я могу это оптимизировать? получить все необходимые данные, используя один доступ к базе данных и одну транзакцию? т.е. есть ли лучший способ удовлетворить мои потребности?
- Как я могу получить все результаты вышеуказанного запроса, используя одну строку? т.е. не использовать методы hasNext () и next ()? есть ли способ узнать размер набора результатов и, таким образом, использовать метод next (размер набора результатов)?
Спасибо, Хади