深入学习Gremlin(9):条件和过滤

第9期 Gremlin Steps:

where()filter()

本系列文章的Gremlin示例均在HugeGraph图数据库上执行,环境搭建可参考准备Gremlin执行环境,本文示例均以其中的“TinkerPop关系图”为初始数据。
init-data

上一期:深入学习Gremlin(8):数据分组与去重

条件和过滤操作说明

在对图进行遍历分析时,经常需要对满足一定条件的对象进行过滤。where()就是用来过滤遍历过程中当前阶段的对象。另一方面,predicate就是过滤时使用的判断条件,包括关系运算和区间判断等,只有满足判断条件的对象才能通过进入下一轮或者作为结果。

where()常与select()或者match()配合使用,也可以单独使用。

以下是predicate的说明:

PredicateDescription
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 stepfilter()语句是filter step的基础,较为抽象,而更加具体的where()语句就是一个典型的filter step

实例讲解

1. predicate可以通过test()来获得boolean值

可以用test()测试value是否满足predicate,以下是一些例子:

示例1:

// (3 == 2)
eq(2).test(3)

test
示例2:

// ('d' == 'a' || 'd' == 'b' || 'd' == 'c')
within('a','b','c').test('d')

test2
示例3:

// (3 > 1 && 3 < 4)
inside(1,4).test(3)

test3

2. and/or/not作用于predicate之后成为新的predicate

更多逻辑运算细节可参见第10期

示例1:

// not()作用于neq(),等价于eq()
not(neq(2))

not

示例2:

// and()连接的predicate,是一个新的predicate
within(1,2,3).and(not(eq(2))).test(3)

and
示例3:

// or()连接的predicate,是一个新的predicate
inside(1,4).or(eq(5)).test(3)

or

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'))

coworkers

示例2:

// 查看“zhoney”的合作伙伴
// where(String, P)方式
g.V('zhoney').as('a')
 .out('created').in('created').as('b')
 .where('a',neq('b'))

where-string-p

示例3:

// “spmallette”开发过不止一个软件的合作伙伴
// where(Traversal)方式
g.V('spmallette').out('created').in('created')
 .where(out('created').count().is(gt(1)))
 .values('name')

where-traversal

where()可以与by()语句配合使用,表示用by(property)指定的属性进行predicate判断,例如下面的例子

示例4:

// 查询”被别人认识“
// 且认识自己的人的年龄大于自己的年龄的人
g.V().as('a')
 .out('knows').as('b')
 .where('a', gt('b')).by('age')

where-by

4. 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'))

select-where

5. 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')

match-where

6. filter()

filter()有三种用法:

  • lambda方式,filter{it.get()…}
  • Traversal方式,filter(Traversal)
  • 特定filter step方式

示例1:

// 查找图中的“person”顶点
// lambda方式
g.V().filter {it.get().label() == 'person'}

filter-lambda

示例2:

// 查找图中的“person”顶点
// Traversal方式
g.V().filter(label().is('person'))

filter-traversal

示例3:

// 查找图中的“person”顶点
// 特定filter step方式
g.V().hasLabel('person')

filter-specific

上一期 深入学习Gremlin(8):数据分组与去重
下一期 深入学习Gremlin(10):逻辑运算

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值