0 打開一個新的圖庫
本節(jié)的命令使用的測試數(shù)據(jù)是tinkerpop官方提供的Modern圖庫,使用以下命令可以加載tinkerpop modern圖庫戈锻,它包含6個vertex和6條edge
$ ./bin/gremlin.sh
gremlin> graph = TinkerFactory.createModern()
==>tinkergraph[vertices:6 edges:6]
gremlin>
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
image.png
1 group
聚合操作立倍,通過by()指定聚合的key
根據(jù)vertex的label進行聚合
gremlin> g.V().group().by(label)
==>[software:[v[3],v[5]],person:[v[1],v[2],v[4],v[6]]]
同時通過by指定聚合的內(nèi)容
gremlin> g.V().group().by(label).by('name')
==>[software:[lop,ripple],person:[marko,vadas,josh,peter]]
gremlin> g.V().group().by(label).by(count())
==>[software:2,person:4]
2 groupCount
計算每個聚合key聚合的元素的個數(shù)
gremlin> g.V().groupCount().by(label)
==>[software:2,person:4]
# 上面的語句等價與下面這個語句
gremlin> g.V().group().by(label).by(count())
==>[software:2,person:4]
gremlin>
3 fold/unfold
fold()將流聚合為一個list摸恍。unfold則執(zhí)行相反的功能
gremlin> g.V(1).out('knows').values('name').fold()
==>[vadas,josh]
下面的例子可以清晰的說明fold的功能鹃骂。不使用fold,流中有2個元素亮蛔。fold后流中只有一個元素了,它是一個list擎厢。這個list中有2個元素
gremlin> g.V(1).out('knows').values('name').count()
==>2
gremlin> g.V(1).out('knows').values('name').fold().count()
==>1
gremlin> g.V(1).out('knows').values('name').fold().count(local)
==>2
通過fold執(zhí)行聚合計算
gremlin> g.V(1).out('knows').values('name').fold(0) {a,b -> a + b.length()}
==>9
gremlin> g.V().values('age').fold(0) {a,b -> a + b}
==>123
gremlin> g.V().values('age').fold(0, sum)
==>123
gremlin> g.V().values('age').sum()
==>123
4 union
將多個traversal的結(jié)果合并輸出
gremlin> g.V(4).union(
__.in().values('age'),
out().values('lang'))
==>29
==>java
==>java
gremlin> g.V(4).union(
__.in().values('age'),
out().values('lang')).path()
==>[v[4],v[1],29]
==>[v[4],v[5],java]
==>[v[4],v[3],java]
4 cap
收集traversal中的sideEffect內(nèi)容
gremlin> g.V().groupCount('a').by(label).cap('a') //1\
==>[software:2,person:4]
gremlin> g.V().groupCount('a').by(label).groupCount('b').by(outE().count()).cap('a','b') //2\
==>[a:[software:2,person:4],b:[0:3,1:1,2:1,3:1]]