如何使用推理器推断给定数据/对象属性的OWL域/范围?
例如,我有两个类Rat、Bird和一个数据属性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>当我使用HermiT推理器推断域时,我得到了owl:Thing类,而不是Rat或Bird
Set<OWLClass> inferedDomains = hermitReasoner
.getDataPropertyDomains(hasNameProperty, false)
.getFlattened();通过使用owl读取DataPropertyDomainAxioms of hasName、获取Rat、Bird类,我可以手动提取域。但是,我将无法获得其他可推断的类(例如,Rat有一个等价的类Mouse)。
因此,我想使用推理机来推断结果,例如:
是否有任何办法来取得这种结果?
发布于 2017-03-05 20:09:31
您定义为域的类是匿名类(两个命名类的联合),因此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时,选择是使推理不完整(只返回或多或少任意的匿名表达式集)、不可判定的(通过返回无限集)还是只将其限制在指定的类上。后者被认为是最好的解决办法。
https://stackoverflow.com/questions/42609522
复制相似问题