我在Edge上有两个要过滤的属性: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
传递到查询中来解决此问题?
答案 0 :(得分:2)
这将起作用:
opacity
但是请注意,这将是对所有边缘的全面扫描,并且随着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)))
的增大,性能将进一步降低。
如果您的边被全局索引(我不记得JG中是否有可能),如果并行执行lst
查询(其中N
,可能会看到更好/更快的结果是N
中的条目数。