OWLAPI では、owl:imports ステートメントを介してインポートされたオントロジーに問題があります。問題は、インポートされたオントロジーに含まれるクラスとクラスの注釈のインスタンスが取得されず、返されないことです。
オントロジーの部屋とオントロジーの建物があるとしましょう。
オントロジールームでは、建物オントロジーをルームオントロジーにロードすることになっている次のステートメントがあります。
<owl:Ontology rdf:about="http://example.com/rooms.xml">
<owl:imports rdf:resource="http://example.com/buildings.xml"/>
</owl:Ontology>
次に、OWLAPI でオントロジー ルーム (自動的に建物が含まれる必要があります) を読み込みます。
manager = OWLManager.createOWLOntologyManager()
roomsOntology = manager.loadOntologyFromOntologyDocument(IRI.create("http://example.com/rooms.xml"))
reasoner = Reasoner.new(roomsOntology)
factory = manager.getOWLDataFactory()
その後、Buildings オントロジーからクラスを取得しても、期待どおりに機能します。
buildingClass = factory.getOWLClass(IRI.create("http://example.com/buildings.xml#Building"))
クラス Building のインスタンスを取得したい場合 (これらのインスタンスの定義は、インポートされた Buildings オントロジーに含まれています)、何も返しません。
instances = buildingClass.getIndividuals(roomsOntology)
変数「インスタンス」は現在空です。
そのようなクラスの定義が建物オントロジーに含まれている場合、同じ問題がクラスの注釈にも発生します。
次の場合に機能させることができます。
- インスタンスの定義を部屋のオントロジーに直接移動します (いずれにせよ 2 つの別個のオントロジーがあるため、これは本番環境では不可能です)。
- Reasoner クラスの関数を使用します (
reasoner.getInstances(buildingClass, true)
両方のオントロジーからインスタンスを返します) - メイン (Rooms) オントロジーの代わりに、インポートしたオントロジーを getIndividuals 関数に渡します (
buildingClass.getIndividuals(manager.getImports(roomsOntology))
)
回避策 No. 1 を作成することはできません (テスト目的のみでした)。No. 2 と 3 は、複数のオントロジーをOWLClass.getAnnotations
関数に渡すことができず、Reasoner には注釈を取得する機能がないため、注釈を取得する必要がある場合は機能しません。
とにかく、インポートされたものを含むすべてのオントロジーは最初に機能とともにロードされるため、これらの回避策がなくてもすべてが機能するはずだと思いましたmanager.loadOntologyFromOntologyDocument
。