第9期 Gremlin Steps:
where()
、filter()
本系列文章的Gremlin示例均在HugeGraph图数据库上执行,环境搭建可参考准备Gremlin执行环境,本文示例均以其中的“TinkerPop关系图”为初始数据。
上一期:深入学习Gremlin(8):数据分组与去重
在对图进行遍历分析时,经常需要对满足一定条件的对象进行过滤。where()
就是用来过滤遍历过程中当前阶段的对象。另一方面,predicate
就是过滤时使用的判断条件,包括关系运算和区间判断等,只有满足判断条件的对象才能通过进入下一轮或者作为结果。
where()
常与select()
或者match()
配合使用,也可以单独使用。
以下是predicate
的说明:
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中的任意一个? |
without(objects…) | 传入的对象不等于目标对象列表objects中的任何一个? |
逻辑运算and()、or()或者not()作用于
predicate
会产生一个新的predicate
,逻辑运算参见第10期
在众多的Gremlin steps中,有一大类是filter step
,通过判断是否满足predicate
来决定对象能否通过filter step
。filter()
语句是filter step
的基础,较为抽象,而更加具体的where()
语句就是一个典型的filter step
。
predicate
可以通过test()
来获得boolean值可以用test()
测试value
是否满足predicate
,以下是一些例子:
示例1:
// (3 == 2)
eq(2).test(3)
// ('d' == 'a' || 'd' == 'b' || 'd' == 'c')
within('a','b','c').test('d')
// (3 > 1 && 3 < 4)
inside(1,4).test(3)
and
/or
/not
作用于predicate
之后成为新的predicate
更多逻辑运算细节可参见第10期
示例1:
// not()作用于neq(),等价于eq()
not(neq(2))
示例2:
// and()连接的predicate,是一个新的predicate
within(1,2,3).and(not(eq(2))).test(3)
// or()连接的predicate,是一个新的predicate
inside(1,4).or(eq(5)).test(3)
where()
单独使用where()
有三种使用方式:
where(P)
where(String, P)
where(Traversal)
示例1:
// 查看“zhoney”的合作伙伴
// where(P)方式
g.V('zhoney').as('a')
.out('created').in('created')
.where(neq('a'))
示例2:
// 查看“zhoney”的合作伙伴
// where(String, P)方式
g.V('zhoney').as('a')
.out('created').in('created').as('b')
.where('a',neq('b'))
示例3:
// “spmallette”开发过不止一个软件的合作伙伴
// where(Traversal)方式
g.V('spmallette').out('created').in('created')
.where(out('created').count().is(gt(1)))
.values('name')
where()
可以与by()
语句配合使用,表示用by(property)
指定的属性进行predicate
判断,例如下面的例子
示例4:
// 查询”被别人认识“
// 且认识自己的人的年龄大于自己的年龄的人
g.V().as('a')
.out('knows').as('b')
.where('a', gt('b')).by('age')
where()
与as()
+select()
配合使用as()
可以为某一阶段的对象添加标签,select()
则可以通过标签获取对象。因此as()
+select()
可以在某个step处得到历史信息,详细介绍参见第13期。
// 查看“zhoney”的合作伙伴,并将“zhoney”及其合作伙伴的名字以map输出
// select().where()方式
g.V('zhoney').as('a')
.out('created').in('created').as('b')
.select('a','b').by('name')
.where('a',neq('b'))
where()
与match()
配合使用match()
可以保证满足某种模式的对象通过,详细介绍参见第17期。
// 查看“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')
filter()
有三种用法:
示例1:
// 查找图中的“person”顶点
// lambda方式
g.V().filter {it.get().label() == 'person'}
示例2:
// 查找图中的“person”顶点
// Traversal方式
g.V().filter(label().is('person'))
示例3:
// 查找图中的“person”顶点
// 特定filter step方式
g.V().hasLabel('person')
上一期 深入学习Gremlin(8):数据分组与去重
下一期 深入学习Gremlin(10):逻辑运算