【PHP】DBpedia Japaneseから情報を取得する
こんばんは。
最近、オープンデータの勉強をしました。 そこでSPARQLについて使い方を少し学んだので、これを使って前々からやりたかったDBpediaの情報をPHPで取得するということを今回はしたいと思います。
SPARQLをPHPで使おうとすると、ライブラリ等を使うやり方が多いですが、今回は特に何も入れることなく実装しています(PHPのcurlを使っています)。
SPARQLをPHPやJava等で使うやり方を探してみると、もう見事に英語の記事しかありません。 なので、今回初挑戦ということもあり、このやり方がベストなやり方なのかは正直自信ないですが、とりあえず出来たのでメモしておきます。
なお、私自身はオープンデータやRDF、SPARQLをそこまで勉強しているわけではないので、今回SPARQLの使い方の詳しい説明等は省きます。
取ってくるデータはWikipediaをLODとして公開しているDBpediaのデータにしたいと思います。
やることは以下の点です。
- DBpediaのエンドポイント(SPARQL文を発行するところ)を確認する。
- DBpediaにSPARQLを発行して得られる情報(RDF)の形を確認し、ほしい情報のプロパティを確認する。
- 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の情報は使いたいと思っていたので、今後積極的に活用していきたいと思います。
また、ライブラリを使うとまたできることが広がるのかなーとは思いますが、英語あんまり読めないのでどなたか詳しい方がいれば、是非もっと良いやり方や他のやり方などを教えてほしいです。
とりあえず今回は以上です。
それでは。