条件和过滤

在对图进行遍历分析时,经常需要对满足一定条件的对象进行过滤。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()

  1. // 测试3是否可以满足eq(2)
  2. // 结果false
  3. eq(2).test(3)
  4. // 测试2是否可以满足eq(2)
  5. // 结果true
  6. eq(2).test(2)

测试within():

  1. // 测试c是否满足within('a', 'b', 'c')
  2. within('a', 'b', 'c').test('c')

and/or/not/is

测试and/or/not:

  1. // not(neq('a')) 等价于 eq('a')
  2. not(neq('a')).test('a')
  3. within('1', '2', '3').and(not(eq('2'))).test('3')

is()可以接受一个对象(能判断想等)或一个判断语句(如:P.gt()P.lt()P.inside()等),当接受的是对象时,原遍历器中的元素必须与对象相等才会保留;当接受的是判断语句时,原遍历器中的元素满足判断才会保留,接受一个对象相当于P.eq()

示例:

  1. g.V().hasLabel('person').values('age').is(eq(29))

as()

as()可以为某一阶段的对象添加标签。

例如:

  1. g.V('zhoney')
  2. .as('a') // 当前阶段添加a标签
  3. .out('created').in('created')
  4. .as('b') // 为当前阶段添加b标签

where()

where()有三种使用方式:

  • where(P)
  • where(String, P)
  • where(Traversal)

示例:

where(P)方式:

  1. // 查看zhoney的合作伙伴
  2. g.V('zhoney')
  3. .as('a')
  4. .out('created').in('created')
  5. .where(neq('a'))

where(String, P)方式:

  1. // 查看zhoney的合作伙伴
  2. g.V('zhoney')
  3. .as('a')
  4. .out('created').in('created')
  5. .as('b')
  6. .where('b', neq('a'))

where(Traversal)方式:

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

where() + by()

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

示例:

  1. g.V().hasLabel('person').as('a')
  2. .out().hasLabel('person').as('b')
  3. .where('b', gt('a')).by('age')

where() + as() + select()

select()可以通过as()标签获取对象,因此as() + select()可以在某个step处得到历史信息。

示例:

  1. g.V('zhoney').as('a')
  2. .out('created').in('created').not(hasId('zhoney')).as('b')
  3. .select('a', 'b').by('name')
  4. .where('a',neq('b'))

输出结果:

  1. {
  2. "data": [
  3. {
  4. "a": "Zhoney Zhang",
  5. "b": "Jermy Li"
  6. },
  7. {
  8. "a": "Zhoney Zhang",
  9. "b": "Linary Li"
  10. }
  11. ]
  12. }

where() + match()

match()可以保证满足某种模式的对象通过。

示例:

  1. // 查看“zhoney”的合作伙伴,并将“zhoney”及其合作伙伴的名字以map输出
  2. // match().where()方式
  3. g.V('zhoney').match(__.as('a').out('created').as('b'),
  4. __.as('b').in('created').as('c')).
  5. where('a', neq('c'))
  6. .select('a','c').by('name')