ローカルでSPARQL Endpointを使用したかったので、DBpediaでも使用されているvirtuoso (読み:ビルトーソ, ヴィルトゥオーソ, バーチュオーソー)の環境を構築して、構築したSPARQL Endpointに対して、SPARQLクエリで検索・更新・削除する方法をまとめました。
導入環境
- 仮想マシン
- Ubuntu:16.04.1 LTS
- virtuoso:6.1.6.3127
環境構築
インストール
- パッケージが配布されているので、そいつを使う
- パッケージとして配布されているのはバージョン6
$ sudo apt update
$ sudo apt install virtuoso-opensource -y
画面にdefault Userのdefault passwordを変更するか聞かれるが、今回は変更せずにOKを選択する
これでインストールは終わり
コマンドにvirtuoso-t
が追加されていればOK
virtuosoの起動
- virtuoso.iniがあるディレクトリまで移動する
- 特に問題が無ければ
/etc/virtuoso-opensource-6.1
以下にvirtuoso.iniがあります
- 特に問題が無ければ
- 起動コマンドの実行
-
-f
はforeground
で実行するオプション -
-d
はデバック情報を表示するオプション
-
$ cd /etc/virtuoso-opensource-6.1
$ sudo virtuoso-t -df
動作確認
ブラウザからアクセス
- 以下のURLでHomeにアクセスできます
http://<server_IP>:8890
Virtuoso Conductorにログイン
- Home画面の左側にある
Conductor
のリンクをクリックする -
user name
とpassword
を入力する場所があるのでデフォルトのユーザ名、パスワードを入力するとログインが完了する- user: dba
- password: dba
ブラウザからSPARQLクエリを投げる
- 以下のURLからConductorへのログインなしでSPARQLクエリを投げることができます
- http://:8890/sparql
CUIからSPARQLクエリを投げる
-
isql-vt
コマンドを使用することで、対話形式でSPARQLクエリを投げることができる - 通常のSPARQLクエリの前に、SPARQLと入力してからクエリを書く。
$ isql-vt 1111 dba dba
SQL> SPARQL SELECT * WHERE {?s ?p ?o};
Local SPARQL Endpoint構築
RDF(Turtle)ファイルをブラウザからimport
- 1.virtuoso Homeから、Conductorに入りdbaユーザからログインする。
- 2.ログインできたら、タブの中にある[Linked Data]をクリック(下記画像の赤く囲ったところ)
- 3.もう一段タブが表示されるので、新たに表示されたタブ中の[Quad Store Upload]をクリック
- 4."File"にチェックを入れ、Uploadしたいファイルを選択する
- この時ファイルの文字コードが
utf-8
になっているか確認しておく - GraphのIRIを独自のものにしたい場合は"Named Graph IRI"を編集する
- 今回は
http://localhost:8890/TEST/
という名前でグラフIRIを設定しました
-
- [Upload]ボタンを押したらアップロード完了!
アップロードできているか確認
SPARQLクエリを投げてみて、指定したGraph IRIでアップロードできているか確認します
ブラウザからクエリを投げる場合
- Default Data Set Nameに先ほど設定したGraph URI(今回だと
http://localhost:8890/TEST/
)を入力してからクエリを投げてみてください。
CUIからクエリを投げる場合
- SELECT文の後に
FROM <Graph URI>
を追加します
# isql-vt 1111 dba dba
SQL> SPARQL SELECT * FROM <http://localhost:8890/DAV> WHERE {?s ?p ?o};
SPARQLクエリでデータをUPDATE
SPARQLクエリでデータをUPDATEできるように設定します
Update許可設定
初期状態だとSPARQLで、UPDATEやINSERT,DELETE系の処理はできないようになっていおり、実行すると以下のように権限がないと言われてしまいます。
Virtuoso 42000 Error SR186:SECURITY: No permission to execute procedure DB.DBA.SPARQL_INSERT_DICT_CONTENT~~以下略~~
Update系の処理をするためには、Update権限をするための権限を設定する必要があります。この設定はブラウザから簡単にできます。
-
- Virtuoso Conductorにログイン
-
- System Adminタブをクリック
-
- 2段目のタブに出てきたUser Accountsをクリック
- 4."SPARQL" 行の
edit
をクリック
Update系の処理を実行してみる
- データをINSERTしてDELETEできるか試してみます
SQL> sparql select distinct * FROM <http://localhost:8890/TEST/> where {?s ?p ?o .};
s p o
LONG VARCHAR LONG VARCHAR LONG VARCHAR
_______________________________________________________________________________
http://example.org/#green-goblin http://www.w3.org/1999/02/22-rdf-syntax-ns#type http://xmlns.com/foaf/0.1/Person
http://example.org/#spiderman http://www.w3.org/1999/02/22-rdf-syntax-ns#type http://xmlns.com/foaf/0.1/Person
http://example.org/#green-goblin http://www.perceive.net/schemas/relationship/enemyOf http://example.org/#spiderman
http://example.org/#spiderman http://www.perceive.net/schemas/relationship/enemyOf http://example.org/#green-goblin
http://example.org/#green-goblin http://xmlns.com/foaf/0.1/name Green Goblin
http://example.org/#spiderman http://xmlns.com/foaf/0.1/name Spiderman
http://example.org/#spiderman http://xmlns.com/foaf/0.1/name ▒X▒u▒|▒▒▒r▒u▒{-▒▒▒p▒▒▒{
SQL> SPARQL INSERT{ GRAPH <http://localhost:8890/TEST/> { <http://example.org/#spiderman> foaf:name "地獄からの使者"}}
T;
Done. -- 5 msec.
SQL> sparql select distinct * FROM <http://localhost:8890/TEST/> where {?s ?p ?o .};
s p o
LONG VARCHAR LONG VARCHAR LONG VARCHAR
_______________________________________________________________________________
http://example.org/#green-goblin http://www.w3.org/1999/02/22-rdf-syntax-ns#type http://xmlns.com/foaf/0.1/Person
http://example.org/#spiderman http://www.w3.org/1999/02/22-rdf-syntax-ns#type http://xmlns.com/foaf/0.1/Person
http://example.org/#green-goblin http://www.perceive.net/schemas/relationship/enemyOf http://example.org/#spiderman
http://example.org/#spiderman http://www.perceive.net/schemas/relationship/enemyOf http://example.org/#green-goblin
http://example.org/#green-goblin http://xmlns.com/foaf/0.1/name Green Goblin
http://example.org/#spiderman http://xmlns.com/foaf/0.1/name Spiderman
http://example.org/#spiderman http://xmlns.com/foaf/0.1/name ▒X▒u▒|▒▒▒r▒u▒{-▒▒▒p▒▒▒{
http://example.org/#spiderman http://xmlns.com/foaf/0.1/name 地獄からの使者
8 Rows. -- 1 msec.
SQL> DELETE{ GRAPH <http://localhost:8890/TEST/> { <http://example.org/#spiderman> foaf:name "地獄からの使者"}};
SQL> SPARQL DELETE{ GRAPH <http://localhost:8890/TEST/> { <http://example.org/#spiderman> foaf:name "地獄からの使者"}};
Done. -- 3 msec.
SQL> sparql select distinct * FROM <http://localhost:8890/TEST/> where {?s ?p ?o .};
s p o
LONG VARCHAR LONG VARCHAR LONG VARCHAR
_______________________________________________________________________________
http://example.org/#green-goblin http://www.w3.org/1999/02/22-rdf-syntax-ns#type http://xmlns.com/foaf/0.1/Person
http://example.org/#spiderman http://www.w3.org/1999/02/22-rdf-syntax-ns#type http://xmlns.com/foaf/0.1/Person
http://example.org/#green-goblin http://www.perceive.net/schemas/relationship/enemyOf http://example.org/#spiderman
http://example.org/#spiderman http://www.perceive.net/schemas/relationship/enemyOf http://example.org/#green-goblin
http://example.org/#green-goblin http://xmlns.com/foaf/0.1/name Green Goblin
http://example.org/#spiderman http://xmlns.com/foaf/0.1/name Spiderman
http://example.org/#spiderman http://xmlns.com/foaf/0.1/name ▒X▒u▒|▒▒▒r▒u▒{-▒▒▒p▒▒▒{
7 Rows. -- 1 msec.
SQL>
終わりに
以上、virtuoso6でSPARQL Endpointを作成してSPARQLクエリから検索、更新削除ができるようになりました。
本当は、CentOSでvirtuosoのバージョン7を動かしたかったのですが上手くビルドできなかったので途中であきらめていましたが、さっきやってみたらすんなり動いたのでそっちの手順も近いうちにまとめたいと思います。