深入学习Gremlin(16):结果聚集与展开

第16期 Gremlin Steps:

aggregate()store()unfold()fold()

本系列文章的Gremlin示例均在HugeGraph图数据库上执行,环境搭建可参考准备Gremlin执行环境,本文示例均以其中的“TinkerPop关系图”为初始数据,如下图所示:

init-data

上一期: 深入学习Gremlin(15):合并

结果聚集与展开说明

Gremlin在路径游走的时候,可以将某一步的所有结果收集到一个集合里面(我们称之为结果聚集),以备在后续步骤中使用;此外还可在需要的时候将聚集的结果展开。

下面讲解实现上述功能的具体Step:

  • aggregate(): 聚集路径中指定步骤的所有结果,通过aggregate(label)对任意步骤打上标签,在此之前的步骤的结果均会被收集到此标签所代表的集合中(但并不会影响路径的游走),可配合bycap一起使用,通过cap(label)来获取该结果集合,此外还可通过select(label)without(label)等其它方式读取。
  • store(): 类似aggregate(),只是以Lazy的方式来收集。
  • unfold(): 将集合展开平铺,路径将扩张。
  • fold(): 将多个元素折叠为一个集合,路径将收缩。

实例讲解

下面通过实例来深入理解每一个操作。

  1. Step aggregate():聚集路径中的结果

    示例1:

    // 收集第1步的结果到集合'x'中
    // 注意:不影响后续结果
    g.V('2:HugeGraph').out().aggregate('x')
    

    g.V(id).out().aggregate()

    示例2:

    // 收集第1步的结果到集合'x'中
    // 并通过cap取出结果
    // 与示例1比较,结果的层次更深了
    g.V('2:HugeGraph').out().aggregate('x').cap('x')
    

    g.V(id).out().aggregate().cap()

    试一试:将cap('x')换为select('x')看看有什么区别

    示例3:

    // 通过by()来指定聚集的维度
    g.V('2:HugeGraph').out().aggregate('x').by('name').cap('x')
    

    g.V(id).out().aggregate().by()

  2. Step store():以Lazy的方式来收集结果

    示例1:

    // 以Lazy方式收集,后续步骤使用limit限制时,
    // 路径中取到第2个结果时将会停止,
    // 因此集合中有2个元素。
    g.V().store('x').by('name').limit(1).cap('x')
    

    g.V(id).out().store().cap()

    请试一试并比较:g.V().aggregate('x').by('name').limit(1).cap('x')

  3. Step unfold():以把集合展开、平铺

    示例1:

    // 将集合‘x’展开(层级变少了)
    g.V('2:HugeGraph').out().aggregate('x').by('name').cap('x').unfold()
    

    g.V(id).out().aggregate().unfold()

  4. Step fold():将元素折叠为集合

    示例1:

    // 将属性折叠起来(层级变深)
    g.V('2:HugeGraph').out().values('name').fold()
    

    g.V(id).out().fold()

    示例2:

    // 统计所有'name'属性的长度
    // 其中通过lambuda表达式累加字符串长度
    g.V('2:HugeGraph').out().values('name').fold(0) {a,b -> a + b.length()}
    

    g.V(id).out().fold().reduce()

综合运用

  1. 查询一个软件的同类别软件,但不包括自身在内

    // 查询与HugeGraph类似支持Gremlin语言的软件
    // 但不包含自身和一步邻居
    // 比较:请看看去除where语句的效果
    g.V('2:HugeGraph').aggregate('x').out().aggregate('x').out().in().where(without('x'))
    

    out-in-without-loop

  2. 查询2度之内的所有邻居的名称

    // 查询与HugeGraph的两度OUT邻居
    // 并收集这些到‘a’集合里面,
    // 最终以‘name’属性展示其邻居
    g.V('2:HugeGraph').out().aggregate('a').out().aggregate('a').cap('a').unfold().values('name')
    

    kneibor2-name

  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())
    

    sotfware-authors-gte3

下一期:深入学习Gremlin(17):模式匹配


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部