【问题标题】:Is it possible to make property assertions on class level in OWL 2?是否可以在 OWL 2 的类级别上进行属性断言?
【发布时间】:2015-03-16 10:54:52
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: inheritance semantic-web owl description-logic


    【解决方案1】:

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

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

    C subClassOf (p v)

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

    我只发现了同样的问题here,但唯一的答案暗示了一个不合适的解决方案:使该类成为 a 的子类 属性限制类。这导致推理者推断类 等同于 Nothing 类(因为没有命名 拥有此类财产的个人),从而造成不一致 因为个人分配给它。

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

    示例

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

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

    本体(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>
    

    【讨论】:

    • 但是如果你明确地不说一个个体有某个个体的属性,而只说一个类有某个类的属性,那么推理器就无法产生它。至少,如果可以的话,请告诉我怎么做。
    • @Artemis 我不明白您在该评论中要问什么。如果你说“C subClassOf (p value v)”然后说“c ∈ C”,你可以推断出“p(c,v)”。
    • 我认为被问到的是如果你有一个类的实例,并且你按照你的建议定义了限制,那么如何让推理器生成推理。你试过了吗?我已经完成了 OWLAPI 并且无法获得它。我想知道你是怎么做到的。
    • 您提供的解决方案是正确的。 (正如我引用的解决方案)我从 Protégé 收到不一致的消息(类标记为红色)但显然问题出在其他地方,因为我能够在大型本体之外重现您的简单示例和几个类似的示例。我不确定是什么让我相信这是错误的做法。感谢您非常详细的回答。
    • 请注意,如果课程不可满足,Protege 会将其标记为红色;也就是说,如果没有任何东西可以是它的实例。这与本体不一致不同。只有当某个人被要求成为不可满足的类的实例时,才会出现不一致。
    猜你喜欢
    • 2023-01-24
    • 1970-01-01
    • 2015-03-04
    • 2021-02-12
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多