如何使用推理器推断给定数据/对象属性的OWL域/范围?
例如,我有两个类/var/www/joomla/newlog
,Rat
和一个数据属性Bird
。我希望这些类只是hasName
:
hasName
当我使用HermiT推理器推断域时,我得到了<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
或Rat
:
Bird
我可以使用owl-api手动提取域来阅读Set<OWLClass> inferedDomains = hermitReasoner
.getDataPropertyDomains(hasNameProperty, false)
.getFlattened();
的{{1}},以获取DataPropertyDomainAxioms
,hasName
类。但是,我将无法获得其他可推断的类(例如Rat
具有等效的类Bird
)。
所以我想使用推理引擎来推断结果,例如:
有没有办法达到这样的效果?
答案 0 :(得分: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
时,选择是在使推理不完整(仅通过返回一组或多或少的任意匿名表达式),不可判定(通过返回无限集)或将其限制为命名之间仅限课程。后者被认为是最佳解决方案。