如何用推理器推断给定数据/对象属性的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 reasoner推断域时,我得到了owl:thing
类,而不是rat
或bird
:
Set<OWLClass> inferedDomains = hermitReasoner
.getDataPropertyDomains(hasNameProperty, false)
.getFlattened();
我可以通过使用owl-api读取HasName
的DataPropertyDomainAxioms
来手动提取域,从而获得Rat
和Bird
类。但是我将无法获得其他可推断的类(例如,rat
有一个等效的类mouse
)。
所以我想用推理机来推断结果,比如:
有没有办法达到这样的效果?
您定义为domain的类是一个匿名类(两个命名类的联合),因此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
时,选择是使推理不完整(通过只返回或多或少任意的匿名表达式集)、不可判定(通过返回无限集)或仅将其限制为命名类。后者被认为是最好的解决办法。
考虑一个具有以下公理(OWL:class C1)和(OWL:class P)的本体,一个对象属性(RDFS:domain observes C1)(RDFS:range observes P)以及一个个体(RDF:type P P) 然后,通过创建具有限制(观察C2 p)的类C2(RDFS:subclassof C2 C1)来限制类C1 现在,当我创建一个新的个体(rdf:type x owl:t
我已经使用OWL API4.1.3加载了我的本体,它并不大。由于需要使用推断信息,我还使用Hermit1.3.8.413库进行了推理。下面的代码显示了我是如何完成的。 它不会抛出任何错误,但它需要将推断出的本体存储在一个新文件中。事实上,即使在2天后,它也没有完成工作。我的IDE是eclipse EE,我为运行这个应用程序提供了6到12 GB的内存。我找不到任何问题与我的代码或我的本体。
我有一个包含不同类型事件的本体论。因此我有三个类:A、B、C和一个helper类Temp。 我希望推理器为每找到一对个体a(RDF:TypeOf a)和b(RDF:TypeOf b)创建一个新个体作为C的子类。这个新个体应该包含关于a和B的信息。 在过去,我使用一个带有自己规则文件的jena推理器来得到这个结果,但现在我想切换到一个标准的OWL DL推理器。 和ad为a提供Temp类型,对Temp
谢谢你的帮助。 克里斯
Hospitals和hasNameWithWords值“Center”^^字符串 这个查询返回给我的实例是,在Protege4.2中,使用FACT++reasoner和Hermit reasoner的医院名称中有“Center” 但当我在OWL-API的DL查询示例中输入相同的查询时,该示例可在以下网站获得:http://sourceforge.net/p/owlapi/code/ci/aef69
我想从reasoner[隐士]那里得到推断出的公理,以及它的适当解释。我在Protege中创建了以下本体论。 A.OWL 以下是我的Java代码:- 门生形象:-