我試圖重現門徒的OWL本體(owl.ttl),你可以找到下載的標準URI位置http://www.w3.org/2002/07/owl#顯示我的類層次結構。試圖瞭解耶拿類層次結構
我想通過加載到一個OntModel,然後去獲取層次結構根類,使用Jena的API來做到這一點。然後,我想要緩解構建層次結構。
我得到的問題是,當我打電話來獲得層次結構根類,我得到零返回結果。所以我沒有根類來減輕和建立層次結構。
===========================================
當我將OWL本體http://www.w3.org/2002/07/owl#加載到Protege中時,我得到了一個很好的類層次結構。然而,當我加載到兩一個合理的,或不可理喻的耶拿模型,我得到像這樣沒有層次的類:
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告訴我模型的根級別是什麼,而是我告訴Jena它是rdfs:Resource?
========================================
更新:爲了解析本體,這是OWL2本體,我必須設置嚴格模式,因爲耶拿現在與OWL2本體不兼容(我正在使用2.7.4版本)。
當我打電話.listHierarchyRootClasses()與任一OWL_MEM或RDFS_MEM,我得到零個類返回。如果我叫.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困惑(無論是將它看作是RDFS本體還是OWL本體)?
更新:我現在已經測試了Jena源代碼提供的類層次結構示例。對於不是OWL本體的本體,它工作得很好。 – MarkS