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
).