分散情報システム構成法
第11回 プログラミング (2)
慶應義塾大学大学院政策・メディア研究科 加藤文彦
(Operaでフルスクリーンにするとスライドになります)
先週の内容
- XAMPPのインストール
- PHP入門
- ARC2のインストール
RDFの処理
まずはじめに,以前作成したFOAFを読み込み,RDFの他の構文に変換する例を示す.
Sample 1. arc2test.php
# ARC2ライブラリの読込
include_once("arc/ARC2.php");
$foaf_uri = "あなたのfoaf URI";
# RDFの処理
$parser = ARC2::getRDFParser();
$parser->parse($foaf_uri);
$triples = $parser->getTriples();
# RDFXMLとして出力
//echo $parser->toRDFXML($triples);
# Turtleとして出力
echo $parser->toTurtle($triples);
ARC2 Parser
ARC2は様々なデータを解析してRDFに落とし込むことができる.
- RDF/XML
- Turtle
- N-Triples
- RSS 2.0
- Atom
- SPOG (constrained SPARQL XML results)
- Google Social API JSON
- HTML (RDFa, Microformats, eRDF, OpenID, DC, posh-rdf)
演習1: ARC2を使ってみる
- 各自のFOAF URIを指定してSample 1を実行する.もしまだFOAFがない場合は,まずFOAF-a-maticで作成すること.
- 様々なURIを指定して実行し,どんな出力結果が得られるか試す.
- HTML (Microformats, RDFa)
- RSS
MySQLの利用
- ARC2でデータを保持したり検索したりするにはMySQLを使用
- phpMyAdmin → "新規データベースを作成する" → データベース名指定 (例: arc)
Sample 2. db.php
# データベースの設定
$config = array(
"db_name" => "データベース名", # ex) "arc"
"db_user" => "root",
"db_pwd" => "",
"store_name" => "テーブル名のPREFIX", # ex) "arc_tests"
);
# データベースオブジェクトの取得
$store = ARC2::getStore($config);
# 初めて使うときは初期化
if (!$store->isSetup()) {
$store->setUp();
}
# URIのデータをデータベースに格納
$r = $store->query("LOAD <$data_uri>");
if($err = $store->getErrors()) {
print_r($err);
}
echo "<p>" . $r['result']['t_count'] . "個のトリプルをデータベースに追加</p>";
# 名前を取得するSPARQL query
$q = "
PREFIX foaf: <http://xmlns.com/foaf/0.1/> .
SELECT ?name
WHERE {
?person a foaf:Person ;
foaf:name ?name .
}
ORDER BY ?name
";
# 問い合わせ結果を解析
$str = "";
if ($rows = $store->query($q, 'rows')) {
foreach ($rows as $row) {
$str .= "<li>" . $row["name"] . "</li>\n";
}
}
# 結果表示
echo $str ? "<ul>\n" . $str . "</ul>\n" : "<p>no name found</p>";
演習2: MySQL
- http://localhost/phpmyadmin/にアクセスして新しいデータベースを作成する.
- Sample 2にデータURIやデータベース名を設定して実行する
- SPARQL Queryを変更して実行する
データの重複・削除
同じスクリプトを何度も実行していると毎回 LOAD <uri>でトリプルが増えていくため対策が必要.
- 結果の重複をなくす: SELECT DESTINCT
- データを消す:
- DELETE句
- $store->reset()
Sample 3. $store->reset()
$store = ARC2::getStore($config);
$store->reset();
データベースの削除
- 完全にデータベースを消してやり直したいとき
- phpMyAdmin -> データベース名を選択 → 削除
SPARQL Endpoint
ARC2は外部のSPARQL Endpointに問い合わせることもできる.
Sample 4. dbpedia.php
# DBpediaの指定
$config = array(
"remote_store_endpoint" => "http://dbpedia.org/sparql"
);
$store = ARC2::getRemoteStore($config);
# SPARQL Query
$q = "PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dbprop: <http://dbpedia.org/property/>
PREFIX dbont: <http://dbpedia.org/ontology/>
SELECT DISTINCT ?name ?birthdate ?abstract
WHERE {
?person a dbont:Person;
dbont:birthdate ?birthdate;
foaf:name ?name;
dbprop:abstract ?abstract .
FILTER (?birthdate >= '1979-04-01'^^xsd:date &&
?birthdate < '1980-03-31'^^xsd:date)
FILTER (lang(?abstract)='ja')
}
ORDER BY ?name ?birthdate
";
# 問い合わせ結果の解析
$rows = $store->query($q, 'rows');
foreach($rows as $row){
print "<tr><td>$row[name]</td><td>$row[birthdate]</td><td>$row[abstract]</td></tr>\n";
}
演習3: SPARQL Endpoint
- dbpediaの例を動かしてみる
- dbpediaにどんなデータがあるかを眺めて確認する
- SPARQL Queryを変更して実行する
任意のデータ取り込みとSPARQL
- 指定したURIからRDFを抽出しデータベースに取り込み
- データベースに対してSPARQLを発行できるフォーム
Sample 5. データインポート (sparql.phpの一部)
<form method="POST" action="sparql.php">
<fieldset>
<legend>データインポート</legend>
<label for="data_uri">URI: <input type="text" name="data_uri" value="" size="70" /></label>
<input type="submit" name="add_submit" value="データ取込" />
</fieldset>
<?php
# data_uriからデータを取り込む
if (isset($_POST['add_submit']) && isset($_POST['data_uri'])) {
$data_uri = $_POST['data_uri'];
# データベースオブジェクトの取得
$store = ARC2::getStore($config);
# 初めて使うときは初期化
if (!$store->isSetup()) {
$store->setUp();
}
# URIのデータをデータベースに格納
$r = $store->query("LOAD <$data_uri>");
if($err = $store->getErrors()) {
print_r($err);
}
echo "<p>" . $data_uri . "から";
echo $r['result']['t_count'] . "個のトリプルをデータベースに追加しました</p>\n";
}
?>
Sample 6. SPARQL (sparql.phpの一部)
<fieldset>
<legend>SPARQL</legend>
<textarea name="query" rows="15" cols="70">
<?php
if (isset($_POST['query_submit']) && isset($_POST['query'])) {
echo $_POST['query'];
} else {
echo "PREFIX foaf: <http://xmlns.com/foaf/0.1/> .\n";
echo "PREFIX dc: <http://purl.org/dc/elements/1.1/> .\n\n";
echo "SELECT DISTINCT ?name\n";
echo "WHERE {\n" ;
echo " ?s foaf:name ?name ;\n";
echo " foaf:mbox ?mbox .\n";
echo "}\n";
}
?>
</textarea><br />
<input type="submit" name="query_submit" value="クエリ" />
</fieldset>
</form>
<?php
if (isset($_POST['query_submit']) && isset($_POST['query'])) {
$q = $_POST['query'];
# 問い合わせ結果を解析
$tbody = "";
# データベースオブジェクトの取得
$store = ARC2::getStore($config);
if ($rows = $store->query($q, 'rows')) {
foreach ($rows as $row) {
$tbody .= "<tr>";
foreach($row as $key => $value) {
if(preg_match('/ type$/', $key) || preg_match('/ lang$/', $key)) {
continue;
}
$tbody .= "<td>" . $key . ": " . $value . "</td>\n";
}
$tbody .= "</tr>";
}
}
# 結果表示
if ($tbody) {
echo "<table>\n";
echo "<caption>検索結果</caption>\n";
echo "<tbody>" . $tbody . "</tbody>\n";
echo "</table>\n";
} else {
echo "<p>該当するデータは見つかりませんでした</p>";
}
}
?>
演習4: データを取り込んでSPARQL
- URIを指定していくつかデータを取り込む
- SPARQLを変更して実行してみる
- これまで紹介してきたデータの他にも色々ある
- Linking Open Data sets
- SPARQL Endpoint
- 各種サイトのRSS/Atom
- Microformats/RDFa/eRDF/...
- などなど
- 自分で作成しても良い
- ARC2 のドキュメント
最終課題
- セマンティックウェブ技術を使ってどんなことができるかを考える
- プロトタイプを実装する
- 7/9(木)
- レポート: 紙に2部印刷して持参
- 最終発表: システムのデモ