GraphX Advent Calendar - Day 10 - 次数情報の計算と、隣接情報の収集

f:id:teppei-studio:20100306105411j:plain

GraphX Advent Calendar 2014 - Adventar 10日目です。今日からは、グラフ処理っぽい処理を扱っていきます。

次数情報の計算

次数( degree )とは、頂点に接続している辺の数のことです。その頂点に接続してきている辺の数を入次数( in degree )、その頂点から接続している辺の数を出次数( out degree )といいます。

次数情報の出力結果は、( VertexID, Int ) というタプル型で得られます。

入次数の計算

graph.inDegrees.collect.foreach(d => println(d._1 + "'s inDegree is " + d._2))

出次数の計算

graph.outDegrees.collect.foreach(d => println(d._1 + "'s outDegree is " + d._2))

次数の計算(入・出合わせて)

graph.degrees.collect.foreach(d => println(d._1 + "'s degree is " + d._2))

隣接情報の収集

隣接情報とは、その頂点に直接接続している頂点、つまり、お隣さんの情報です。

collectNeighborIds

この関数では、隣接頂点のID情報だけ取得することができます。取得結果は、( VertexID, Array ( VertexID) ) というタプル型で得られます。

接続元の隣接頂点を収集
graph.collectNeighborIds(EdgeDirection.In).collect
	.foreach(n => println(n._1 + "'s in neighbors : " + n._2.mkString(",")))
接続先の隣接頂点を収集
graph.collectNeighborIds(EdgeDirection.Out).collect
	.foreach(n => println(n._1 + "'s out neighbors : " + n._2.mkString(",")))
接続先・元に関わらず隣接頂点を収集
graph.collectNeighborIds(EdgeDirection.Either).collect
	.foreach(n => println(n._1 + "'s neighbors : " + n._2.distinct.mkString(",")))

collectNeighbors

この関数では、隣接頂点の情報そのままを取得することができます。取得結果は、( VertexID, Array ( ( VertexID, VD ) ) ) というタプル型で得られます。

接続元の隣接頂点を収集
graph.collectNeighbors(EdgeDirection.In).collect
	.foreach(n => println(n._1 + "'s in neighbors : " + n._2.mkString(",")))
接続先の隣接頂点を収集
graph.collectNeighbors(EdgeDirection.Out).collect
	.foreach(n => println(n._1 + "'s out neighbors : " + n._2.mkString(",")))
接続先・元に関わらず隣接頂点を収集
graph.collectNeighbors(EdgeDirection.Either).collect
	.foreach(n => println(n._1 + "'s neighbors : " + n._2.distinct.mkString(",")))

次回予告

明日は、いよいよグラフ処理で最も有名な、ページランクアルゴリズムについて見ていきます!

今日のサンプルソールはこちらを御参照ください。
graphx-advent-samples/Day10.scala at master · ironpeace/graphx-advent-samples · GitHub