学习Gremlin - 21.遍历栅栏barrier

21.遍历栅栏barrier

21.1、说明

Gremlin在路径遍历的时候,可以将栅栏barrier插入到懒加载的遍历流水线中,以使得barrier之前的步骤都执行完成之后再继续往下执行。barrier主要有2个好处:1、可以强制改变深度优先搜索为广度优先搜索,2、由于通过层的bulking模式可以优化大量重复的数据访问。

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

  • barrier(): 在某个位置插入一个栅栏,以强制该位置之前的步骤必须都执行完成才可以继续往后执行,比如g.V().both().barrier().both()只有在第一个both()全部完成之后才会执行第二个both()。

21.2、实例讲解

21.2.1、 遍历时设置栅栏
// 将所有顶点打印出来
// 打印完一轮之后再打印一轮
def list=[]
g.V().sideEffect{list.add("first: "+it)}
     .barrier()
     .sideEffect{list.add("second: "+it)}
     .iterate()
list
// 打印first后打印second,
// 直到一轮所有的顶点都完成
def list=[]
g.V().sideEffect{list.add("first: "+it)}
     .sideEffect{list.add("second: "+it)}
     .iterate()
list
// 禁用自动barrier策略
g = g.withoutStrategies(LazyBarrierStrategy)
g.V()
 .both().barrier()
 .both().barrier()
 .both().barrier()
 .both().barrier()
 .both().barrier()
 .groupCount()
 .order(local).by(values, decr)
// 通过lambda函数来指定放入口袋的行为
// 注意:提供的初始值为Map类型,而且
// 当traverser分裂时会拷贝Map
g = g.withoutStrategies(LazyBarrierStrategy)
g.V()
 .both()
 .both()
 .both()
 .both()
 .both()
 .groupCount()
 .order(local).by(values, decr)

注意:LazyBarrierStrategy是默认策略,该策略会在合适的地方插入barrier,因此这里先禁用了该策略。

21.2.2、 barrier()相关Step:

事实上除了可显示的插入barrier栅栏外,还有不少Step会隐式插入barrier,包括 order(), sample(), dedup(), aggregate(), fold(), count(), sum(), max(), min(), group(), groupCount(), cap()等。

21.3、综合运用

21.3.1、 计算特征向量中心性(Eigenvector Centrality)
// 利用隐式barrier计算特征向量中心性
// 包括groupCount、cap,按照降序排序
g.V().repeat(both().groupCount('m'))
    .times(5).cap('m')
    .order(local).by(values, decr)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值