SPARQLで人類の知にアクセスしよう

やりたいこと

DBpediaにアクセスして、人類の英知を我が物にしたい。

どうやって解決するか?

SPARQLをマスターする。

DBpediaはRDFモデル(正確にはOWL)で記述されているデータである。

データの実体はXMLで記述されるが、データを効率良く取得するには、クエリ言語のSPARQLを使うのが一番よい。 SPARQLでSELECTが実行できるとこまで試してみる。

そもそもRDFモデルってどんなんよ?

グラフモデルの一種。

だいたいのコア概念は

  • すべてのモノ(実体・概念とわず)は「リソース」で表現される
    • リソースはURIで一意に紐付けされている
  • 知識はトリプル(リソース, プロパティ, リソース)で表現できる。トリプルの中身は(主語, 述語, 目的語)
  • プロパティはリソースを表現するモノである。

RDFのクラス関係図はこのスライドの6ページ目がわかりやすい。

SPARQLってなんなんよ?

SPARQLはRDFモデルのデータを探索するためのクエリ言語

SQLっぽいが、トリプルを表現するために、WHERE句の中が特殊だったり、デリミタが.だったり、変数宣言が?がだったりと、演算子が違う。

まずは基本を抑えるために、SELECT命令だけはできるようにする。

SELECT命令を実行するためには

SELECT 変数
WHERE {
    タプル表現のグラフ
}

クエリの書き方はこのスライドがとてもわかりやすい。

エンドポイントはここで公開されているので、簡単に試すことができる。

試しにスライドに従って、クエリを記述してみることにする

SELECT ?p ?o
WHERE
{
    <http://ja.dbpedia.org/resource/東京都> ?p ?o
} LIMIT 10

こんな結果が返ってくる

f:id:kensuke-mi:20150624192547p:plain

いろんなサイトを見た補足(私的な)など

  • 主語はs, 述語はp, 目的語はoで表記することが多い
  • 目的語にはリテラルでデータの内容を指定できる ex. "東京都"
  • 主語と目的語にはリソースを指定できる。述語には、プロパティを指定する
    • プロパティはw3で定義されているプロパティと、DBpedia日本語版で独自のプロパティを指定できる
  • リソースが存在してるorNotはDBpedia 単語とでもGoogle検索すれば、実体が見れる
    • リソースの存在を調べるASKコマンドがSPARQLで利用可能

と、いうことで、人生初の自分で考えたSPARQLクエリを書いてみる。

表現するグラフは「渡辺麻友のバイトサイズは?p」

グラフをクエリにしてみると、

SELECT DISTINCT ?o
WHERE {
<http://ja.dbpedia.org/resource/渡辺麻友>  <http://ja.dbpedia.org/property/バスト> ?o .
}

実行してみる。

71

71! まゆゆのバストサイズは71! (公表値です)

まとめ

71! まゆゆのバストサイズは71!