分散情報システム構成法
第11回 プログラミング (2)

慶應義塾大学大学院政策・メディア研究科 加藤文彦

(Operaでフルスクリーンにするとスライドになります)

先週の内容

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に落とし込むことができる.

演習1: ARC2を使ってみる

  1. 各自のFOAF URIを指定してSample 1を実行する.もしまだFOAFがない場合は,まずFOAF-a-maticで作成すること.
  2. 様々なURIを指定して実行し,どんな出力結果が得られるか試す.
    • HTML (Microformats, RDFa)
    • RSS

MySQLの利用

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

  1. http://localhost/phpmyadmin/にアクセスして新しいデータベースを作成する.
  2. Sample 2にデータURIやデータベース名を設定して実行する
  3. SPARQL Queryを変更して実行する

データの重複・削除

同じスクリプトを何度も実行していると毎回 LOAD <uri>でトリプルが増えていくため対策が必要.

Sample 3. $store->reset()


$store = ARC2::getStore($config);
$store->reset();

データベースの削除

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

  1. dbpediaの例を動かしてみる
  2. dbpediaにどんなデータがあるかを眺めて確認する
  3. SPARQL Queryを変更して実行する

任意のデータ取り込みとSPARQL

  1. 指定したURIからRDFを抽出しデータベースに取り込み
  2. データベースに対して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

最終課題