Furudateのブログ

プログラミングやネットワーク系の知識・技術がメインのブログ。技術メモ帳的な感じになるかと。岩手から発信していきます。

【PHP】DBpedia Japaneseから情報を取得する

こんばんは。

最近、オープンデータの勉強をしました。 そこでSPARQLについて使い方を少し学んだので、これを使って前々からやりたかったDBpediaの情報をPHPで取得するということを今回はしたいと思います。

SPARQLをPHPで使おうとすると、ライブラリ等を使うやり方が多いですが、今回は特に何も入れることなく実装しています(PHPcurlを使っています)。

SPARQLをPHPJava等で使うやり方を探してみると、もう見事に英語の記事しかありません。 なので、今回初挑戦ということもあり、このやり方がベストなやり方なのかは正直自信ないですが、とりあえず出来たのでメモしておきます。

なお、私自身はオープンデータやRDF、SPARQLをそこまで勉強しているわけではないので、今回SPARQLの使い方の詳しい説明等は省きます。

取ってくるデータはWikipediaをLODとして公開しているDBpediaのデータにしたいと思います。

やることは以下の点です。

  1. DBpediaのエンドポイント(SPARQL文を発行するところ)を確認する。
  2. DBpediaにSPARQLを発行して得られる情報(RDF)の形を確認し、ほしい情報のプロパティを確認する。
  3. PHPでSPARQLを発行し、情報を取得する

さて、一つずつ見ていきます。

1. DBpediaのエンドポイントを確認する

まずはDBpedia Japaneseを見てみます。
SPARQL例のところに、SPARQL Endpointというリンクがありますが、DBpedia JapaneseのエンドポイントのURLはこのリンク(http://ja.dbpedia.org/sparql)です。
また、フォームにデフォルトで入ってるのが基本的なSPARQL文です。ここの東京都を岩手県にしたり、宮沢賢治にしたりするとそれに関連する情報を得られます。
ここで色々といじれるので(結果フォーマットをJsonにしたりCSSにしたり)、いろいろやってみると面白いと思います。

2. RDFを確認し、欲しい情報のプロパティを決める。

さて、上記のところで、Run Queryを押してみてください。
すると、フォームに書いてあったSPARQLが実行され、ブラウザに実行結果が表示されます(結果フォーマットをHTMLにしてくださいね)。
データはこんな感じで返ってくるので、”o”の欄を見て自分が欲しい情報を決めます。

すべて返すようにしてもいいんですけど、今回は長いので下にあるabstractの値のみを返すようにしたいと思います。
つまり、プロパティは"abstract"になりますね("p"の欄のURLの最後に書かれているもの)。

3. PHPでSPARQLを発行し、情報を取得する

それでは、上記までで得た情報を元に、実際にPHPでSPARQLの発行をしてみたいと思います。
今回はテキストフォームに入力された値の情報(abstract)を取得するようにしたいと思います。

ソースコードは以下のような感じになります。
大体参考サイト様のソースそのままですが。

<?php
    // URL発行
    function getUrlDbpediaAbstract($arg){
        $format = 'json'; // フォーマット。textにもできる

        // 実際のSPARQLクエリ文。URLを打つのがめんどい場合はPREFIX使おう
        // 今回は関数の引数に実際の値となるもの(東京都とか岩手県とか)を渡す感じで
        // また、Abstractの項目の値のみを取得しています。全部取得する場合は?pとかで
        $query = "select distinct * where { <http://ja.dbpedia.org/resource/".$arg."> <http://dbpedia.org/ontology/abstract> ?o . }";

        // これが発行URL。上記で生成したものをURLエンコードして文字列結合するだけ。
        $searchUrl = 'http://ja.dbpedia.org/sparql?'
        .'query='.urlencode($query)
        .'&format='.$format;

        return $searchUrl;
    }

    // クエリを実際に発行する関数
    // ここではCurlを使って結果セットを取得しています。
    function request($url){
        // curl関数があるかどうかを調べる
        if (!function_exists('curl_init')){
            die('CURL is not installed!');
        }
        // Curlセッションを初期化
        $ch= curl_init();
        // リクエストURLをセット
        curl_setopt($ch, CURLOPT_URL, $url);
        // 結果を文字列で取得
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        // curlの実行
        $response = curl_exec($ch);

        curl_close($ch);

        return $response;
    }
?>

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        <form action="" method="post">
            <input type="text" name="arg" />
            <input type="submit" />
        </form>
    </body>
</html>

<?php
    if(isset($_POST["arg"])){
        // リクエストURL発行
        $requestURL = getUrlDbpediaAbstract($_POST["arg"]);

        // レスポンスをパースして取得(テキスト形式の場合はそのまま取得)
        $responseArray = json_decode(request($requestURL), true);
        //$responseArray = request($requestURL);

        // 表示
        var_dump($responseArray);
    }
?>

こんな感じです。
フォームに東京都とか岩手県とか入れて、ブラウザ上にAbstractの値が表示されればOKです。
説明はほぼソースコードに書いてあります。

これでDBpediaの情報を取得出来たので、色々と面白いアプリが作れそうです。
前からDBpediaの情報は使いたいと思っていたので、今後積極的に活用していきたいと思います。

また、ライブラリを使うとまたできることが広がるのかなーとは思いますが、英語あんまり読めないのでどなたか詳しい方がいれば、是非もっと良いやり方や他のやり方などを教えてほしいです。

とりあえず今回は以上です。
それでは。

参考にさせていただいたサイト

SPARQL Query In Code: REST, PHP And JSON [TUTORIAL]