この記事は1年以上前に書かれました。
内容が古くなっている可能性がありますのでご注意下さい。
内容が古くなっている可能性がありますのでご注意下さい。
この連載では久々の記事となる今回は、LOD(Linked Open Data)のアクセスと結果の表示に、データビジュアライゼーションのJavaScriptライブラリD3.jsを使用します。
Wikipediaの情報をLODとして公開しているDBpedia JapaneseのSPARQLエンドポイントから、イチリンソウ属の植物のサムネイル画像のURLを取得し、ウィキメディア・コモンズにある画像を一覧表示することとします。
ここをクリックすると実行結果を見ることができます。
HTMLファイルの完全なリストは以下の通りです。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>genus Anemone</title>
<script type="text/javascript" src="d3.min.js"></script>
<style type="text/css">
img {
margin: 5pt;
}
</style>
</head>
<body>
<div></div>
<script type="text/javascript">
var server = 'http://ja.dbpedia.org/sparql';
var graph = 'http://ja.dbpedia.org';
var sparql = 'SELECT ?img WHERE {' +
'?s <http://dbpedia.org/ontology/genus> <http://ja.dbpedia.org/resource/イチリンソウ属> ;' +
' <http://dbpedia.org/ontology/thumbnail> ?img . }';
var query = server +
'?default-graph-uri=' + encodeURIComponent(graph) +
'&query=' + encodeURIComponent(sparql) +
'&format=application%2Fsparql-results%2Bjson&timeout=0&debug=on';
d3.json(query, function (error, json) {
if(error) {
console.log(error);
d3.select("div")
.append("h3")
.text("Failed to get data.");
} else {
var imgs = json["results"]["bindings"];
d3.select("div")
.selectAll("img")
.data(imgs)
.enter()
.append("img")
.attr("src", function(d) {
return d["img"]["value"];
});
}
});
</script>
</body>
</html>
スクリプトでは、はじめにJSONリクエストのパラメータを作成します。
DBpediaのSPARQLエンドポイントのWeb画面で、

この通り入力をした時と同じリクエストが送られるよう、パラメータ文字列を作成します。
次に、d3.json()でJSONリクエストを送ります。
d3.json(query, function (error, json) {
if(error) {
console.log(error);
d3.select("div")
.append("h3")
.text("Failed to get data.");
JSONレスポンスが返るか、エラーが発生した場合、コールバック処理の無名関数が呼ばれます。エラーの場合には引数errorにオブジェクトが入りますので、errorがnullでないときにはエラーメッセージを出力します(実際、コネクションタイムアウトでエラーになることがあります)。
リクエストが成功すると、以下の形式でレスポンスが返ります。
{ "head": { "link": [], "vars": ["img"] },
"results": { "distinct": false, "ordered": true, "bindings": [
{ "img": { "type": "uri", "value": "http://~/~.jpg" }},
{ "img": { "type": "uri", "value": "http://~/~.jpg" }},
{ "img": { "type": "uri", "value": "http://~/~.JPG" }},
{ "img": { "type": "uri", "value": "http://~/~.JPG" }},
{ "img": { "type": "uri", "value": "http://~/~.JPG" }},
{ "img": { "type": "uri", "value": "http://~/~.JPG" }},
{ "img": { "type": "uri", "value": "http://~/~.JPG" }},
{ "img": { "type": "uri", "value": "http://~/~.JPG" }},
{ "img": { "type": "uri", "value": "http://~/~.JPG" }},
{ "img": { "type": "uri", "value": "http://~/~.JPG" }} ] } }
従って、d3.json()でコールバック関数に返されたオブジェクトの[“results”][“bindings”]で示される配列から[“img”][“value”]で示される文字列を取り出せば良い事になります。
var imgs = json["results"]["bindings"];
d3.select("div")
.selectAll("img")
.data(imgs)
.enter()
.append("img")
.attr("src", function(d) {
return d["img"]["value"];
});
まず、json[“results”][“bindings”]をimgsオブジェクトに格納してから、div要素のすべての(とは言ってもこの時点ではまだ1つも存在しない)img要素を選択し、imgsオブジェクトとバインドします。enter()によって不足するimg要素のプレースホルダを作成し、append(“img”)でimg要素を追加し、attr()でimg要素のsrc属性を設定します。属性の値は、無名関数が返す、[“img”][“value”]が示す文字列です。
実際の実行結果はこちらをご覧下さい。