Gremlin查询中连续独立or与同个or包含所有条件的差异
Gremlin 多or写法逻辑差异说明
两种写法的核心差异是筛选条件的逻辑组合规则完全不同,所以返回结果必然存在差异:
- 连续使用两个独立
or:两个or的结果是**逻辑与(AND)**关系 - 所有条件放入同一个
or:所有条件是**逻辑或(OR)**关系
第一种写法(两个独立or)逻辑
g.V(1).in('linked_to', 'used_by') .or(has('type', 'knows'), has('type', 'like'), has('type','follows')) .or(hasNot('last_used'), has('last_used',gt(datetime('2021-09-07T10:04:05.000Z')))) .out('linked_to', 'used_by') .dedup()
等价于同时满足两个规则的顶点才会被保留:
type属性值为knows、like、follows三者之一- 顶点没有
last_used属性,或last_used属性值大于指定时间
对应逻辑表达式:
(type ∈ ['knows','like','follows']) AND (无last_used OR last_used > 2021-09-07T10:04:05Z)
举个反例:如果顶点type是knows但last_used为2020年,会被过滤掉。
第二种写法(所有条件同个or)逻辑
g.V(1).in('linked_to', 'used_by') .or(has('type', 'knows'), has('type', 'like'), has('type','follows') , hasNot('last_used'), has('last_used',gt(datetime('2021-09-07T10:04:05.000Z')))) .out('linked_to', 'used_by') .dedup()
等价于满足任意一个规则的顶点就会被保留:
type属性值为knows、like、follows三者之一- 顶点没有
last_used属性 last_used属性值大于指定时间
对应逻辑表达式:
(type ∈ ['knows','like','follows']) OR (无last_used) OR (last_used > 2021-09-07T10:04:05Z)
对应上面的反例:顶点type是knows但last_used为2020年,依然符合第一个规则,会被保留。
等效写法参考
如果希望单or写法和双or独立写法效果一致,需要用and嵌套两个or:
g.V(1).in('linked_to', 'used_by') .and( or(has('type', 'knows'), has('type', 'like'), has('type','follows')), or(hasNot('last_used'), has('last_used',gt(datetime('2021-09-07T10:04:05.000Z')))) ) .out('linked_to', 'used_by') .dedup()
内容的提问来源于stack exchange,提问作者Lucas Dresl
相关产品推荐
相关产品推荐

