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

第16期 Gremlin Steps:

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

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

深入学习Gremlin(16):结果聚集与展开_第1张图片

上一期: 深入学习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')
    

    深入学习Gremlin(16):结果聚集与展开_第2张图片

    示例2:

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

    深入学习Gremlin(16):结果聚集与展开_第3张图片

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

    示例3:

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

    深入学习Gremlin(16):结果聚集与展开_第4张图片

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

    示例1:

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

    深入学习Gremlin(16):结果聚集与展开_第5张图片

    请试一试并比较: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()
    

    深入学习Gremlin(16):结果聚集与展开_第6张图片

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

    示例1:

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

    深入学习Gremlin(16):结果聚集与展开_第7张图片

    示例2:

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

    深入学习Gremlin(16):结果聚集与展开_第8张图片

综合运用

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

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

    深入学习Gremlin(16):结果聚集与展开_第9张图片

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

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

    深入学习Gremlin(16):结果聚集与展开_第10张图片

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

    深入学习Gremlin(16):结果聚集与展开_第11张图片

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

你可能感兴趣的:(Gremlin,HugeGraph,图数据库)