2

我的 Edge 上有两个要过滤的属性:ab. 我想使用以下列表过滤这些属性:

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发生变化,它就会中断。

给定 variable 的格式,有没有办法lst通过lst传入查询来计算解决这个问题?

4

1 回答 1

2

这将起作用:

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

于 2019-10-07T20:35:28.073 回答