本体中的属性覆盖

时间:2016-05-26 23:28:23

标签: owl ontology

我一直在四处寻找但是找不到一个很好的方法来模拟以下内容,我在owl中有两个类,另一个是另一个类的基类:

:Base rdf:type owl:Class .
:Sub rdf:type owl:Class;
     rdfs:subClassOf :Base .
:hasDescription rdf:type owl:DatatypeProperty .

我想要所有的实例:Base有一个固定的描述(:hasDescription" BASE"),以及所有的实例:Sub有不同的固定描述(:hasDescription" SUB&#34 )。但我想避免为每个实例创建一个三元组,例如

 :Base1 rdf:type :Base; 
       :hasDescription "BASE" .

我尝试使用猫头鹰:限制:

:Base rdf:type owl:Class .
      rdf:subClassOf [ rdf:type owl:Restriction ;
                              owl:onProperty :hasDescription ;
                              owl:hasValue "BASE"
                      ] .
:Sub rdf:type owl:Class;
     rdfs:subClassOf :Base ,
                     [ rdf:type owl:Restriction ;
                              owl:onProperty :hasDescription ;
                              owl:hasValue "SUB" 
                     ] .

但这不会起作用,因为那样:Sub会同时拥有" BASE"和" SUB"作为描述,因为它是Base的子类,Base又是带有值" BASE"的限制的子类。任何人都有关于如何在猫头鹰中做到这一点的建议?谢谢。

1 个答案:

答案 0 :(得分:0)

我认为这可能是可能的,但它突出了面向对象编程语言与OWL中存在的类层次结构之间的差异。它们是非常不同的东西,考虑更改模型可能是有意义的,因为您可能找不到满意的解决方案。

子类的每个实例都是其所有祖先的实例。这就是为什么你断言像

这样的东西

Base SubClassOf(hasDescription value“BASE”)

Base的子类的所有实例也将具有该值。 (当然,你已经知道了;你在问题中描述过它。)

你可以说, Sub实例的Base实例的值为“BASE”,Sub的实例的值为“SUB”,带有两个公理。有人说Sub的实例的值为“SUB”(你已经知道如何做了):

Sub SubClassOf(hasDescription value“SUB”)

要说, Sub的实例的Base实例的值为“BASE”,您可以使用类似的通用类公理:

Base和(不是Sub)SubClassOf(hasDescription值“BASE”)

在其他问题和答案中已经讨论了创建一般类公理的过程,并不难。参见,例如:

你可能遇到的困难是要使用这个公理。通常,当您断言某个东西是Base的实例时,您没有明确断言它是不是子类的实例。这是开放世界假设的一种表现:仅仅因为你不知道某些事情是真的并不意味着你不知道这是假的。

当然,您可以通过向个人添加其他类型断言来实现这一点。例如,如果x是Base而不是Sub,则只需要说:

x:基地
x:不是Sub