条件和过滤
在对图进行遍历分析时,经常需要对满足一定条件的对象进行过滤。where()就是用来过滤遍历过程中当前阶段的对象。另一方面,predicate就是过滤时使用的判断条件,包括关系运算和区间判断等,只有满足判断条件的对象才能通过进入下一轮或者作为结果。
where()常与select()或者match()配合使用,也可以单独使用。
| Predicate | Description |
|---|---|
| eq(object) | 传入的对象等于目标Object |
| neq(object) | 传入的对象不等于目标object |
| lt(number) | 传入的数字小于目标number |
| lte(number) | 传入的数字小于或者等于目标number |
| gt(number) | 传入的数字大于目标number |
| gte(number) | 传入的数字大于或等于目标number |
| inside(low, high) | 传入的数字大于low且小于high |
| outside(low,high) | 传入的数字小于low或者大于high |
| between(low,high) | 传入的数字大于等于low且小于high |
| within(objects…) | 传入的对象等于目标对象列表objects中的任意一个 |
| winthout(objects…) | 传入的对象不等于目标对象列表objects中的任何一个 |
逻辑运算
and()、or()、not()作用于predicate会产生一个新的predicate
filter step时Gremlin Steps中的一个大类,通过判断是否满足predicate来决定对象能否通过filter step。filter()语句是filter step的基础,比较抽象,更加具体的where()语句就是一个典型的filter step。
test()
predicate可以通过test()来测试,返回一个boolean值。
例如:
测试eq()
// 测试3是否可以满足eq(2)// 结果falseeq(2).test(3)// 测试2是否可以满足eq(2)// 结果trueeq(2).test(2)
测试within():
// 测试c是否满足within('a', 'b', 'c')within('a', 'b', 'c').test('c')
and/or/not/is
测试and/or/not:
// not(neq('a')) 等价于 eq('a')not(neq('a')).test('a')within('1', '2', '3').and(not(eq('2'))).test('3')
is()可以接受一个对象(能判断想等)或一个判断语句(如:P.gt()、P.lt()、P.inside()等),当接受的是对象时,原遍历器中的元素必须与对象相等才会保留;当接受的是判断语句时,原遍历器中的元素满足判断才会保留,接受一个对象相当于P.eq()。
示例:
g.V().hasLabel('person').values('age').is(eq(29))
as()
as()可以为某一阶段的对象添加标签。
例如:
g.V('zhoney').as('a') // 当前阶段添加a标签.out('created').in('created').as('b') // 为当前阶段添加b标签
where()
where()有三种使用方式:
where(P)where(String, P)where(Traversal)
示例:
where(P)方式:
// 查看zhoney的合作伙伴g.V('zhoney').as('a').out('created').in('created').where(neq('a'))
where(String, P)方式:
// 查看zhoney的合作伙伴g.V('zhoney').as('a').out('created').in('created').as('b').where('b', neq('a'))
where(Traversal)方式:
// spmallette开发过不止一个软件的合作伙伴g.V('spmallette').out('created').in('created').where(out('created').count().is(gt(1))).values('name')
where() + by()
where()可以与by()语句配合使用,表示用by(property)指定的属性进行predicate判断。
示例:
g.V().hasLabel('person').as('a').out().hasLabel('person').as('b').where('b', gt('a')).by('age')
where() + as() + select()
select()可以通过as()标签获取对象,因此as() + select()可以在某个step处得到历史信息。
示例:
g.V('zhoney').as('a').out('created').in('created').not(hasId('zhoney')).as('b').select('a', 'b').by('name').where('a',neq('b'))
输出结果:
{"data": [{"a": "Zhoney Zhang","b": "Jermy Li"},{"a": "Zhoney Zhang","b": "Linary Li"}]}
where() + match()
match()可以保证满足某种模式的对象通过。
示例:
// 查看“zhoney”的合作伙伴,并将“zhoney”及其合作伙伴的名字以map输出// match().where()方式g.V('zhoney').match(__.as('a').out('created').as('b'),__.as('b').in('created').as('c')).where('a', neq('c')).select('a','c').by('name')
