GraphX Advent Calendar - Day 09 - グラフに対する編集処理

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

GraphX Advent Calendar 2014 - Adventar 9日目です。

Day 06 から 08 にかけて、辺や頂点に対する編集処理を見てきましたが、今日は、グラフ全体に対する編集処理を見ていきたいと思います。

reverse

とはいえ、これはEdgeRDD.reverse と変わりません。
各Edgeが持つSrcとDstを逆転させます。

graph.reverse.edges.collect.foreach(println(_))

subgraph

これは、グラフ全体の中から特定の条件で抽出する関数です。頂点に対する条件、辺に対する条件、あるいはその両方に対する条件で抽出することができます。

頂点に対する条件で抽出

graph.subgraph(vpred = (vid, v) => v._2 >= 200).vertices.collect.foreach(println(_))

辺に対する条件で抽出

graph.subgraph(epred = edge => edge.attr._1 >= 200).edges.collect.foreach(println(_))

辺と頂点に対する条件で抽出

val subGraph = graph.subgraph(vpred = (vid, v) => v._2 >= 200, epred = edge => edge.attr._1 >= 200)

mask

うーん、これよく分からなかったです。
何がどうマスクされるのか…。
バグか…?
もうちょっと調査してみます。

groupEdges

グラフにおいて、ひとつの頂点の組み合わせの中で、複数の辺が存在する時にそれをマージする処理です。

val edgeGroupedGraph:Graph[(String, Long), (Long, java.util.Date)]
  = graph2.groupEdges(merge = (e1, e2) => (e1._1 + e2._1, if(e1._2.getTime < e2._2.getTime) e1._2 else e2._2))

次回予告

ここまではグラフ構造データのベーシックなデータ処理について見てきましたが、明日からはもう少しグラフっぽい処理を見ていきたいと思います。

※ 今日のサンプルソースはこちらを御参照ください。

graphx-advent-samples/Day09.scala at master · ironpeace/graphx-advent-samples · GitHub