2017-03-05 74 views
0

我如何可以推斷與推理給定的數據/對象屬性的OWL域/範圍?推斷域/範圍

例如,我有兩個類RatBird和數據屬性hasName。我想這些類是hasName的單獨的域:

<Declaration><Class IRI="#Rat"/></Declaration> 
<Declaration><Class IRI="#Bird"/></Declaration> 
<Declaration><DataProperty IRI="#hasName"/></Declaration> 
<DataPropertyDomain> 
    <DataProperty IRI="#hasName"/> 
    <ObjectUnionOf> 
     <Class IRI="#Rat"/> 
     <Class IRI="#Bird"/> 
    </ObjectUnionOf> 
</DataPropertyDomain> 

當我用隱士推理推斷域,我得到了owl:Thing類,而不是RatBird

Set<OWLClass> inferedDomains = hermitReasoner 
          .getDataPropertyDomains(hasNameProperty, false) 
          .getFlattened(); 

我可以手動通過使用OWL-API來讀取的hasNameDataPropertyDomainAxioms提取域,讓RatBird類。但後來我就無法得到其他可推斷類(例如Rat有一個等價類Mouse)。

所以我想使用推理引擎來推斷的結果,如:

  • 推理:隱士,其實++,...
  • SQWRL規則引擎:Drools的,...

有什麼方法來達到這樣的效果?

回答

2

您定義爲域類是匿名的一個(兩個命名類的聯合),所以它不能由OWLReasoner實現返回。

要解決此限制,您可以搜索屬性的斷言域的子類 - 因此,使用OWLOntology::getDataPropertyDomainAxioms(OWLDataProperty),您將從根本體中檢索聯合;與OWLReasoner::getSubClasses(OWLClassExpression, false)您將能夠檢索包含該分離的子類的所有節點。每個節點將包含一組等同的類;在你的情況下,我希望看到一個包含{Rat, Mouse}的節點和一個包含{Bird}的節點。

編輯:添加例子來回答評論。

OWLOntology o = ... //root ontology for the reasoner 
OWLReasoner r = ... 
OWLDataProperty p = ... 
for (OWLDataPropertyDomainAxiom ax: o.getDataPropertyDomainAxioms(p)) { 
    OWLClassExpression c = ax.getDomain(); 
    NodeSet<OWLClass> allSubClasses = r.getSubClasses(c, false); 
    // allSubClasses contains all named subclasses of the domain 
} 

正如意見建議的@AKSW,爲什麼OWLReasoner不以任何它的方法返回的匿名錶達的原因是由於這樣的事實:在這些方法中的匿名錶達式是無限的:例如,給定任何類,這個類有無限的匿名子類。證明太長而無法複製,但可以在描述邏輯文章和書籍中輕鬆找到。

所以,當OWLReasoner設計,選擇是作出推理不完整的(僅返回或多或少任意設置匿名錶達式),不可判定(通過返回一個無限集合),或者將其限制爲只名爲類之間。後者被認爲是最好的解決方案。

+0

您的意思是首先我得到本體屬性的所有屬性域公理:OWLOntology :: getDataPropertyDomainAxioms,之後對於每個公理我得到公理簽名中的所有類:OWLDataPropertyDomainAxiom :: getClassesInSignature,然後爲每個類我都得到這個類的所有子類:'OWLReasoner :: getSubClasses'? – MiP

+0

不,只有域類 - 這是一個匿名類,不會出現在簽名中。 OWLDataPropertyDomainAxiom有一個專門的方法。 – Ignazio

+0

我不知道爲什麼,但當我使用'getClassesInSignature'時,它列出了這個匿名類的所有子類。你在談論哪種方法? – MiP