javascriptとSPARQLでオープンデータをいじくる

オープンデータ・アプリコンテストが気になったので、とりあえずjavascriptからSPARQLを使ってオープンデータで遊んでみました

SPARQLってなんぞや

SPARQLはクエリ言語で、データベースを扱うためのSQLと似たようなものです。
SQLがデータベースを操作するなら、SPARQLはオープンデータを操作します。(SPARQLは検索だけですが)

文法とかについては割愛しますが、なんとなく雰囲気を掴むならCodeIQの問題が分かりやすかったです。
がっつり学ぶなら公式ドキュメントの和訳サイトでしょうか。
あと、SPARQLで遊びたいだけならDBpediaとかがあります。

javascriptからSPARQLを使うには

SPARQLは、エンドポイントと呼ばれるURIにGETリクエストでクエリを送りつけると、クエリに応じたjsonとかxmlとか(指定可能)が返ってきます。
あとはjavascriptの方でjson(またはxml)を解析することでオープンデータとキャッキャウフフできます。

最小限のサンプルコード

javascriptでSPARQLのクエリを鯖江市のエンドポイントに送り、返ってきたjsonをそのまま文字列として表示します。
鯖江市が提供しているオープンデータについては、こことかここを参考にしています。
(※GRAPHについてはいまいち分かってないです)

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>sparql</title>
	<script type="text/javascript" src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
	<script type="text/javascript">

	// GETリクエストを送信
	$.get(
		"http://sparql.sabae.jrrk.org/data/sparql",	// エンドポイント
		{query:"\
			PREFIX schema: <http://schema.org/> \
			SELECT ?desc ?img \
			WHERE { \
			GRAPH ?g { \
				?id schema:description ?desc. \
				?id schema:image ?img. \
			} \
			} limit 20 \
		"},	// クエリ(説明文と画像を最大20件まで要求)
		success,	// 返ってきたデータを処理する関数
		"json"	// 返ってきてほしいデータの形式
	);

	// getリクエストで得たdataを処理する
	function success(data) {
		// 文字列に変換
		var html = JSON.stringify(data);
		// そのまま表示
		$("#disp").html(html);
	}

	</script>
	</head>

	<body>
		<div id="disp"></div>
		<p>このアプリケーションは、以下の著作物を改変して利用しています。<br>
鯖江市、さばかん、クリエイティブ・コモンズ・ライセンス 表示 2.1 日本(http://creativecommons.org/licenses/by/2.1/jp/)、オープンデータ・アプリコンテスト利用規約(http://www.opendata.gr.jp/2013contest/terms/index.html#rules)</p>

	</body>
</html>

「{"head":{"vars":["desc","img"]},"results":{"bindings":[{"desc":{"type":"literal","value":"店主が毎朝市場へ…」みたいな文字が出たらうまくいってます。きっと

jsonを解析して体裁を整えたバージョン

success関数の中身を書き換えます。
tableを使って体裁を整えるのと、取得した画像パスから画像を表示します。

function success(data) {
	var head = data.head.vars;
	var results = data.results.bindings;
	var html = "<table>";

	for(var i=0; i<results.length; i++) {
		html += "<tr><td>";
		html += results[i].desc.value;
		html += "</td><td>";
		html += "<img src=\""+results[i].img.value+"\"></img>";
		html += "</td></tr>";
	}
	html += "</table>";
	$("#disp").html(html);
}

上記コードによって出来たのがこちら
(追記:上記リンクのプロトコルhttpsにしていたため表示できないバグがありましたが修正しました)