ARC2によるSPARQLエンドポイントの構築

この記事は1年以上前に書かれました。
内容が古くなっている可能性がありますのでご注意下さい。


武相の自由民権運動における結社や人物などをLinked Open Data化して可視化した武相自由民権LODでは、SPARQLエンドポイントを提供するためにARC2を利用しています。そこで今回は、ARC2を用いたSPARQLエンドポイントの構築方法について紹介します。

ARC2とは
ARC2はRDFを取り扱うためのPHPライブラリであり、MySQLを使用してSPARQL対応のトリプルストアも提供します。あくまでもライブラリであり、Apache Jena Fusekiのようなサーバーソフトウェアではありません。そのため、サーバーとしての機能を提供するために若干のプログラミングが必要になります。
ARC2のメリットは、PHPで動作することです。FusekiのようにJavaを使用するアプリケーションはレンタルサーバーで動作させることはできませんが、多くのレンタルサーバーはPHPをサポートしているため、ARC2を用いたアプリケーションなら問題なく動作させることができます。

ARC2のインストール
アプリケーションからARC2を利用するために、はじめにcomposerを使用してARC2をインストールする必要があります。

composer require semsol/arc2:^2

実行するとカレントディレクトリの下のvendor/semsol/arc2の中にARC2のファイルがインストールされ、PHPプログラムから利用できるようになります。

MySQLデータベースの準備
ARC2で使用するためのデータベースとユーザを作成しておきます。テーブルは自動的に作成されるので、他には特にすることはありません。

RDFデータファイルの準備
ARC2は、RDF/XMLやTurtle、N-Triplesなど、様々な形式のRDFデータをMySQLデータベースに取り込むことができます。今回は、RDF/XML形式のデータを

https://jm.midoriit.com/entity/BusoJiyuMinkenLOD.xml

に用意しました。

MySQLへのデータの投入
ARC2ライブラリを使って以下の簡単なプログラムを作成しました。

<?php
require 'vendor/autoload.php';
include_once 'vendor/semsol/arc2/ARC2.php';

$store = ARC2::getStore(array(
  'db_host' => 'データベースホスト名',
  'db_name' => 'データベース名',
  'db_user' => 'データベースユーザ名',
  'db_pwd'  => 'データベースパスワード',
  'store_name' => 'ストア名'
));

$store->createDBCon();

if (!$store->isSetUp()) {
  $store->setUp();
}

$ret = $store->query('LOAD <https://jm.midoriit.com/entity/BusoJiyuMinkenLOD.xml>');
?>

はじめにARC2ライブラリを読み込み、getStore()とcreateDBCon()でMySQLデータベースに接続します。
$store->isSetUp()は、接続したデータベースにARC2用のテーブルが用意されているかどうかを判定しています。ない場合には$store->setUp()でテーブルを作成します。ARC2が作成するテーブルの名前には、store_nameで指定した文字列がプレフィックスとして付けられます。
最後に、$store->query()でLOADクエリを実行してRDFデータをMySQLデータベースに取り込みます。
RDF/XMLファイルで

rdf:about="G00001"

のように指定していたリソースのURIは、取り込んだファイルのパスを用いて

<https://jm.midoriit.com/entity/G00001>

のようになります。

SPARQLエンドポイントの公開
SPARQLエンドポイントは以下のような簡単なプログラムで実現することができます。これ一つで、ブラウザからアクセスしてインタラクティブにクエリを実行することも、プログラムからAPIとして呼び出すことも可能です。

<?php
require 'vendor/autoload.php';
include_once 'vendor/semsol/arc2/ARC2.php';

$config = array(
  'db_host' => 'データベースホスト名',
  'db_name' => 'データベース名',
  'db_user' => 'データベースユーザ名',
  'db_pwd'  => 'データベースパスワード',
  'store_name' => 'ストア名'
  'endpoint_features' => array('select'),
  'endpoint_read_key' => '',
  'endpoint_write_key' => '',
  'endpoint_max_limit' => 1000
);

$ep = ARC2::getStoreEndpoint($config );

if (!$ep->isSetUp()) {
  $ep->setUp();
}

$ep->go();
?>

上の例では、selectのみを実行可能に設定していますが、以下のようにすれば他の機能も実行できるようになります。

'endpoint_features' => array(
  'select', 'construct', 'ask', 'describe', 'load', 'insert', 'delete', 'dump'
),

書き込みを可能にする場合には、endpoint_write_keyを適宜設定します。
ブラウザでアクセスすると以下のような画面が表示されます。

URIの参照解決
武相自由民権LODでは、エンティティのURIをブラウザで参照すると、以下のように当該エンティティについての情報を表示します。

これは、.htaccessに

RewriteRule entity/(.*) entity.php?entity=$1

と記述することにより、mod_rewriteを使って

https://jm.midoriit.com/entity/P00001

に対するアクセスを

https://jm.midoriit.com/entity.php?entity=P00001

に書き換え、entity.phpという1つのプログラムで処理しています。

2022.8.27 追記
これまで、Firefoxでは武相自由民権LODのグラフを表示できないという問題がありました。
ARC2_StoreEndpoint.phpのgetSPARQLJSONSelectResultDoc()では、Content-Typeとして’application/sparql-results+json’を返すようになっていますが、’application/json’を返すように変更したところ、Firefoxでも正常に動作するようになりました。