Gremlin - фильтрация краев из заархивированного списка значений свойств

У меня есть два свойства на краях, которые я хочу отфильтровать: a а также b. Я хочу отфильтровать эти свойства, используя следующий список:

lst = [['0102', '2017-01-01'], ['4920', '2018-07-01'], ..., ['2198', '2018-04-01']]

... и используя следующую логику:

('a1' AND 'b1') OR ('a2' AND 'b2') OR ... OR ('an' AND 'bn')

Для фильтрации краев одной из пар значений в lst Я мог бы:

g.E().and(has('a', '0102'), has('b', '2017-01-01'))

Для фильтрации по всем из них я мог:

s.E().or(and(has('a', '0102'), has('b', '2017-01-01')), 
         and(has('a', '4920'), has('b', '2018-07-01')),
         ...
         and(has('a', '2198'), has('b', '2018-04-01')))

Подход работает, но требует ручного ввода параметров фильтра. Поэтому он сломается, как только содержимое переменнойlst изменения.

Есть ли способ, учитывая формат переменной lst, вычислительно решить эту задачу, передав lst в запрос?

1 ответ

Решение

Это будет работать:

g.E().as('e').
  filter(constant(lst).unfold().as('t').
         where('e', eq('t')).
           by('a').
           by(limit(local, 1)).
         where('e', eq('t')).
           by('b').
           by(tail(local, 1)))

Однако обратите внимание, что это будет полное сканирование по всем краям, и что производительность будет снижаться с увеличением размера lst.

Если ваши края глобально проиндексированы (я не помню, возможно ли это вообще в JG), вы, вероятно, увидите лучшие / более быстрые результаты, если выполните N запросы параллельно (где N количество записей в lst).

Другие вопросы по тегам