Как express несколько критериев набора свойств для выбора узла с помощью запроса gremlin - PullRequest
0 голосов
/ 17 апреля 2020

Вот моя упрощенная графовая схема,

package:
  property: 
   - name: str (indexed)
   - version: str (indexed)

Я хочу запросить версию, используя несколько наборов критериев свойств в одном запросе. Я могу использовать within для списка одного свойства, но как это сделать для нескольких свойств?

Рассмотрим, у меня есть 10 package узлов, (p1,v1, p2,v2, p3,v3,.. p10,v10)

Я хочу выбрать только узлы с (p1 with v1, p8 with v8, p10 with v10)

Есть ли способ сделать с одним запросом gremlin?

Что-то эквивалентное SELECT * from package WHERE (name, version) in ((p1,v1),(p8,v8),(p10,v10)).

Ответы [ 2 ]

4 голосов
/ 17 апреля 2020

Прямой ответ будет использовать or(), но стоит проверить, как график оптимизирует этот обход с profile(). Для TinkerGraph:

gremlin> g.V().or(has('software','name','lop'),has('person','name','marko')).profile()
==>Traversal Metrics
Step                                                               Count  Traversers       Time (ms)    % Dur
=============================================================================================================
TinkerGraphStep(vertex,[])                                             6           6           0.065    30.59
OrStep([[HasStep([~label.eq(software), name.eq(...                     2           2           0.147    69.41
  HasStep([~label.eq(software), name.eq(lop)])                                                 0.062
  HasStep([~label.eq(person), name.eq(marko)])                                                 0.011
                                            >TOTAL                     -           -           0.212        -

мы видим, что это не так хорошо, как полное сканирование графика. Чтобы избежать сканирования в TinkerGraph, вам может потребоваться сделать что-то более креативное:

gremlin> g.inject(1).union(V().has('software','name','lop'),
......1>                   V().has('person','name','marko')).profile()
==>Traversal Metrics
Step                                                               Count  Traversers       Time (ms)    % Dur
=============================================================================================================
InjectStep([1])                                                        1           1           0.019     8.39
UnionStep([[TinkerGraphStep(vertex,[~label.eq(s...                     2           2           0.210    91.61
  TinkerGraphStep(vertex,[~label.eq(software), ...                     1           1           0.004
  EndStep                                                              1           1           0.011
  TinkerGraphStep(vertex,[~label.eq(person), na...                     1           1           0.004
  EndStep                                                              1           1           0.040
                                            >TOTAL                     -           -           0.229        -
3 голосов
/ 17 апреля 2020

это может быть не самый "творческий" способ сделать это,

, но я думаю, что самый простой способ - использовать or:

g.V().or(
    hasLabel('v1').has('prop', 'p1'),
    hasLabel('v8').has('prop', 'p8'),
    hasLabel('v10').has('prop', 'p10')
  )

пример: https://gremlify.com/6s

...