DockerとFusekiで手軽にSPARQLエンドポイントを試す

公開:2021/02/12
更新:2021/02/12
4 min読了の目安(約3900字TECH技術記事

ローカル環境でちょっとSPARQLエンドポイントを利用したかったので、DockerとFusekiのイメージを使ってエンドポイントを立ててみました。

その時の手順を投稿したいと思います。
あらかじめローカル環境でDockerが使えるようにしておく必要があります。

SPARQLとは?

SPARQLはRDF用のクエリ言語です。SPARQLクエリで検索できるエンドポイントは、DBpediaWikidataなど、すでにさまざまなものが公開されています。
詳しくは以下を参照してください。

利用可能なSPARQLエンドポイントリスト(2020年8月版)
https://qiita.com/uedayou/items/9e4c6029a2cb6b76de9f

1. Fuseki 起動

まず、FusekiのDockerイメージを以下のコマンドによりインストール・起動します。

$ docker run -p 3030:3030 stain/jena-fuseki

起動が終わったら、ブラウザで http://localhost:3030/ を開いてください。
Fusekiのページが見えると思います。

Fusekiページ

ログインダイアログが表示されています。
以下のようにアカウント情報を入力してください。
パスワードについては、docker 起動中のコンソールログに表示されています。

項目
ユーザ名 admin
パスワード Dockerコンソールログのパスワード
※以下参照
###################################
Initializing Apache Jena Fuseki

Randomly generated admin password:

admin=XXXXXXXXXXXXXXX

###################################

XXXXXXXXXXXXXXX の部分の文字列がパスワードです。

これで、Fusekiを使える状態になりました。

Fusekiページ

2. RDFデータの登録

SPARQLで検索したいRDFファイルをFusekiにアップロードします。

今回は例として、国立国会図書館が公開する「図書館及び関連組織のための国際標準識別子(ISIL)」試行版LOD のRDFファイル、isil-1000.rdfisil-1007.rdfの8つのファイルを使います。

まず、新しいデータセットをFusekiに登録します。
Manage datasets http://localhost:3030/manage.html を開き、add new dataset をクリックしてください。

データセット追加

Dataset name に適当なデータセット名を入力します。例ではlibと入力しました。
Dataset typeは一時的な利用なので、そのままIn-memoryとします。
最後に create datasetボタンをクリックします。
自動的にexisting datasetsページに遷移します。

データセット選択

/lib データセットの upload dataボタンをクリックします。

データセットアップロード

一括登録ができるので、isil-1000.rdfisil-1007.rdf ファイルを選択して開くボタンをクリックします。

ファイル選択

以下のようにファイルがアップロード可能状態になると思います。

ファイルアップロード

この状態で、upload allボタンをクリックすると、すべてのファイルのアップロードが始まります。

アップロード完了

全てのアップロードが完了すれば、RDFファイルの登録は完了しました。
これでSPARQLエンドポイントができる状態になりました。

3. SPARQLで検索

3.1. Fusekiページ内で検索

queryタブ http://localhost:3030/dataset.html を開くと、/libデータセットをSPARQLで検索できる状態になっています。

検索ページ

試しに、デフォルトで入っているSPARQLクエリで検索してみると、以下のような結果が表示されます。

検索結果

3.2. Web APIとして利用

ローカル環境内でWeb APIとして、プログラム上から検索することも可能です。検索するときは、query=URLエンコードしたSPARQLクエリとしてPOSTしてください。

SPARQLエンドポイント(POSTのみ)

http://localhost:3030/[データセット名]/query

例の lib データセットの場合は http://localhost:3030/lib/query となります。

例えばNode.jsで利用する場合は以下のようになります。

Node.jsでのコード例
const axios = require('axios');

const endpoint = "http://localhost:3030/lib/query";
const query = `
SELECT ?subject ?predicate ?object
WHERE {
  ?subject ?predicate ?object
}
LIMIT 25
`;

(async ()=>{
	try {
		const body = "query="+encodeURIComponent(query);
		const headers = {
			'Accept': 'application/json'
		};
		const res = await axios.post(
			endpoint,
			body,
			{ headers }
		);
		console.log(JSON.stringify(res.data, null, 4));
	} catch (e) {
		console.error(e);
	}
})();

※ あらかじめ axios をインストールしておいてください。

参考:RDFファイルの探し方

この手順は、今回例で使用したRDFファイル以外でも使えます。
もしいろいろ試してみたい方は、LinkData というサイトで様々なRDFファイルが公開されているので利用してみてください。

LinkData
http://linkdata.org/home