1

我有一个 OWL 2 本体,其中包含几个属于一个类的命名个体,这些个体需要具有相同的对象属性和相同的值。

我想在“类上”做出这个属性断言,这样推理器可以推断出它的所有成员都拥有的属性,因此不需要为每个成员明确断言。(获得类似于基于类的面向对象的属性继承)

一个简单的例子可以是一个本体,其中包含属于该类的个体milkBottle1, 。它们都应该具有带有 value的属性,但显然这是类的所有成员共享的东西,并且应该只显式声明一次。milkBottle2milkBottle3MilkcontainsNutrientproteinMilk

我只在这里找到了同样的问题,但唯一的答案提出了一个不合适的解决方案:使该类成为属性限制类的子类。这导致推理器推断该类等同于 Nothing 类(因为没有具有此类属性的命名个体),因此由于将个体分配给它而产生了不一致。

我知道这是一项使用 SWRL 规则的简单任务,例如

牛奶(?a) → 含有营养物(?a, 蛋白质)

但如果可能的话,我想避免它们。

如果没有 OWL 2 中的解决方法,这可能吗?如果是这样,怎么办?

4

1 回答 1

4

我想在“类上”做出这个属性断言,这样推理器可以推断出它的所有成员都拥有的属性,因此不需要为每个成员明确断言。(获得类似于基于类的面向对象的属性继承)

如果你想说某个类 C 的每个成员都有单独的 v 作为属性 p 的值,你可以这样写:

C subClassOf (pv)

现在,关于您的附加评论:

我只在这里找到了同样的问题,但唯一的答案提出了一个不合适的解决方案:使该类成为属性限制类的子类。这导致推理器推断该类等同于 Nothing 类(因为没有具有此类属性的命名个体),因此由于将个体分配给它而产生了不一致。

我刚刚建议的内容与该答案中描述的内容相同。说“C subClassOf (p value v)”并没有什么矛盾,即使没有声明的 C 类型的命名个体。如果您在使用这种类型的解决方案时遇到一些特殊问题,您可能需要详细说明(并且可能会问一个额外的问题);公理C subClassOf (p value v)包含 SWRL 规则C(?c) → p(?c,v)。(SWRL 规则不太通用,因为它只适用于命名的个人,而公理适用于所有个人。)

例子

图 1:C 是 (p value v)的子类。 C subClassOf (p 值 v)

图 2:启用推理器后,类型 C 的单个 c 被推断为具有 v 作为属性 p 的值。 p(c,v)

本体(TTL 和 RDF/XML)

@prefix :      <http://stackoverflow.com/q/29075078/1281433#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

:c      a       owl:NamedIndividual , :C .

:C      a                owl:Class ;
        rdfs:subClassOf  [ a               owl:Restriction ;
                           owl:hasValue    :v ;
                           owl:onProperty  :p
                         ] .

:p      a       owl:ObjectProperty .

:       a       owl:Ontology .

:v      a       owl:Thing , owl:NamedIndividual .
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
    xmlns="http://stackoverflow.com/q/29075078/1281433#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
  <owl:Ontology rdf:about="http://stackoverflow.com/q/29075078/1281433#"/>
  <owl:Class rdf:about="http://stackoverflow.com/q/29075078/1281433#C">
    <rdfs:subClassOf>
      <owl:Restriction>
        <owl:onProperty>
          <owl:ObjectProperty rdf:about="http://stackoverflow.com/q/29075078/1281433#p"/>
        </owl:onProperty>
        <owl:hasValue>
          <owl:Thing rdf:about="http://stackoverflow.com/q/29075078/1281433#v">
            <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#NamedIndividual"/>
          </owl:Thing>
        </owl:hasValue>
      </owl:Restriction>
    </rdfs:subClassOf>
  </owl:Class>
  <owl:NamedIndividual rdf:about="http://stackoverflow.com/q/29075078/1281433#c">
    <rdf:type rdf:resource="http://stackoverflow.com/q/29075078/1281433#C"/>
  </owl:NamedIndividual>
</rdf:RDF>
于 2015-03-16T14:43:09.467 回答