当前位置: 首页 > 知识库问答 >
问题:

使用OWL推理器推断域/范围

蒙墨竹
2023-03-14

如何用推理器推断给定数据/对象属性的OWL域/范围?

例如,我有两个类ratbird和一个数据属性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类,而不是ratbird:

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

我可以通过使用owl-api读取HasNameDataPropertyDomainAxioms来手动提取域,从而获得RatBird类。但是我将无法获得其他可推断的类(例如,rat有一个等效的类mouse)。

所以我想用推理机来推断结果,比如:

  • 推理器:隐士、fact++、...
  • SQWRL规则引擎:Drools,...

有没有办法达到这样的效果?

共有1个答案

微生阳平
2023-03-14

您定义为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代码:- 门生形象:-