第7期 Gremlin Steps:
order()
、by()
本系列文章的Gremlin示例均在HugeGraph图数据库上执行,环境搭建可参考准备Gremlin执行环境,本文示例均以其中的“TinkerPop关系图”为初始数据。
tinkerpop关系图排序说明
Gremlin允许对查询的结果进行排序输出,可以指定按某个属性的升序、降序或是随机序的方式输出。排序方式可以通过单独的order()
或者order().by(...)
指定,而by() step
又有一些变种,下面分别讲解order()
和order().by(...)
的用法。
单独使用order()
Step,一般用于遍历器中的元素是属性时:
- order()会将结果以升序输出;
order()单独使用时,必须保证遍历器(traverser)中的元素是可排序的,在 java 里就是必须实现
java.lang.Comparable
接口,否则会抛出异常。
联合使用order().by(...)
Step,传入排序方式,一般用于遍历器中的元素是属性时:
-
order().by(incr)
: 将结果以升序输出,这也是默认的排序方式; -
order().by(decr)
: 将结果以降序输出; -
order().by(shuffle)
: 将结果以随机序输出,每次执行结果顺序都可能不一样。
使用 order().by(...) step 但是 by() 传递的仅是一个排序方式的参数时,也必须保证遍历器(traverser)中的元素是可排序的。
联合使用order().by(...)
Step,传入属性和排序方式,用于遍历器中的元素是顶点或边时:
-
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说明
by()
step不是一个真正的step,而是一个“step modulator”,与此类似的还有as()
和option()
step。通过by()
step可以为某些step添加traversal、function、comparator等,通常的使用方式是step().by()...by(),某些step只能添加一个by()
,而有一些可以添加任意数量的by()
step。
实例讲解
-
order()
,使用默认的排序(升序)输出
// 以默认排序输出所有顶点的"name"属性值
g.V().values('name').order()
-
order().by(incr)
,指定以升序输出
// 以升序输出所有顶点的"name"属性值
g.V().values('name').order().by(incr)
-
order().by(decr)
,指定以降序输出
// 以降序输出所有顶点的"name"属性值
g.V().values('name').order().by(decr)
-
order().by(shuffle)
,指定以随机序输出
// 以随机序输出所有顶点的"name"属性值
g.V().values('name').order().by(shuffle)
-
order().by(key)
,按照元素属性key的值升序(默认)排列
// 将"person"类型的顶点按照"age"升序(默认)排列输出
g.V().hasLabel('person').order().by('age')
image.png
为了使"age"属性排列显示得更清晰,我们取出顶点的"age"属性
// 将"person"类型的顶点按照"age"升序(默认)排列,并获取"age"属性
g.V().hasLabel('person').order().by('age').values('age')
-
order().by(key, incr)
,按照元素属性key的值升序排列
// 将"person"类型的顶点按照"age"升序排列,并获取"age"属性
g.V().hasLabel('person').order().by('age', incr).values('age')
-
order().by(key, desc)
,按照元素属性key的值降序排列
// 将"person"类型的顶点按照"age"降序排列输出,并获取"age"属性
g.V().hasLabel('person').order().by('age', decr).values('age')
-
order().by(key, shuffle)
,按照元素属性key的值随机序排列
// 将"person"类型的顶点按照"age"随机序排列输出,并获取"age"属性
g.V().hasLabel('person').order().by('age', shuffle).values('age')
网友评论