Как лучше всего написать запрос gremlin - это через Groovy script или шаги tinkerpop

Как лучше всего написать запрос к гремлину - через отличный скрипт или шаги tinkerpop?

Например, чтобы отсортировать набор вершин с меткой «Сотрудник» по дате присоединения.

Какой способ поиска лучше?

Is it

g.V().hasLabel('Employee').sort{a,b->a.value('DateOfJoining')<=>b.value('DateOfJoining')}

or

g.V().hasLabel('Employee').order().by('DateOfJoining',incr)

здесь я использовал оператор <=> в Groovy скрипте, а во втором я использовал простой шаг порядка в tinkerpop.

Оба запроса работают в консоли gremlin, но какой из них лучше всего подходит для поиска и как консоль gremlin интерпретирует оба запроса.


person Mahi Tej Gvp    schedule 30.09.2016    source источник


Ответы (1)


Лучше избегать хороших методов сбора, потому что базовая база данных графов не может их интерпретировать. Они существуют вне Traversal. Рассмотрим этот пример, похожий на ваш:

gremlin> g.V().hasLabel("person").order().by('name',incr).explain()
==>Traversal Explanation
===============================================================================================================================
Original Traversal                 [GraphStep(vertex,[]), HasStep([~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]

ConnectiveStrategy           [D]   [GraphStep(vertex,[]), HasStep([~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]
RepeatUnrollStrategy         [O]   [GraphStep(vertex,[]), HasStep([~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]
InlineFilterStrategy         [O]   [GraphStep(vertex,[]), HasStep([~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]
MatchPredicateStrategy       [O]   [GraphStep(vertex,[]), HasStep([~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]
PathRetractionStrategy       [O]   [GraphStep(vertex,[]), HasStep([~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]
IncidentToAdjacentStrategy   [O]   [GraphStep(vertex,[]), HasStep([~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]
AdjacentToIncidentStrategy   [O]   [GraphStep(vertex,[]), HasStep([~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]
FilterRankingStrategy        [O]   [GraphStep(vertex,[]), HasStep([~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]
RangeByIsCountStrategy       [O]   [GraphStep(vertex,[]), HasStep([~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]
TinkerGraphStepStrategy      [P]   [TinkerGraphStep(vertex,[~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]
ProfileStrategy              [F]   [TinkerGraphStep(vertex,[~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]
StandardVerificationStrategy [V]   [TinkerGraphStep(vertex,[~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]

Final Traversal                    [TinkerGraphStep(vertex,[~label.eq(person)]), OrderGlobalStep([[value(name), incr]])]

Когда вы выполняете explain() операцию, вы можете видеть, как Traversal смотрит на базовую базу данных графа. Если бы в этом случае база данных могла оптимизировать order(), она могла бы воспользоваться этим и стать более эффективной. Если вы просто отправили g.V().hasLabel("person"), а затем переключились на отличные методы сбора, базовая база данных узнала бы только о том, что вы пытаетесь получить список «личных» вершин, и не будет знать, что вы также намеревались их упорядочить (что затем произойдет в памяти с использование заводной sort).

person stephen mallette    schedule 30.09.2016