1

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)

変数「インスタンス」は現在空です。

そのようなクラスの定義が建物オントロジーに含まれている場合、同じ問題がクラスの注釈にも発生します。

次の場合に機能させることができます。

  1. インスタンスの定義を部屋のオントロジーに直接移動します (いずれにせよ 2 つの別個のオントロジーがあるため、これは本番環境では不可能です)。
  2. Reasoner クラスの関数を使用します (reasoner.getInstances(buildingClass, true)両方のオントロジーからインスタンスを返します)
  3. メイン (Rooms) オントロジーの代わりに、インポートしたオントロジーを getIndividuals 関数に渡します ( buildingClass.getIndividuals(manager.getImports(roomsOntology)))

回避策 No. 1 を作成することはできません (テスト目的のみでした)。No. 2 と 3 は、複数のオントロジーをOWLClass.getAnnotations関数に渡すことができず、Reasoner には注釈を取得する機能がないため、注釈を取得する必要がある場合は機能しません。

とにかく、インポートされたものを含むすべてのオントロジーは最初に機能とともにロードされるため、これらの回避策がなくてもすべてが機能するはずだと思いましたmanager.loadOntologyFromOntologyDocument

4

1 に答える 1