読者です 読者をやめる 読者になる 読者になる

【Python3】rdflibの簡単なメモ

日本語Wikipediaオントロジー
上記日本語WikipediaオントロジーのデータをPythonから弄くり回したかったのでrdflibを使いました。

最終的にはファイルサイズが大きすぎて直接的な使用を断念したのですが……。

データの検索部分のみ備忘録的に軽くメモ。
rdfへの要素追加等の操作は特に使用していないので書きません。

インストール

インストールはpipから。

pip install rdflib

完了。

使用方法

初期化

まずは初期化します。

from rdflib import Graph

g = Graph()
g.parse('jwo_instance_rdf.rdf')

グラフの種類は何種類かあるみたいだけれども、とりあえず標準スタイルで。
parseメソッドで読み込むrdfのパスを指定。URLも可能っぽい。
loadというメソッドも用意されているようだけど、リファレンスに記述が無いのでparseとの違いはよくわからない。
ちなみに上記データファイルは1GB近くあるので、パースするのに無茶苦茶時間がかかる。要注意。

検索

要素の検索では、取得したいデータによっていくつかの異なるメソッドが用意されている。
原則としてはどれも同じような使い方をする。

subject,predicate,objectの全てが欲しい場合はtriplesメソッドを使用する。

また、rdflib内に定数が用意されているため、それらを適宜インポートしながら検索条件を指定する。

from rdflib import RDF

for s, p, o in g.triples((None, RDF.type, None)):
    print(s, p, o)

検索条件を指定したい項目のみ引数に値を入れ、他はNoneを指定する。
上記例はsubject,objectは指定無しで、predicateがRDFのtype(http://www.w3.org/1999/02/22-rdf-syntax-ns#type)であるものを条件としている。
引数はsubject,predicate,objectの順にtupleで指定。


その他、返却データが各要素のみであったり(e.g. subjects, objects)、検索項以外の要素のみであったり(e.g. subject_objects)と、いくつかの検索メソッドが用意されている。

# objectデータのみ取得
for o in g.objects(subject=None, predicate=RDF.type):
    print(o)

# subjectとobjectのデータのみ取得
for s, o in g.subject_objects(RDF.type):
    print(obj)

全てのデータが欲しいケースはあまりないと思われるので、中々有用。

検索条件のsubjectにURIを指定したい場合や、objectに文字を指定したい場合は下記のようにする。

from rdflib import URIRef, Literal

# subject項目が下記URIに一致するものを検索
for s, p, o in g.triples((URIRef('http://www.wikipediaontology.org/instance/ゼロの使い魔'), None, None)):
    print(s, p, o)

# object項目がPythonという項目に一致するものを検索
for s, p, o in g.triples((None,  None, Literal("Python"))):
    print(s, p, o)

また、独自のpredicateがrdfデータ内で使用されている場合などは、Namespaceの利用が効率的なようである。
例として、最初に提示した日本語Wikipediaオントロジーで定義されているjwoでの検索を試してみる。

from rdflib import Namespace
JWO = rdflib.Namespace("http://www.wikipediaontology.org/vocabulary#")

for o in g.objects(subject=URIRef('http://www.wikipediaontology.org/instance/ファイナルファンタジー'), predicate=JWO.hyper):
    print(o)

このようにすると、subjectがhttp://www.wikipediaontology.org/instance/ファイナルファンタジーで、predicateがjwo:hyperの要素が抽出される。

結果はhttp://www.wikipediaontology.org/class/『ファイナルファンタジー』となる。

まとめ

rdfの仕組み等を理解していれば容易に利用できるようになっていると思われる。

個人的には、今回初めてrdfデータを扱ったため、最初は勝手がよくわからなかった。
利用してみて、非常に便利な形式だなあと感じた次第。

今回は使わなかったが、rdfの生成の方でも利便性が高そうなので、機会があればまた触ってみようと思う。

参考

Navigating Graphs — rdflib 4.2.2-dev documentation
python rdflibを使う - ラシウラ