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