2015-11-02 48 views
1

我試圖重現門徒的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本體)?

+0

更新:我現在已經測試了Jena源代碼提供的類層次結構示例。對於不是OWL本體的本體,它工作得很好。 – MarkS

回答

1

listHierarchyRootClasses()的狀態在其Javadoc中,它將使用根是貓頭鷹:事情。所以它不等同於你以後使用的方法,並且適用於本體。

請注意,您使用的本體是一個非常特殊的本體,因爲它是語言本身的本體建模部分。在大多數本體中,使用貓頭鷹:事情是正確的策略。

+0

嗨Ignazio - 謝謝你的迴應,感謝這是一個棘手的或專家的話題。我可以確認listHierarchyRootClasses()不返回owl:解析owl本體時的事情 - 這可能是因爲,正如你所說,這是OWL本體本身。問題在於它是所有OWL本體的依賴關係 - 所以更關鍵的是解析起來非常困難。 – MarkS

+1

不,規則的貓頭鷹本體不會導入本體 - 如果你檢查內部的評論,作者聲明貓頭鷹本體不應該/不會導入它,因爲它會使它們成爲完整的本體。語言原語直接在支持工具中編碼,所以通常在顯式內容中它們是不必要的。 – Ignazio

+0

我已經通過一些實驗更新了自己的發現。欣賞關於構建詞彙實體的評論,這可能會讓圖書館感到困惑,所以我將使用基於OWL的本體進行測試,這本體不是OWL本體! :) – MarkS

0

Ignazio是正確的 - 我曾嘗試使用Jena附帶的標準教程類層次結構構建器,您可以在GitHub上找到它:https://github.com/apache/jena/blob/master/jena-core/src-examples/jena/examples/ontology/classHierarchy/ClassHierarchy.java

This works,if你解析的本體不是OWL本體。所以,看起來好像本體混淆了底層框架,因爲它包含了一個硬編碼到框架中的實體的複製。

這花了我半天的時間來確定 - 但至少我現在知道,如果有人試圖查看OWL本體的類層次結構,則不應使用Jena框架!