学习Gremlin - 14.路径选取与过滤

14.路径选取与过滤

14.1、说明

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

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

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

14.2、实例讲解

14.2.1、 as()...select():对路径中结果进行选取
// 从路径中选取第1步和第3步的结果作为最终结果
g.V('2:HugeGraph').as('a')
    .out().as('b')
    .out().as('c')
    .select('a', 'c')
// 从集合中选择最后一个元素
g.V('2:HugeGraph').as("a")
    .repeat(out().as("a")).times(2)
    .select(last, "a")
// 通过by()来指定选取的维度
g.V('2:HugeGraph').as('a')
    .out().as('b')
    .out().as('c')
    .select('a', 'c')
    .by('name').by('name')
// 从map中选择指定key的值
g.V().valueMap().select('tag').dedup()
14.2.2、 as()...where():以条件匹配的方式进行路径结果选取
// 选取满足第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)
14.2.3、 as()+match():以模式匹配的方式进行路径结果选取
// 选取满足两个模式的路径:
// 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)
14.2.4、 as()+debup():路径去重
// 以路径中的前3步作为去重依据,对路径进行去重
g.V('2:HugeGraph').as('a')
    .out().as('b').out().as('c').in()
    .dedup('a', 'b', 'c').path()

14.3、综合运用

14.3.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()
14.3.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')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值