Gremlin - фильтрация краев из сжатого списка значений свойств - PullRequest
2 голосов
/ 07 октября 2019

У меня есть два свойства на краях, по которым я хочу фильтровать: 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 Ответ

2 голосов
/ 07 октября 2019

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

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.

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