是否可以在 OWL 2 中的类级别进行属性断言?

3 inheritance semantic-web owl description-logic

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

我想在“类上”进行此属性断言,以便推理器可以推断出其所有成员所拥有的属性,因此不需要为每个成员进行显式断言。(获得类似于基于类的面向对象的属性继承)

一个简单的例子是包含属于该类的milkBottle1个体的milkBottle2本体。它们都应该具有value 的属性,但显然这是类的所有成员共享的东西,并且只应该显式断言一次。milkBottle3MilkcontainsNutrientproteinMilk

我只在这里发现了同样的问题,但唯一的答案提出了一个不适当的解决方案:使该类成为属性限制类的子类。这导致推理器推断该类等同于 Nothing 类(因为不存在具有此类属性的命名个体),从而由于向其分配个体而造成不一致。

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

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

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

如果没有 OWL 2 中的解决方法,这可能吗?如果可以的话,该怎么办呢?

Jos*_*lor 5

我想在“类上”进行此属性断言,以便推理器可以推断出其所有成员所拥有的属性,因此不需要为每个成员进行显式断言。(获得类似于基于类的面向对象的属性继承)

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

C subClassOf (pv)

现在,关于您的补充评论:

我只在这里发现了同样的问题,但唯一的答案提出了一个不适当的解决方案:使该类成为属性限制类的子类。这导致推理器推断该类等同于 Nothing 类(因为不存在具有此类属性的命名个体),从而由于向其分配个体而造成不一致。

我刚才的建议与该答案中描述的内容相同。即使没有声明 C 类型的命名个体,“C subClassOf (p value v)”也没有任何不一致的地方。如果您遇到这种类型的解决方案的某些特定问题,您可能需要详细说明它(也许还可以问一个额外的问题);公理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 .
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果某个类无法满足,Protege 会将其标记为红色;也就是说,如果没有任何东西可以成为它的实例。这与本体不一致不同。如果某些个体被要求成为不可满足类的实例,则只会出现不一致。 (2认同)