Gremlin-从属性值的压缩列表中过滤边缘

时间:2019-10-07 16:59:55

标签: gremlin janusgraph gremlin-server gremlinpython

我在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的内容更改,它就会中断。

在给定变量lst的格式下,是否有办法通过将lst传递到查询中来解决此问题?

1 个答案:

答案 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中的条目数。