条件和过滤
在对图进行遍历分析时,经常需要对满足一定条件的对象进行过滤。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)
// 结果false
eq(2).test(3)
// 测试2是否可以满足eq(2)
// 结果true
eq(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')