用 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,而不是 Rat
或 Bird
:
Set<OWLClass> inferedDomains = hermitReasoner
.getDataPropertyDomains(hasNameProperty, false)
.getFlattened();
我可以通过使用 owl-api 手动提取域来读取 hasName
的 DataPropertyDomainAxioms
,得到 Rat
,Bird
classes。但是我将无法得到其他可推断的 classes(例如 Rat
具有等效的 class Mouse
)。
所以我想用推理引擎来推理结果,比如:
- 推论者:HermiT、FacT++、...
- SQWRL 规则引擎:Drools,...
有什么方法可以达到这样的效果吗?
您定义为域的 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。后者被评为最佳方案。
如何使用推理机推断给定 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,而不是 Rat
或 Bird
:
Set<OWLClass> inferedDomains = hermitReasoner
.getDataPropertyDomains(hasNameProperty, false)
.getFlattened();
我可以通过使用 owl-api 手动提取域来读取 hasName
的 DataPropertyDomainAxioms
,得到 Rat
,Bird
classes。但是我将无法得到其他可推断的 classes(例如 Rat
具有等效的 class Mouse
)。
所以我想用推理引擎来推理结果,比如:
- 推论者:HermiT、FacT++、...
- SQWRL 规则引擎:Drools,...
有什么方法可以达到这样的效果吗?
您定义为域的 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。后者被评为最佳方案。