用 OWL 个推理器推断 domains/ranges

Infer domains/ranges with OWL reasoners

如何使用推理机推断给定 data/object 属性 的 OWL domains/ranges?

比如我有两个classesRat,Bird和一个数据属性hasName。我希望这些 classes 成为 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 class,而不是 RatBird:

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

我可以通过使用 owl-api 手动提取域来读取 hasNameDataPropertyDomainAxioms,得到 RatBird classes。但是我将无法得到其他可推断的 classes(例如 Rat 具有等效的 class Mouse)。

所以我想用推理引擎来推理结果,比如:

有什么方法可以达到这样的效果吗?

您定义为域的 class 是一个匿名域(两个名为 classes 的联合),因此它不能被 return 的实现OWLReasoner.

要解决此限制,您可以搜索 属性 断言域的子 classes - 因此,使用 OWLOntology::getDataPropertyDomainAxioms(OWLDataProperty) 您将从根检索联合ontology;使用 OWLReasoner::getSubClasses(OWLClassExpression, false) 您将能够检索包含析取子 class 的所有节点。每个节点将包含一组等效的 classes;在您的情况下,我希望看到一个包含 {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 在其任何方法中都没有 return 匿名表达式的原因是这些方法中的匿名表达式是无限的:例如,给定任何 class,这个 class 有无限个匿名子 class。证明太长,无法在此处复制,但可以在描述逻辑文章和书籍中轻松找到。

因此,当 OWLReasoner 被设计时,选择是在使推理不完整(仅通过 return 或多或少任意的匿名表达式集)和不可判定(通过 returning 无限集)或将其限制为仅命名为 classes。后者被评为最佳方案。