2.5.5 エンティティの検索(searchメソッド)
owlready2のオントロジーオブジェクトにあるエンティティを検索する方法は、searchメソッドを利用する。
- iriに検索の文字列を指定して検索
- 検索対象はインディビデュアルとクラス
- オプションとして、subclass_of、is_aでクラスを指定可能
- オプションとして、どんなプロパティも指定可能
例えば、すべてのインディビデュアルとクラスを検索する場合次のようにすればよい。
>>> onto.search(iri='*')
[.anonymous, _downloads.bacteria.owl, bacteria.has_shape, bacteria.Bacterium, bacteria.Shape, bacteria.is_shape_of, bacteria.has_grouping, bacteria.Grouping, bacteria.is_grouping_of, bacteria.gram_positive, bacteria.nb_colonies, bacteria.Round, bacteria.Rod, bacteria.Isolated, bacteria.InPair, bacteria.InCluster, bacteria.InChain, bacteria.InSmallChain, bacteria.InLongChain, bacteria.Pseudomonas, bacteria.Coccus, bacteria.Bacillus, bacteria.Staphylococcus, bacteria.Streptococcus, bacteria.round1, bacteria.in_cluster1, bacteria.unknown_bacterium, test.t001, t001.has, t001.A, t001.C, t001.B, test.t002, t002.AA, t002.D, t002.BB, t002.aa, t002.x]
メモリ中のすべての範囲を検索するならdefault_worldをオントロジーオブジェクトとして指定する。
>>> default_world.search(iri='*')
[.anonymous, _downloads.bacteria.owl, bacteria.has_shape, bacteria.Bacterium, bacteria.Shape, bacteria.is_shape_of, bacteria.has_grouping, bacteria.Grouping, bacteria.is_grouping_of, bacteria.gram_positive, bacteria.nb_colonies, bacteria.Round, bacteria.Rod, bacteria.Isolated, bacteria.InPair, bacteria.InCluster, bacteria.InChain, bacteria.InSmallChain, bacteria.InLongChain, bacteria.Pseudomonas, bacteria.Coccus, bacteria.Bacillus, bacteria.Staphylococcus, bacteria.Streptococcus, bacteria.round1, bacteria.in_cluster1, bacteria.unknown_bacterium, test.t001, t001.has, t001.A, t001.C, t001.B, test.t002, t002.AA, t002.D, t002.BB, t002.aa, t002.x]
検索文字列にはアスタリスク(*)をワイルドカードとして利用する。英数記号文字とアスタリスクを混ぜて検索文字列をつなげて検索文字列を作る。
>>> onto.search(iri='*Coccus*')
[bacteria.Coccus]
>>> onto.search(iri='*Co*s*')
[bacteria.Coccus]
>>> onto.search(iri='*C*s*')
[bacteria.InCluster, bacteria.Coccus]
>>> onto.search(iri='*C*s')
[bacteria.Coccus]
オプションにsubclass_ofを指定した場合はクラスのみ、is_aを指定するとクラスとインディビデュアルを検索する。
>>> onto.search(iri='*', subclass_of=onto.Bacterium)
[bacteria.Bacterium, bacteria.Pseudomonas, bacteria.Coccus, bacteria.Bacillus, bacteria.Staphylococcus, bacteria.Streptococcus]
>>> onto.search(iri='*', is_a=onto.Bacterium)
[bacteria.Bacterium, bacteria.Pseudomonas, bacteria.Coccus, bacteria.Bacillus, bacteria.Staphylococcus, bacteria.Streptococcus, bacteria.unknown_bacterium]
大文字、小文字の区別には_case_sensitiveオプションを使う。
>>> onto.search(iri='*Coccus*', _case_sensitive=False)
[bacteria.Coccus, bacteria.Staphylococcus, bacteria.Streptococcus]
searchメソッドの返り値はPythonのリストではないが、リストのように扱える。
>>> r = onto.search(iri='*Coccus*', _case_sensitive=False)
>>> r.__class__
<class 'owlready2.triplelite._SearchList'>
>>> print(r)
[bacteria.Coccus, bacteria.Staphylococcus, bacteria.Streptococcus]
>>> for e in r: print(e)
...
bacteria.Coccus
bacteria.Staphylococcus
bacteria.Streptococcus
iriを文字列で検索するのではなく、typeでクラスを指定してインディビデュアルを検索してもよい。
>>> onto.search(type=onto.Bacterium)
[bacteria.unknown_bacterium]
プロパティを指定するのは以下のようにする。
>>> onto.search(type=onto.Bacterium, gram_positive='*')
[bacteria.unknown_bacterium]
>>> onto.search(type=onto.Bacterium, has_grouping=[onto.isolated1, onto.by_two1])
[bacteria.unknown_bacterium]
2.5.6 名前空間namespaceの扱い
オントロジーはファイル単位で作成されており、オントロジーをget_ontologyメソッドで読み込んだ場合、そのオントロジーの名前空間で処理される。インターネットでアクセスしたオントロジーであってもget_ontologyで取ったオントロジーの名前空間での処理となる。しかしそのオントロジーの中で別の名前空間が設定されている場合は、その名前空間のオブジェクトを作らないと、そのエンティティにアクセスできない。そのためにget_namespaceを用いる。
例えば、t001オントロジーには次のようなクラスとインディビデュアルがある。
>>> from owlready2 import *
>>> t001 = get_ontology('t001.rdf').load()
>>> t001
get_ontology("https://www.test.org/test/t001#")
>>> t001.search(iri='*')
[.anonymous, test.t001, t001.has, t001.A, t001.C, t001.B, QQ.a_qq]
ここで、test.t001とQQ.a_qqはこのままではアクセスできない。
>>> QQ.a_qq
Traceback (most recent call last):
File "<python-input-6>", line 1, in <module>
QQ.a_qq
^^
NameError: name 'QQ' is not defined. Did you mean: 'qq'?
>>> test.t001
Traceback (most recent call last):
File "<python-input-7>", line 1, in <module>
test.t001
^^^^
NameError: name 'test' is not defined
そこで、QQとtestの名前空間をファイルを調べて、そのIRIをget_namespaceで設定すればアクセスできる。
>>> qq = get_namespace('https://www.qqq.org/QQ#')
>>> qq.a_qq
QQ.a_qq
>>> TEST = get_namespace('https://www.test.org/test/')
>>> TEST.t001
test.t001
但し、オントロジーを作るときは、ファイルに対応するデフォルトの名前空間だけとするようにしておいた方が、後々の混乱を避けるためによいだろう。