问题
gremlin中not()和and()或者or()一起使用不起效果?
公司做知识图谱,利用gremlin
首先放上查询语句:
g.V()
.and(has('rdf','组织'))
.outE()
.and(has('rdf','增发股票'))
.or(has('Fa1Xing2Fei4Yong4Zong3E2Yuan2','51900'))
.count()
查询出来的结果是七条,这时候我们加上not语句
.not(has('Fa1Xing2Fei4Yong4Zong3E2Yuan2','1050000')).count()
我需要的效果是只排除一个结果,但是实际结果都排除了,所以结果会是0条。
关于 and() / or() / not() 的功能描述如下-
- and():可以接受任意数量的遍历器(traversal),原遍历器中的元素,只有在每个新遍历器中都能生成至少一个输出的情况下才会保留,相当于过滤器组合的与条件;
- or():可以接受任意数量的遍历器(traversal),原遍历器中的元素,只要在全部新遍历器中能生成至少一个输出的情况下就会保留,相当于过滤器组合的或条件;
- not():仅能接受一个遍历器(traversal),原遍历器中的元素,在新遍历器中能生成输出时会被移除,不能生成输出时则会保留,相当于过滤器的非条件。
试过了蛮多种的方案,但是都无法达到只排除一个选项的效果,最终退而求其次,更换逻辑:
- 原先逻辑 and() 结果 + not() 排除其中 特定选项
- 现逻辑 and() 结果 + 把not() 结果拆分成and() 和 or() 实现原先的not() 结果。
not() 拆分要考虑两种结果 一种是not过滤单个或者一批的数据,那么可以用 and( has (’ ‘,neq( )) ) 另外一种结果是范围的,可以利用 or( has(’ ‘, lt () ) , has(’ ‘, gt(’ ') ) ) 进行反向判断。
注意事项:or() 中不可用 gte / lte 只能用 gt / lt 否则会有语法错误。