17.结果聚集与展开
17.1、说明
Gremlin在路径游走的时候,可以将某一步的所有结果收集到一个集合里面(我们称之为结果聚集),以备在后续步骤中使用;此外还可在需要的时候将聚集的结果展开。
下面讲解实现上述功能的具体Step:
aggregate(): 聚集路径中指定步骤的所有结果,通过aggregate(label)对任意步骤打上标签,在此之前的步骤的结果均会被收集到此标签所代表的集合中(但并不会影响路径的游走),可配合by及cap一起使用,通过cap(label)来获取该结果集合,此外还可通过select(label)或without(label)等其它方式读取。
-
store(): 类似aggregate(),只是以Lazy的方式来收集。
-
unfold(): 将集合展开平铺,路径将扩张。
-
fold(): 将多个元素折叠为一个集合,路径将收缩。
17.2、实例讲解
17.2.1、 aggregate()
:聚集路径中的结果
// 收集第1步的结果到集合'x'中
// 注意:不影响后续结果
g.V('2:HugeGraph').out().aggregate('x')
// 收集第1步的结果到集合'x'中
// 并通过cap取出结果
// 与示例1比较,结果的层次更深了
g.V('2:HugeGraph').out()
.aggregate('x').cap('x')
// 通过by()来指定聚集的维度
g.V('2:HugeGraph').out()
.aggregate('x').by('name')
.cap('x')
17.2.2、 store()
:以Lazy的方式来收集结果
// 以Lazy方式收集,后续步骤使用limit限制时,
// 路径中取到第2个结果时将会停止,
// 因此集合中有2个元素。
g.V().store('x').by('name').limit(1).cap('x')
17.2.3、 unfold()
:以把集合展开、平铺
// 将集合‘x’展开(层级变少了)
g.V('2:HugeGraph').out()
.aggregate('x').by('name')
.cap('x').unfold()
17.2.4、 fold()
:将元素折叠为集合
// 将属性折叠起来(层级变深)
g.V('2:HugeGraph').out()
.values('name').fold()
// 统计所有'name'属性的长度
// 其中通过lambuda表达式累加字符串长度
g.V('2:HugeGraph').out().values('name')
.fold(0) {a,b -> a + b.length()}
17.3、综合运用
17.3.1、 查询一个软件的同类别软件,但不包括自身在内
// 查询与HugeGraph类似支持Gremlin语言的软件
// 但不包含自身和一步邻居
// 比较:请看看去除where语句的效果
g.V('2:HugeGraph').aggregate('x')
.out().aggregate('x')
.out().in()
.where(without('x'))
17.3.2、 查询2度之内的所有邻居的名称
// 查
询与HugeGraph的两度OUT邻居
// 并收集这些到‘a’集合里面,
// 最终以‘name’属性展示其邻居
g.V('2:HugeGraph').out().aggregate('a')
.out().aggregate('a').cap('a')
.unfold().values('name')
17.3.3、 查询由多人合作的软件及其各作者的名称
// 查询所有由3个以上作者完成的软件
// 并显示它的名称及其作者
g.V().as('software', 'authors')
.where(__.in('created').count().is(gte(3)))
.select('software', 'authors')
.by('name')
.by(__.in('created').values('name').fold())