Oxigraph を利用して RDFLib の SPARQL クエリを高速化してみる

本記事は Python から RDFLib 経由で Oxigraph を利用する方法のメモです。

【目次】

[1]はじめに

Python で RDF データを処理しようとするとき最初の選択肢は RDFLib だと思います。
RDFLib はネットに沢山情報があるし、実績もあります。個人的には Google Colaboratory で手軽に使えることが気に入っています。

しかし、トリプル数が少なく、単純な SPARQL クエリを実行するだけなら気になりませんが、それなりに多いデータに対して複雑な SPARQL クエリを実行しようとすると、パフォーマンスが気になることが多いです。

このようなケースは、Apache Jena とか Fuseki を利用すれば素晴らしいパフォーマンスを発揮するので速度面は解決することができます。

しかし、対話環境で利用したいとか、SPARQL クエリの実行結果を Pandas に挿入して云々のような、Python ならではの利点を生かそうとすると、環境構築やプラグラミング環境を含めて考えると、あまりお手軽とは言えません。(少なくとも Google Colaboratory 上でお手軽に使うという感覚ではありません。)

そこで、Colaboratory 上で動作する Python のライブラリで、RDF ファイルを読み書きでき、 SPARQL クエリが高速に動作するライブラリは無いものかと探してみたところ、Oxigraph を見つけました。

ありがたいことに、Oxigraph は RDFLib のプラグインが提供されており、RDFLib を利用したコードを殆ど変更することなく、内部では OxiGraph を動作させることが可能です。(つまり、RDFLib の API で Oxigraph を使える。)

そこで、本記事では RDFLib 経由で OxiGraph を使う方法をメモしておきます。

[2]Oxigraph、Pyoxigraph、Oxrdflib について

Oxigraph は SPARQL 標準を実装したオープンソースのグラフデータベースライブラリです。

Oxigraph は Rust で実装されているため、そのままでは Python から利用できません。

そこで Oxigraph を Python から利用できる Pyoxigraph が提供されています。

Pyoxigraph を利用することで、Python から Oxigraph のAPIを利用することができます。

Python から Oxigraph の API を利用するだけであれば以上なのですが、このままでは OxiGraph と RDFLib は独立したライブラリのままなので、RDFLib から Oxigraph を利用することができません。

RDFLib はプラグインにより機能を拡張する仕組みを持っており、トリプルストアに対する Oxigraph のプラグインも提供されています。

上記 RDFLib のドキュメント(External のところ)にある通り、Oxigraph に対するプラグイン Oxrdflib を利用することで、RDFLib と Oxigraph を連携させることができます。

話がややこしくなりましたので少しまとめると、RDFLib => Oxrdflib(ストアプラグイン)=> Pyoxigraph(Oxigraph を内包)という構成になります。

これにより、利用側からは RDFLib のAPIを利用するけど、内部では Oxigraph が動作するということを実現できます(Oxigraph を意識することなく使えます)。

Oxigraph はライブラリに内蔵されているので、Fuseki を利用する場合のようにサーバ環境を構築することなく、手軽に利用することができます。

[3]利用方法など

(1)ライブラリのインストール

先に書いた通り内部構成は少々複雑ですが、インストールや利用方法は至って簡単です。

以下のように pip コマンドを利用してインストールします。

pip install rdflib
pip install pyoxigraph
pip install oxrdflib

私は Colaboratory と Ubuntu 環境で動作確認しています。

(2)RDFLib から SPARQL を実行するコード例

以下は、RDFLib のデフォルトストアのかわりに、Oxigraph ストアを利用して SPARQL を実行するコードのとてもシンプルな雛形です。

from rdflib import Graph

# Oxigraphプラグインを利用するために store 引数を指定する
g = Graph( store="Oxigraph" )

g.parse("読み込むファイルの指定")

query_str = "SPARQL文"

qres = g.query(query_str)
for row in qres:
    print("rowの内容を出力")

Oxigraph を利用するには、Graph オブジェクトを作成する際の引数に store="Oxigraph" を追加するだけです。

つまり、Oxigraph に関係するライブラリのインポート宣言も不要ですし、Graph 生成時の引数以外は RDFLib のコードがそのまま動作します。

これにより、Oxigraph と通常の RDFLib の動作を比較したいとか、Oxigraph の利用を止めたい場合でも、Graph 生成時の store 引数を削除するだけなので、既存のコードに与える影響は殆ど無いと思います。

[4]感想など

まず、Oxigraph について専門的な観点からの特徴や性能については、以下の論文が参考になると思います。

続いて、まだ利用し始めたところなので内容は非常に薄いし、間違いもあるかもしれませんが、現時点での私の超個人的な感想をメモしておきます。

  • まず、RDFLib のコードを変更することなく使えるので、選択肢が広がるのはとてもありがたいです。
  • 小さなデータや単純なクエリだと違いが出ませんが、自分が使っている少し大きめの RDF データに対する少々複雑な SPARQL クエリの実行に RDFLib だと1時間ちょっとかかっていたのが、Oxigraph に切り替えると 20 秒以内に終わったので非常に驚きました。
    • 但し、多くのケースを試したわけではなく、極端に差が出る内容だったのかもしれません。同じデータに対して Fuseki も高速に動作しますが、それと同等の速度が出た印象でした。
  • 今回は Python + RDFLib のプラグインで試していますが、Pyoxigraph を直接利用した場合との差があるかどうかは試していません。
    • もっとも RDFLib の API で使えるところが個人的に(今は)最も魅力的なところなので、仮に多少差があっても RDFLib 経由で使う気がします。
  • 現時点でバージョンが 0.3.x と若いですが、少なくとも RDF ファイルの入出力と SPARQL クエリに関しては(私の利用範囲ですが)問題なく動作します。

Oxigraph は、Python版だけでなく、Node.js(WebAssembly)版やスタンドアローンサーバもあって広く使えそうだし、今後が楽しみなプロダクトだと思います。

コメント

このブログの人気の投稿

Google Document AIで画像から表形式データを抽出する(Vision API OCRとの違い)

VirtualBoxのスナップショット機能

オントロジーエディタ Protégé を使ってみる