Intelligent Technology's Technical Blog

株式会社インテリジェントテクノロジーの技術情報ブログです。

『オープンデータ』を調べてみる

こんにちは、間藤です。
最近、「オープンデータ」というワードをテレビで耳する機会がありました。ぼんやりとは、どんなものなのか理解できたものの、もう少し掘り下げてみようということで、情報収集してみました。
ということで、今回は「オープンデータ」について取り上げます。

まずは概要から

「オープンデータ」についての特集をテレビ番組で観たとき、思いだしたのが「Code for America」です。以下は、Code for Americaの創業者であるジェニファー・パルカ氏のTEDでのプレゼンテーション動画です。
※日本語字幕付きで見るためには、Flash Playerがインストールされている必要があるようです。

エンジニアやウェブデザイナー地方自治体に派遣され、新しいWebサービスやアプリケーションを、コストや期間をかけずに作成し、中には会社が設立されたケースもあるようです。つまり、新しいビジネスが生まれる機会にもなっているわけです。作成されたアプリを見てみると、行政機関が提供するサービスとは思えない秀逸なデザインです。

Code for America 2012 Annual Report
f:id:IntelligentTechnology:20131127165123p:plain

この「Code for America」のような取り組みは、「オープンデータ」と密接な関係があると思います。「オープンデータ」が注目される理由の一つが、地方自治体のような公共機関の持つ様々な情報をオープンにし、それらを有効活用することで新たなサービスを生み出すことにあるからです。

日本でもこのような取り組みはすでにいろいろなところで始まっています。例えば、福井県鯖江市は、オープンデータに積極的に取り込んでいる地方自治体として注目を集めています。

また、総務省もオープンデータに関する実証実験を行い、その結果が公開されています。

これら以外にも「オープンデータ」というキーワードで類似の取り組みをたくさん見つけることができると思います。

技術的な側面から

さて、オープンデータに関して、技術的にはどのようなことを押さえておくべきなんでしょうか。
私なりに情報収集した結果をまとめてみたいと思います。

データをオープンするにあたり、どのような方法でオープンにするのかということは重要です。それぞれが別々の方法で行ってしまうと、いざ利用しようとしたときに個別に対応しなければならず、とても不便だからです。つまり、標準的なデータ規格が必要だということです。これに関連して、いくつかキーワードを紹介します。用語の説明は、主にウィキペディアの記述を参考にしています。

Linked Open Data(LOD)

ウェブ上でコンピュータ処理に適したデータを公開・共有するための技術の総称です。従来のウェブがHTML文書間のハイパーリンクによる人間のための情報空間の構築を目的としてきたことに対応して、Linked Open Dataでは構造化されたデータ同士をリンクさせることでコンピュータが利用可能な「データのウェブ」の構築を目指しています(→セマンティック・ウェブ)。
日頃私たちが目にするWeb上の情報は、人間向けに作成されたものであって、コンピュータが扱いやすいようにデザインされたものではありません。それをコンピュータのためのデータにするための技術ということだと私は理解しています。

Resource Description Framework(RDF

セマンティック・ウェブを実現するための技術的な構成要素の1つです。
RDFモデルのデータでは、データをサブジェクト(主語)」「プロパティ(述語)」「オブジェクト(目的語)」という3つの組み合わせで表現し、これを「トリプル」と呼びます。

f:id:IntelligentTechnology:20131125170929p:plain

RDFでは、コンピュータがデータを正しく解釈するためURIを利用します。(これについては後述します)

SPARQL

RDFクエリ言語の一種です。
私自身、SPARQLの文法について今回それほど掘り下げて調べることはできていませんが、この後具体的な例を取り上げて、その概要が伝わるようにしてみたいと思います。

なお、キーワードとして以上の3つを取り上げましたが、これらは私が今回オープンデータについて調べる過程で見つけたものであって、オープンデータにまつわる技術要素を網羅しているものではありません。

DBペディアを利用してみる

ウィキペディアを利用される方は多いと思います。ウィキペディアでわれわれが見る情報は、人間向けに作成されたものですが、これをコンピュータが利用可能な「データのウェブ」として構築したものが「DBペディア」です。日本語版も存在します。
いったいどんなものなのか知るため、以下のページをご覧になってください。

http://ja.dbpedia.org/resource/東京都

これは、日本語版DBペディアの東京都に関するページです。
これを見ると、RDFのトリプルがたくさん含まれていることがわかります。以下に例を挙げます。

f:id:IntelligentTechnology:20131125170823p:plain

これは、オブジェクトもURIで表されている例ですが、オブジェクトはUnicodeの文字列であっても構いません。

f:id:IntelligentTechnology:20131125171339p:plain

SPARQLを使ってみる

さて、このDBペディアからデータを抽出する方法について見ていきましょう。
DBペディアには、SPARQLを使ってデータ抽出できるサービス(SPARQL Endpoint)が提供されています。
このページで、「日本の都道府県知事の名前」を検索してみます。

「Query Text」に以下のSPARQLを入力し、[Run Query]ボタンを押して実行してください。

PREFIX dbpedia-owl:<http://dbpedia.org/ontology/>
PREFIX dbpedia-ja:<http://ja.dbpedia.org/resource/>

SELECT ?prefecture ?governor
WHERE {
    ?prefecture dbpedia-owl:country dbpedia-ja:日本.
    ?prefecture dbpedia-owl:leaderName ?governor.
}

そうすると、日本の都道府県と知事が一覧されます。

f:id:IntelligentTechnology:20131127165540p:plain

SQLをご存知の方なら何となくわかってしまうと思いますが、このクエリーについて説明します。
頭に "?" を付けているのが変数になります。この例では、?prefectureと?governorの2つが変数です。
WHEREには2つの抽出条件が記載されています。
1つ目の条件に注目すると、3つのパートで構成されているのがわかります。

?prefecture   dbpedia-owl:country   dbpedia-ja:日本.

1つ目が「サブジェクト」、2つ目が「プロパティ」、3つ目が「オブジェクト」です。
この場合、サブジェクトのところが変数になっていますが、dbpedia-owl:countryというプロパティがdbpedia-ja:日本であるサブジェクトがこの変数に抽出されることになります。つまり、これで日本の都道府県を選択したことになります。プロパティやオブジェクトは、URIで表されますが(オブジェクトはUnicodeの文字列の場合もあります)、そのままで表現すると、上記の条件は以下のように長くなってしまいます。

?prefecture  <http://dbpedia.org/ontology/country>  <http://ja.dbpedia.org/resource/日本>.

そこで、PREFIXでURIを略式で記述できるようにしています。

PREFIX dbpedia-owl:<http://dbpedia.org/ontology/>
PREFIX dbpedia-ja:<http://ja.dbpedia.org/resource/>

ただ、"dbpedia-owl"や"dbpedia-ja"は、暗黙的に解釈されるため、ここではPREFIXの指定を省略しても構わないようです。
2つ目の条件は、各都道府県の知事の名前を取得するためのものです。?governorという変数に結果が格納されることになります。

?prefecture   dbpedia-owl:leaderName   ?governor.

この例の2つの条件は、両方ともサブジェクトに?prefectureを指定していましたが、以下のように書くこともできます。

SELECT ?prefecture ?governor
WHERE {
    ?prefecture dbpedia-owl:country dbpedia-ja:日本;
                dbpedia-owl:leaderName ?governor.
}

次に、抽出結果をソートしてみたいと思います。
サブジェクトである都道府県のプロパティに、dbpedia-owl:areaCodeがあります。この値でソートするには、以下のようにします。

SELECT DISTINCT ?prefecture ?governor
WHERE {
    ?prefecture prop-ja:知事 ?governor;
                dbpedia-owl:country dbpedia-ja:日本;
                dbpedia-owl:areaCode ?areacode.
    FILTER regex(?areacode, "^[0-9]", "i").
}
ORDER BY ?areacode

各都道府県のareaCodeには、「団体コード」というものと、ISOの3166-2規格で定められたコードの2つが割り当てられているようです。例えば、神奈川県は、団体コードが14000-7、ISO 3166-2:JPがJP-14というようになっています。この両方が使われてしまうと、うまくソートができないので、団体コードのみを利用するように、FILTERを指定しています。

上にも書いたように、私もSPARQLについてよく理解できていませんので、サンプルはこれくらいにします。参考サイトを1つ紹介しておきます。

もう少し実践的に

オープンデータを活用した実際のアプリについても少し見てみたいと思います。
Link Data」は、オープンデータの活用をサポートするサイトです。

f:id:IntelligentTechnology:20131127165559p:plain

このサイトに登録されているオープンデータを利用してアプリを作成することもできます。Link Dataには、「Link Data App」という、アプリ作成を支援するためのサイトも用意されています。

f:id:IntelligentTechnology:20131127165615p:plain

JavaScriptAPIも用意されていたり、公開されているアプリのコードをダウンロードできたりするので、比較的容易にアプリを作成できてしまうと思います。
公開されているアプリのコードを解析するとわかりますが、上に紹介したSPARQLの知識は特に必要はありません。但し、Link Data側で用意してくれているJavaScript APIを理解する必要はあります。

このサイトのアプリは、オープンデータ活用の実例として参考になるのではないかと思います。

まとめ

オープンデータに関する取り組みはまだ始まったばかりという印象ですが、エンジニアとして関われることもあるだろうと思います。
今回はあまり深い内容を書けませんでしたが、もうしばらく情報収集してみようと思います。