DockerとFusekiで手軽にSPARQLエンドポイントを試す
ローカル環境でちょっとSPARQLエンドポイントを利用したかったので、DockerとFusekiのイメージを使ってエンドポイントを立ててみました。
その時の手順を投稿したいと思います。
あらかじめローカル環境でDockerが使えるようにしておく必要があります。
SPARQLとは?
SPARQLはRDF用のクエリ言語です。SPARQLクエリで検索できるエンドポイントは、DBpediaやWikidataなど、すでにさまざまなものが公開されています。
詳しくは以下を参照してください。
利用可能な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のページが見えると思います。
ログインダイアログが表示されています。
以下のようにアカウント情報を入力してください。
パスワードについては、docker 起動中のコンソールログに表示されています。
項目 | 値 |
---|---|
ユーザ名 | admin |
パスワード | Dockerコンソールログのパスワード ※以下参照 |
###################################
Initializing Apache Jena Fuseki
Randomly generated admin password:
admin=XXXXXXXXXXXXXXX
###################################
※XXXXXXXXXXXXXXX
の部分の文字列がパスワードです。
これで、Fusekiを使える状態になりました。
2. RDFデータの登録
SPARQLで検索したいRDFファイルをFusekiにアップロードします。
今回は例として、国立国会図書館が公開する「図書館及び関連組織のための国際標準識別子(ISIL)」試行版LOD のRDFファイル、isil-1000.rdf
~isil-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.rdf
~isil-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
で利用する場合は以下のようになります。
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
Discussion