Press "Enter" to skip to content

Go言語で GraphML をパースする

このブログでは今まで、グラフの出力形式に edgelist を使ってきました。この edgelist は csv のような形で処理できるのでシンプルで良かったのですが、最近扱うグラフが複雑化してきたので別のファイル形式に変更しようと決めました。

調べてみると、複雑なグラフを記述するのには GraphMLと呼ばれる、 XML 形式のファイルが適しているようでした。早速これを使ってみます。

GraphMLの概要

GraphML File Format は基本的にXMLファイルなので、Go言語のXMLパッケージを使ってパースできます。 GraphML の具体的な構造に関してはこのページ(英語)の説明がわかりやすいです。

一番シンプルなグラフの場合、XML構造は

となります。

XML は要素主体に記述する方法と属性主体に記述する方法に分けられますが、 GraphMLは属性主体の記述をする みたいです。したがってノード情報やエッジ情報などはすべてタグの内部に

<edge id="e0" source="n5::n0" target="n5::n2" />

のように記述されます。Go言語で GraphML をパースする場合、このタグ内に記述された属性値を取得しに行きます。

Go言語でパースする

今回は次の GraphML をパースしてみます。

Go言語で XML をパースする際は XML の構造に沿った形で構造体を作り、encoding/xml パッケージでパースしていきます。今回はこの記事を参考にして、このような形でパースしてみました。

{http://graphml.graphdrawing.org/xmlns graphml}
Node: n0
Node: n1
Node: n2
Node: n3
Node: n4
Node: n5
Node: n6
Node: n7
Node: n8
Node: n9
Node: n10
Edge: n0 <=> n2
Edge: n1 <=> n2
Edge: n2 <=> n3
Edge: n3 <=> n5
Edge: n3 <=> n4
Edge: n4 <=> n6
Edge: n6 <=> n5
Edge: n5 <=> n7
Edge: n6 <=> n8
Edge: n8 <=> n7
Edge: n8 <=> n9
Edge: n8 <=> n10

ノードとエッジに関する属性情報が取得できていることがわかります。今回はシンプルなグラフで試しましたが、より複雑なグラフに対しても、構造体を適宜定義していけばよいと思われます。

Be First to Comment

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です