查询结果排序

Gremlin允许对查询的结果进行排序输出,可以指定按某个属性的升序、降序或者随机序的方式输出。排序方式可以通过单独的order()或者order().by()指定。

单独使用order():一般用于遍历器中的元素是属性时。order()会将结果以升序输出。

order()单独使用时,必须保证遍历器(traverser)中的元素是可排序的,在java里就是必须实现java.lang.Comparable接口,否则会抛出异常。

联合使用order().by(),传入排序方式,一般用于遍历器中的元素是属性时:

  • order().by(incr):将结果以升序输出,这也是默认的排序方式
  • order().by(decr):将结果以降序输出
  • order().by(shuffle):将结果以随机序输出,每次执行结果顺序都可能不一样

使用order().by()by()传递的仅是一个排序方式的参数时,也必须保证遍历器(traverser)中的元素是可排序的

联合使用order().by(),传入属性和排序方式,用于遍历器中的元素是顶点或者边时:

  • order().by(key):将结果按照元素属性key的值升序排序,与order().by(key, incr)等效
  • order().by(key, incr):将结果按照元素属性key的值升序排序
  • order().by(key, decr):将结果按照元素属性key的值降序排序
  • order().by(key, shuffle):将结果按照元素属性key的值随机序排列,每次执行的结果都可能不一样

by() step不是一个真正的step,而是”step modulator”,与此类似的还有 as()option() step。

通过by() step可以为某些step添加traversal、funcation、comparator等,通常的使用方式是step().by()...by(),某些step只能添加一个by(),而有一些可以添加任意数量的by() step。

示例:

将 label=’person’的顶点的”age”属性按顺序输出(最后输出的是”age”属性的值)

  1. // 默认顺序(升序)输出 label='person'的顶点的"age"属性值
  2. g.V().hasLabel('person').values('age').order()
  3. // 指定以升序输出
  4. g.V().hasLabel('person').values('age').order().by(incr)
  5. // 指定以降序输出
  6. g.V().hasLabel('person').values('age').order().by(decr)
  7. // 或者
  8. g.V().hasLabel('person').values('age').order().by(desc)
  9. // 按照随机序输出
  10. g.V().hasLabel('person').values('age').order().by(shuffle)

将 label=’person’的顶点,按照”age”属性排序输出顶点(最后输出的是顶点信息)

  1. // 按照"age"属性默认顺序(升序)输出顶点
  2. g.V().hasLabel('person').order().by('age')
  3. // 按照"age"属性升序输出顶点
  4. g.V().hasLabel('person').order().by('age', incr)
  5. // 按照"age"属性降序输出顶点
  6. g.V().hasLabel('person').order().by('age', incr)
  7. // 或者
  8. g.V().hasLabel('person').order().by('age', desc)
  9. // 按照"age"属性随机序输出顶点
  10. g.V().hasLabel('person').order().by('age', shuffle)