Apache Jena Fuseki 2 で Readonly SPARQL Endpoint

# はじめに

[前回の記事](http://qiita.com/frogcat/items/792113b55312e505250b) では Apache Jena Fuseki 1 を使った SPARQL Endpoint の立ち上げ手順を解説しました。このポストでは最新版の [Apache Jena Fuseki 2.3.0](https://jena.apache.org/documentation/fuseki2/index.html) を使った方法を解説します。

Fuseki 1 は Servlet Container である [Jetty](http://www.eclipse.org/jetty/) に組み込まれているのですが、Fuseki 2 では Jetty 組み込み版と WAR 版が提供されるようになりました。クラウド環境ですでに Tomcat などの Servlet Container が用意されている場合には WAR 版は便利かもしれません。このポストでは Jetty 組み込み版について解説します。


# 1.準備

* Java 7 以上をインストールしておきます
* Fuseki にロードする RDF を用意しておきます

ここでは <https://raw.githubusercontent.com/apache/jena/master/jena-fuseki1/Data/books.ttl> を例として説明しますが、 file: スキームの URL や設定ファイルからの相対パスなんかでも問題ありません。

# 2. Apache Jena Fuseki 2 をインストール

* [Apache Jena のダウンロードページ](https://jena.apache.org/download/index.cgi) に行きます
* Apache Jena Fuseki **apache-jena-fuseki-2.3.0.zip** をダウンロードします
* 適当なフォルダに展開します
* **apache-jena-fuseki-2.3.0** フォルダができるはずです


# 3. Apache Jena Fuseki 2 の試運転

まずは一度起動してみましょう。この手順によって、作業フォルダや設定ファイルの雛形ができあがります。

```console
$ cd apache-jena-fuseki-2.3.0
$ fuseki-server
[18:56:19] Server     INFO  Fuseki 2.3.0 2015-07-25T17:11:28+0000
[18:56:19] Config     INFO  FUSEKI_HOME=C:\apache-jena-fuseki-2.3.0\.
[18:56:19] Config     INFO  FUSEKI_BASE=C:\apache-jena-fuseki-2.3.0\run
[18:56:19] Servlet    INFO  Initializing Shiro environment
[18:56:19] Config     INFO  Shiro file: file://C:\apache-jena-fuseki-2.3.0\run\shiro.ini
[18:56:20] Server     INFO  Started 2015/09/14 18:56:20 JST on port 3030
```

この状態で <http://localhost:3030/> にアクセスすると、Fuseki 2 のトップ画面を見ることができます。

起動ログ中の **FUSEKI_BASE** というのが、この fuseki サーバの使用するフォルダになります。環境変数 FUSEKI_BASE が指定されている場合には、そのフォルダの配下に各種ファイルが作成されます。FUSEKI_BASE を指定しなかった場合には、カレントディレクトリの直下に **run** フォルダが作成されます。

フォルダの生成が確認できたら **Ctrl-C** などで停止してください。



# 4. Apache Jena Fuseki 2 の設定

Fuseki 2 の設定方法は [こちら](https://jena.apache.org/documentation/fuseki2/fuseki-configuration.html) です。 Fuseki 1 ではすべての設定を config.ttl に集約して記述していたのですが、 Fuseki 2 ではサーバ設定／セキュリティ設定／エンドポイント設定など、それぞれ別の設定ファイルに記述するように変更されました。 Fuseki 1 のスタイルでも記述は可能とのことですが、移行が推奨されています。ここでは Fuseki 2 の作法に従います。

## 4.1 サーバ設定の確認

**FUSEKI_BASE/config.ttl** が生成されているはずです。クエリータイムアウトを設定したり、カスタムクラスをロードする場合にはこの設定を変更する必要がありますが、通常は編集の必要はありません。


## 4.2  セキュリティ設定の確認

**FUSEKI_BASE/shiro.ini** が生成されているはずです。 [Apache Shiro](https://shiro.apache.org/) によるセキュリティがサポートされているので、外向けに運用する場合には適切に設定しましょう。 このポストの利用方法であれば、デフォルトのままで支障はありません。

## 4.3 エンドポイントの設定

**FUSEKI_BASE/configuration** フォルダが生成されているはずです。このフォルダの配下にひとつまたは複数の設定ファイルを置くことで、ひとつまたは複数のエンドポイントを設定することができます。設定ファイルは **Turtle** で記述します。

最小限の設定は以下のとおりです。

1. **FUSEKI_BASE/configuration/sample.ttl** ファイルを作成
2. 以下の内容で保存


```FUSEKI_BASE/configuration/sample.ttl
@prefix fuseki:  <http://jena.apache.org/fuseki#> .
@prefix ja:      <http://jena.hpl.hp.com/2005/11/Assembler#> .

[
  a fuseki:Service ;
    fuseki:name "/sample" ;
    fuseki:serviceQuery "query" ;
    fuseki:dataset [
      a ja:RDFDataset ;
      ja:defaultGraph [
        a ja:MemoryModel ;
        ja:content  [ja:externalContent <https://raw.githubusercontent.com/apache/jena/master/jena-fuseki1/Data/books.ttl>] 
      ] 
    ]
] .

```

ここでは <https://raw.githubusercontent.com/apache/jena/master/jena-fuseki1/Data/books.ttl> をメモリーベースのトリプルストアにロードして、<http://localhost:3030/sample/query> という URL に SPARQL Endpoint を立ち上げる、という設定が記述されています。
なお **sample.ttl** というファイル名は拡張子が ttl でありさえすればなんでもかまいませんが、ここでは **fuseki:name** の値と対応付けています。複数の設定ファイルをおいて複数のエンドポイントを運用する場合には、URL のバッティングに注意しましょう。


# 4. Apache Jena Fuseki 2 の起動

* 以下のコマンドで起動します (試運転の起動コマンドと一緒)
* Load configuration PATH_TO_YOUR_CONFIG / Register: NAME_OF_YOUR_SERVICE といったメッセージが追加されていることを確認しましょう
* RDF に問題がある場合にはエラーメッセージなどが表示されます
* 大きな RDF を指定した場合には起動に時間がかかります

```console
$ cd apache-jena-fuseki-2.3.0
$ fuseki-server
[19:33:29] Server     INFO  Fuseki 2.3.0 2015-07-25T17:11:28+0000
[19:33:29] Config     INFO  FUSEKI_HOME=C:\\apache-jena-fuseki-2.3.0\.
[19:33:29] Config     INFO  FUSEKI_BASE=C:\\apache-jena-fuseki-2.3.0\run
[19:33:29] Servlet    INFO  Initializing Shiro environment
[19:33:29] Config     INFO  Shiro file: file://C:\\apache-jena-fuseki-2.3.0\run\shiro.ini
[19:33:29] Config     INFO  Load configuration: file:///C:/apache-jena-fuseki-2.3.0/run/configuration/sample.ttl
[19:33:31] Config     INFO  Register: /sample
[19:33:31] Server     INFO  Started 2015/09/14 19:33:31 JST on port 3030
```

* **Ctrl-C** などで停止してください

# 5. Apache Jena Fuseki 2 の起動確認

* <http://localhost:3030/> はトップページになっています
* 起動中のエンドポイントを確認したり、SPARQL 実行のコンソールが提供されています
* Fuseki 1 のコンソールよりは使いやすくなっているので、使うのもいいかもしれません


上記の設定で構築された SPARQL Endpoint の URL は <http://localhost:3030/sample/query> になります。このような SPARQL の実行例は：

```rq:example
select * where { ?s ?p ?o. }
```

このような URL から得ることができます
<http://localhost:3030/sample/query?query=select+*+where+%7B%3Fs+%3Fp+%3Fo.%7D&output=json>