このエントリでは、
Apache Jena FusekiというSPARQLサーバを、
Heroku上で運用する手順を示します。
但し、ReadOnlyのデータセットのみを対象とします。

Apache Jena Fuseki
https://jena.apache.org/documentation/fuseki2/

ここで示す手順は、次のような運用を想定しています。
SPARQLで公開するデータをGitHub上で管理し、
データ追加・編集をPullRequestで受け付けて、
masterブランチにmergeされたら、
HerokuのDeployのGitHub連携で自動的にサービスを更新する。

このエントリでは、以下のリポジトリのサンプルコードを使用します。
README.mdにも手順の説明を記載しています。

takemikami/jena-fuseki-heroku-sample | GitHub
https://github.com/takemikami/jena-fuseki-heroku-sample

仕組みの概要

Fusekiは、Javaで実装されたSPARQLサーバです。
ホストするデータセットは、
永続化不要な場合は、メモリー上に保持し、
永続化が必要な場合は、TDBという仕組みでディスク上に保持します。

Herokuの場合は、
Dynoがシャットダウンすると、メモリ・ディスクともに破棄されてしまうので、永続化されません。
そこで、Dynoのイメージをビルドする際に、
ホストしたいデータセットをTDB形式にして、イメージに含めてしまうことにします。

まとめると、以下のような処理の流れになります。
# イメージのビルド・Dynoの起動は、
# masterブランチにmergeされた時に実行されます。

イメージのビルド時の流れ

  1. fusekiをダウンロードする
  2. tdbのcliをダウンロードする
  3. tdbloader2でtdbファイルを生成する

Dynoの起動時の流れ

  1. ビルド時に生成したtdbを指定して、fusekiを起動する

注意点

以上で説明した仕組みでデータセットをホストするため、
Fusekiの機能について、次のような点に注意が必要です。

  • サーバでデータ追加・更新を受け付ける事が出来ない
  • アクセス数などの統計情報が保持されない

逆に言うと、これらを許容出来る場合は、
Herokuの仕組みに乗って、運用することが可能です。

構築手順

構築手順はGitHubのREADME.mdに書いている通りなのですが、以下に記載しておきます。

  1. 本リポジトリをcloneする。

    git clone git@github.com:takemikami/jena-fuseki-heroku-sample.git
    
  2. GitHubのGUIでデータセットを運用するリポジトリを作成する。

  3. 作成したGitHubのリポジトリに、本リポジトリのコピーをpushする。

    cd jena-fuseki-heroku-sample
    git remote remove origin
    git remote add origin git@github.com:{your name}/{your project}.git
    git push origin master
    
  4. HerokuのGUIで、新しいappを作成する。

  5. 新しいappのDeployタブから、データセットを運用するリポジトリを指定して、GitHub連携を設定する。
    ※この時、ブランチはmasterを指定します。

  6. デプロイ完了後、Open appでページクエリを実行出来ることを確認する。

  7. データセットの名称を変更する。

    • run/config.ttl … fuseki:nameでsampleとなっている箇所
    • webapp/index.html … form actionのパスでsampleとなっている箇所
  8. dataset配下のデータセットの定義を編集する。

以降は、datasetの変更をmasterブランチにpushする度に、自動的に反映されるようになります。

この仕組みでFusekiを運用すれば、次のメリットがあると考えられます。

  • サーバへのデータロードのオペレーションが不要になる
  • データ量・アクセスが少なければ、Heroku無料の範囲内で運用できる

趣味レベルで整理したデータなどがあれば、
この方法で、気軽にホストしてみてはいかがでしょうか。