2

Protege for the OWL オントロジー (owl.ttl) に表示されるクラス階層を再現しようとしています。これは、標準の URI の場所http://www.w3.org/2002/07/owl#でダウンロードできます。 .

私は Jena の API を使用して OntModel にロードし、階層のルート クラスを取得しようとしています。次に、階層を構築するために再帰します。

私が得ている問題は、階層のルート クラスを取得するために呼び出すと、結果が返されないことです。そのため、階層を再帰して構築するためのルート クラスがありません。

===========================================

http://www.w3.org/2002/07/owl#にある OWL オントロジーを Protege にロードすると、すばらしいクラス階層がまったく問題なく得られます。しかし、Jena で合理的モデルまたは非合理的モデルの両方にロードすると、次のような階層クラスは得られません。

OntModel reasonedModel = com.hp.hpl.jena.rdf.model.ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM_MINI_RULE_INF);
OntModel unreasonedModel = com.hp.hpl.jena.rdf.model.ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);

// <Code that loads in the ontology syntax into model skipped here>

// Now get the sets of root classes
reasonedModel.listHierarchyRootClasses();     // Returns empty set
unreasonedModel.listHierarchyRootClasses();   // Returns empty set

理由のあるモデルまたは不合理なモデルの両方の呼び出しは、ゼロの結果を返します。

==============================================

今、私は別のことを試しています。私は、rdfs:Resource が常に RDFS/OWL モデルの最上位クラスであることを知っています。だから、私がするとき:

OntClass topLevel = reasonedModel.getOntClass("http://www.w3.org/2000/01/rdf-schema#Resource");

// Get direct subclasses...
topLevel.listSubClasses(true);

ここから下に再帰すると、推論された関係を含む完全なクラス階層が得られます。これは、推論されたモデルを選択したためです。

私の質問は、後者のアプローチはこれを行う正しい方法ですか? モデルのルートレベルのクラスが何かを教えてくれるように Jena に頼むべきではないでしょうか。

========================================

更新: OWL2 オントロジーであるオントロジーを解析するには、現時点で Jena が OWL2 オントロジーと互換性がないため、厳密モードをオフに設定する必要がありました (私はバージョン 2.7.4 を使用しています)。

OWL_MEM または RDFS_MEM を指定して .listHierarchyRootClasses() を呼び出すと、ルート クラスが返されません。.listClasses() を呼び出し、スーパー クラスを持たないすべてのクラスを検索してルートを検索すると、RDFS_MEM で次の階層が得られます。

Class [http://www.w3.org/2002/07/owl#Axiom]
Class [http://www.w3.org/2002/07/owl#NegativePropertyAssertion]
Class [http://www.w3.org/2002/07/owl#Ontology]
Class [http://www.w3.org/2002/07/owl#AllDisjointClasses]
Class [http://www.w3.org/2002/07/owl#Annotation]
Class [http://www.w3.org/2002/07/owl#AllDifferent]
Class [http://www.w3.org/2002/07/owl#AllDisjointProperties]
Class [http://www.w3.org/2002/07/owl#OntologyProperty]
Class [http://www.w3.org/2002/07/owl#AnnotationProperty]
Class [http://www.w3.org/2002/07/owl#DatatypeProperty]
Class [http://www.w3.org/2002/07/owl#ObjectProperty]
        Class [http://www.w3.org/2002/07/owl#InverseFunctionalProperty]
        Class [http://www.w3.org/2002/07/owl#IrreflexiveProperty]
        Class [http://www.w3.org/2002/07/owl#AsymmetricProperty]
        Class [http://www.w3.org/2002/07/owl#TransitiveProperty]
        Class [http://www.w3.org/2002/07/owl#SymmetricProperty]
        Class [http://www.w3.org/2002/07/owl#ReflexiveProperty]
Class [http://www.w3.org/2002/07/owl#DeprecatedProperty]
Class [http://www.w3.org/2002/07/owl#FunctionalProperty]
Class [http://www.w3.org/2002/07/owl#DeprecatedClass]
Class [http://www.w3.org/2002/07/owl#Class]
        Class [http://www.w3.org/2002/07/owl#Restriction]
Class [http://www.w3.org/2002/07/owl#DataRange]
Class [http://www.w3.org/2002/07/owl#NamedIndividual]
Class [http://www.w3.org/2002/07/owl#Nothing]

OWL_MEM では、次のようになります。

Class [http://www.w3.org/2002/07/owl#NamedIndividual]
Class [http://www.w3.org/2002/07/owl#Nothing]

繰り返しますが、どちらも Protege にロードするときに表示されるのと同じ階層を反映していません。

ここで何が間違っているのかはっきりしません.OWLオントロジーを解析していて、これ自体がJenaを混乱させているのかもしれません.

4

2 に答える 2

2

listHierarchyRootClasses() は、使用するルートが owl:Thing であるとその javadoc で述べています。したがって、後で使用したアプローチと同等ではなく、このオントロジーで機能します。

使用しているオントロジーは、言語自体の一部をモデル化するオントロジーであるため、非常に特殊なものであることに注意してください。ほとんどのオントロジーでは、owl:Thing を使用するのが正しい戦略です。

于 2015-11-02T17:38:25.867 に答える
0

Ignazio は正しかった - 私は Jena に含まれている標準のチュートリアル クラス階層ビルダーを使用してみました。 jena/examples/ontology/classHierarchy/ClassHierarchy.java .

これは、解析しているオントロジーが OWL オントロジーでない場合に機能します。そのため、オントロジーはフレームワークにハードコーディングされたエンティティの複製を含んでいるため、基礎となるフレームワークを混乱させているように見えます。

これを確認するのに半日かかりましたが、少なくとも、誰かが OWL オントロジーのクラス階層を表示しようとする場合、Jena フレームワークを使用すべきではないことがわかりました。

于 2015-11-03T07:55:56.247 に答える