学习Gremlin - 17.结果聚集与展开

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())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值