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を混乱させているのかもしれません.