深入学习Gremlin(13):路径选取与过滤

第13期 Gremlin Steps:

as()+select()as()+where()as()+match()as()+dedup()

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

上一期: 深入学习Gremlin(12):数学运算

路径选取与过滤说明

Gremlin支持从走过的路径里选取部分数据作为结果,并且可以在选取时进行条件过滤。

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

  • as()+select(): 对路径中结果进行选取,首先通过as(label)对任意步骤打上标签,然后使用select(label)来选取若干历史步骤的结果作为新结果。此外还可通过select().by(property)来指定根据什么维度进行选取。
  • as()+where(): 以条件匹配的方式进行路径结果选取,只有符合条件的路径才能被选取出来。
  • as()+match(): 以模式匹配的方式进行路径结果选取,只有符合模式的路径才能被选取出来。
  • as()+dedup(): 根据路径中的若干步骤的结果进行去重,只有首次出现的路径段才能被选取出来。

实例讲解

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

  1. Step as()...select():对路径中结果进行选取

    示例1:

    // 从路径中选取第1步和第3步的结果作为最终结果
    g.V('2:HugeGraph').as('a').out().as('b').out().as('c').select('a', 'c')
    

    g.V(id).as().select()

    对比:不选取时获取的完整路径
    g.V(id).as().select()
    g.V('2:HugeGraph').as('a').out().as('b').out().as('c').path()

    示例2:

    // 从集合中选择最后一个元素
    g.V('2:HugeGraph').as("a").repeat(out().as("a")).times(2).select(last, "a")
    

    g.V(id).as().select(last)

    试一试:

    select(all, "a")

    select(first, "a")

    示例3:

    // 通过by()来指定选取的维度
    g.V('2:HugeGraph').as('a').out().as('b').out().as('c').select('a', 'c').by('name').by('name')
    

    g.V(id).as().select().by()

    示例4(特殊用法:map选择):

    // 从map中选择指定key的值
    g.V().valueMap().select('tag').dedup()
    

    g.V().valueMap().select()

  2. Step as()...where():以条件匹配的方式进行路径结果选取

    示例1:

    // 选取满足第1步和第3步“lang”属性相等的路径
    g.V('2:HugeGraph').as('a').out().as('b').out().as('c').where('a', eq('c')).by('lang').select('a', 'b', 'c').by(id)
    

    g.V(id).as().where()

  3. Step as()+match():以模式匹配的方式进行路径结果选取

    示例1:

    // 选取满足两个模式的路径:
    // 1.第3步有OUT节点
    // 2.第3步的OUT节点的指定路径不允许回到第二步的节点
    g.V('2:HugeGraph').as('a').out().as('b').match(__.as('b').out().as('c'),__.not(__.as('c').out().in('define').as('b'))).select('a','b','c').by(id)
    

    g.V(id).as().match()

    Step match 的详细介绍参见第17期

  4. Step as()+debup():路径去重

    示例1:

    // 以路径中的前3步作为去重依据,对路径进行去重
    g.V('2:HugeGraph').as('a').out().as('b').out().as('c').in().dedup('a', 'b', 'c').path()
    

    g.V(id).as().dedup()

综合运用

  1. 查询支持Gremlin语言的软件,至少由2个相互认识的且在北京的作者完成

    // 获取支持Gremlin语言的软件,
    // 并且作者是至少为2个相互认识的人,
    // 且这两个作者都在北京
    g.V('3:Gremlin').in('supports').as('software').match(__.as('software').in('created').as('person1'),__.as('person1').both('knows').as('person2'),__.as('person2').out('created').as('software'),__.as('person1').has('addr', 'Beijing'),__.as('person2').has('addr', 'Beijing')).select('software').dedup()
    

    software-both-create-by-friends

  2. 查询支持Gremlin语言的软件的作者,并按边权重排序

    // 获取支持Gremlin语言的软件,
    // 并查找其作者,并对中间经过的边打标签
    // 按照边的权重进行排序
    // 选取软件、权重、作者作为结果
    g.V('3:Gremlin').in('supports').as('s').inE('created').as('e').outV().as('t').order().by(select('e').by('weight'), decr).select('s', 'e', 't').by('name').by('weight')
    

    author-select-order-by-weight

下一期:深入学习Gremlin(14):分支


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

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部