25.附加操作sideEffect
25.1、说明
Gremlin在路径遍历的时候,可以在路径中做一些额外的附加操作,这个附加操作不会改变上一步的结果,会原封不动的传递到下一步去。附加操作看起来就像透明的,但实际上可以将附加操作的处理结果存储到外部变量中去。
下面讲解实现上述功能的具体Step:
-
sideEffect(): 在某个位置插入一个附加操作,以执行额外的操作,通常可与store、sack等配合使用。另外如下一些Step本质上也是sideEffect:
group(string)、groupCount(string)、subgraph(string)、aggregate(string)、inject(string)、profile(string)等。
-
withSideEffect():绑定初始值到变量上,等价于sideEffect的效果。
25.2、实例讲解
25.2.1、 sideEffect()
: 附加操作
// 将所有顶点打印出来
// sideEffect本身不影响结果
def list=[]
g.V().hasLabel('person')
.sideEffect{list.add("vertex:"+it)}
.toList()
// 将sideEffect处理的结果打印出来
def list=[]
g.V().hasLabel('person')
.sideEffect{list.add("vertex:"+it)}
.toList()
list
注意:Gremlin中的最后一行内容表示输出的结果
// 将sideEffect结果存到变量中
g.V().hasLabel('person')
.sideEffect(outE().count().store("o"))
.sideEffect(inE().count().store("i"))
.cap("o","i")
25.2.2、 withSideEffect()
: 绑定变量初始值
// 初始化一个变量以供后续条件判断中使用
// 查找javeme的共同作者,且名称在初始集合中
g.withSideEffect('p',['Linary Li','Zhoney Zhang','Tom'])
.V('javeme').out('created').in('created')
.values('name').where(within('p'))
25.3、综合运用
25.3.1、 计算度中心性(Degree Centrality)
// 利用sideEffect计算3种度中心性
g.V().group('both').by().by(bothE().count())
.group('out').by().by(outE().count())
.group('in').by().by(inE().count())
.cap('both', 'out', 'in')