2.Python言語におけるOWLオントロジーへのアクセス
2.1 インポート
>>> from owlready2 import *
とすればよい。関数名の重複が気になるなら、
>>> import owlready2 as or2
とでもして、
>>> or2.func()
として、owlready2の関数であることを明らかにすればよい。numpyをよくnpと扱うようなものである。
2.2 オントロジーのロード(読み込み)
Pythonのオブジェクトとして読み込む。
インターネットにあるIRI(つまりアドレス)を読み込む場合、直接IRIを指定する。
>>> onto = get_ontology('http://lesfleursdunormal.fr/static/_downloads/bacteria.owl').load()
ファイルの場合、
>>> onto = get_ontology('c:\\owlready\\bacteria.owl').load()
である。ウィンドウズの場合、フォルダの区切りは\マークであり、Pythonの特殊文字として'\'と表す。Linux(Unix)やMacではスラッシュ(/)となる。
同じフォルダならば、ファイル名だけでよい。
ちなみにbacteria.owlは微生物のバクテリア(細菌)のオントロジーであり、これは著者の取り組みによるのだろう。作成されたオントロジーのうちで、内容的にも規模的にも最大の分野は医薬・生化学分野であろう。
ファイル形式はRDF/XML形式かタートル形式(N-Triples)である。OWL/XML形式というのはOWL2言語であつかうオントロジー語彙(予約語)を用いるが、書式自体はXMLである。OWL2は関数型表記法が利用でき、記述が容易になると考えられるが、XML形式であるなら、予約語が増えるだけで、取り扱いの負担が増えるためか、あまり利用されていないのではなかろうか。protégéで出力すると、多少ファイル容量を小さくできる。
2.3 インポートされたオントロジー
OWLファイルは、他のオントロジー(インターネット上のIRIやOWLファイル)をインポートして、その記述内容を利用して記述できる。
いまt001(https://www.test.org/test/t001 、ファイルはt001.rdf)オントロジーをt002(https://www.test.org/test/t002 、ファイルはt002.rdf)オントロジーがインポートしているとする。このとき次のようにすれば、インポートしているオントロジーにアクセスできる。
>>> from owlready2 import *
>>> onto1 = get_ontology('t001.rdf').load()
>>> onto2 = get_ontology('t002.rdf').load()
>>> onto2.imported_ontologies
[get_ontology("https://www.test.org/test/t001#")]
>>> onto2.imported_ontologies[0]
get_ontology("https://www.test.org/test/t001#")
>>> list(onto2.imported_ontologies[0].classes())
[t001.A, t001.C, t001.B]
これを、t001を読み込まないで次のようにするとエラーとなるので、インポートするオントロジーは事前に読み込んでおかなければならない。
>>> from owlready2 import *
>>> onto2 = get_ontology('t002.rdf').load()
Traceback (most recent call last):
~
socket.gaierror: [Errno 11001] getaddrinfo failed
During handling of the above exception, another exception occurred:
~
owlready2.base.OwlReadyOntologyParsingError: Cannot download 'https://www.test.org/test/t001/'!
2.4 オントロジーの内容の一覧化
オントロジーに含まれるエンティティ(entity、実在)をたどる方法がある。次の表の通りである。
表に示したメソッドは生成子(generator、ジェネレータ)を返す。
>>> for c in onto2.classes(): print(c.name)
AA
D
BB
>>> onto2.classes()
<generator object _GraphManager.classes at 0x00000215EC6B5700>
また、前節のimported_ontologiesの例でリスト(list())をとっていたのは、このためであった。
>>> onto2.imported_ontologies[0].classes()
<generator object _GraphManager.classes at 0x00000215EC6B4C70>
>>> list(onto2.imported_ontologies[0].classes())
[t001.A, t001.C, t001.B]
