深入学习Gremlin(16):结果聚集与展开
第16期 Gremlin Steps:
aggregate()、store()、unfold()、fold()
本系列文章的Gremlin示例均在HugeGraph图数据库上执行,环境搭建可参考准备Gremlin执行环境,本文示例均以其中的“TinkerPop关系图”为初始数据,如下图所示:

上一期: 深入学习Gremlin(15):合并
结果聚集与展开说明
Gremlin在路径游走的时候,可以将某一步的所有结果收集到一个集合里面(我们称之为结果聚集),以备在后续步骤中使用;此外还可在需要的时候将聚集的结果展开。
下面讲解实现上述功能的具体Step:
aggregate(): 聚集路径中指定步骤的所有结果,通过aggregate(label)对任意步骤打上标签,在此之前的步骤的结果均会被收集到此标签所代表的集合中(但并不会影响路径的游走),可配合by及cap一起使用,通过cap(label)来获取该结果集合,此外还可通过select(label)或without(label)等其它方式读取。store(): 类似aggregate(),只是以Lazy的方式来收集。unfold(): 将集合展开平铺,路径将扩张。fold(): 将多个元素折叠为一个集合,路径将收缩。
实例讲解
下面通过实例来深入理解每一个操作。
-
Step
aggregate():聚集路径中的结果示例1:
// 收集第1步的结果到集合'x'中 // 注意:不影响后续结果 g.V('2:HugeGraph').out().aggregate('x')
示例2:
// 收集第1步的结果到集合'x'中 // 并通过cap取出结果 // 与示例1比较,结果的层次更深了 g.V('2:HugeGraph').out().aggregate('x').cap('x')
试一试:将
cap('x')换为select('x')看看有什么区别示例3:
// 通过by()来指定聚集的维度 g.V('2:HugeGraph').out().aggregate('x').by('name').cap('x')
-
Step
store():以Lazy的方式来收集结果示例1:
// 以Lazy方式收集,后续步骤使用limit限制时, // 路径中取到第2个结果时将会停止, // 因此集合中有2个元素。 g.V().store('x').by('name').limit(1).cap('x')
请试一试并比较:
g.V().aggregate('x').by('name').limit(1).cap('x') -
Step
unfold():以把集合展开、平铺示例1:
// 将集合‘x’展开(层级变少了) g.V('2:HugeGraph').out().aggregate('x').by('name').cap('x').unfold()
-
Step
fold():将元素折叠为集合示例1:
// 将属性折叠起来(层级变深) g.V('2:HugeGraph').out().values('name').fold()
示例2:
// 统计所有'name'属性的长度 // 其中通过lambuda表达式累加字符串长度 g.V('2:HugeGraph').out().values('name').fold(0) {a,b -> a + b.length()}
综合运用
-
查询一个软件的同类别软件,但不包括自身在内
// 查询与HugeGraph类似支持Gremlin语言的软件 // 但不包含自身和一步邻居 // 比较:请看看去除where语句的效果 g.V('2:HugeGraph').aggregate('x').out().aggregate('x').out().in().where(without('x'))
-
查询2度之内的所有邻居的名称
// 查询与HugeGraph的两度OUT邻居 // 并收集这些到‘a’集合里面, // 最终以‘name’属性展示其邻居 g.V('2:HugeGraph').out().aggregate('a').out().aggregate('a').cap('a').unfold().values('name')
-
查询由多人合作的软件及其各作者的名称
// 查询所有由3个以上作者完成的软件 // 并显示它的名称及其作者 g.V().as('software', 'authors').where(__.in('created').count().is(gte(3))).select('software', 'authors').by('name').by(__.in('created').values('name').fold())
下一期:深入学习Gremlin(17):模式匹配
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
