2017-03-05 116 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