Gremlin - 从 属性 值的压缩列表中过滤边
Gremlin - filtering Edges from a zipped list of property values
我的边上有两个要过滤的属性: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
传递给查询来计算解决这个问题?
这会起作用:
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
).
中的条目数
我的边上有两个要过滤的属性: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
传递给查询来计算解决这个问题?
这会起作用:
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
).