【问题标题】:OWL Class and Subclass Property InheritanceOWL 类和子类属性继承
【发布时间】:2026-01-19 19:05:02
【问题描述】:

我对 OWL 类和子类的属性继承感到困惑。有些帖子说 OWL 中没有继承(OWL: How to get inheritance of property relations between two classes from those of superclasses?http://answers.semanticweb.com/questions/619/rdfs-owl-inheritance-with-josekipellet)。但是,我也发现了一些相反的讨论。例如,“面向对象软件开发人员的语义 Web 入门”页面 (https://www.w3.org/TR/sw-oosd-primer/) 提到,对于面向对象的语言、OWL 和 RDF:“类可以通过继承安排在子类层次结构中”(第 3.3 节)。 https://www.w3.org/TR/rdf-schema/#ch_subclassof 提到“属性 rdfs:subClassOf 是 rdf:Property 的一个实例,用于说明一个类的所有实例都是另一个类的实例。”因此,这让我很困惑。现在我有以下问题:

  • 和面向对象的语言一样,rdfs:subclassOf 是否继承了超类的属性?
  • 如果不是那么

    • RDF/OWL中继承是什么意思?
    • 是否可以用OWL/RDF构造面向对象的语言类型类-子类继承?
    • 考虑以下示例。 “Lecturer”和“Student”的所有属性都对“Person”类可用吗?

      Example:
      --------
         ### Classes ###
       :CSModule rdf:type owl:Class ;
            rdfs:subClassOf :Module .
      
       :Lecturer rdf:type owl:Class ;
           rdfs:subClassOf :Person .
      
       :Student rdf:type owl:Class ;
          rdfs:subClassOf :Person .
      
       :Module rdf:type owl:Class .
      
       :Person rdf:type owl:Class .
      
      ### Object Properties ###
      
      :studies rdf:type owl:ObjectProperty ;
      
         rdfs:domain :Student ;
         rdfs:range :Module .
      
      :teaches rdf:type owl:ObjectProperty ;
      
         rdfs:domain :Lecturer ;
         rdfs:range :Module .
      
      ### Data properties ###
      
      :name rdf:type owl:DatatypeProperty ;
        rdfs:domain :Person ;
        rdfs:range xsd:string .
      
      :staffID rdf:type owl:DatatypeProperty ;
        rdfs:domain :Lecturer ;
        rdfs:range xsd:integer .
      
      :studentID rdf:type owl:DatatypeProperty ;
        rdfs:domain :Student ;
        rdfs:range xsd:integer .
      
      ### Individuals ###
      
      :CS101 rdf:type owl:NamedIndividual ,
       :CSModule .
      
      :Lecturer1 rdf:type owl:NamedIndividual ,
       :Lecturer ;
       :teaches :CS101 ;
       :name "Dr.John" ;
       :staffID 7777 .
      
      :Student1 rdf:type owl:NamedIndividual ,
       :Student ;
       :studies :CS101 ;
       :name "James" ;
       :studentID 1234 .
      

如果有人给我一个很好的例子的答案,那将非常有帮助。提前谢谢你。

【问题讨论】:

    标签: rdf owl ontology rdfs


    【解决方案1】:

    和面向对象的语言一样,rdfs:subclassOf 是继承父类的属性吗?

    说属性 p 的域是类 D 意味着当你有一个三元组时

    x p y
    

    你可以推断出三元组

    x rdf:type D
    

    没有属性继承的概念。如果您知道 E 是 D 的子类,并且您会看到三元组

    e p y  
    e rdf:type E  
    E rdfs:subClassOf D
    

    您现在有两种方法可以知道 e rdf:type D。第一个是因为 e p y 意味着 e rdf:type D。第二个是因为你知道e是E,E是D的子类,e也是D。

    RDF/OWL中的继承是什么意思?

    RDF 和 OWL 中的类是集合。当你知道 E 是 D 的子类时,这意味着 E 的每个元素都是 D 的元素;也就是说,E 的个体集是 D 的个体集的子集。

    属性也是如此。如果 q 是 p 的子属性,则意味着 x q y 隐含 x p y

    是否可以用OWL/RDF构造面向对象的语言类型类-子类继承?

    这里不是很清楚你的意思。您需要准确指定 OO 语言类型类子类继承的含义。你会得到很多相同的行为。例如,如果你知道 D 的每个实例都有一个特定的,那么你知道 E 的每个实例也有,因为 E 的每个实例 都是 DEg 的一个实例,如果你有

    D SubClassOf (hasColor some Color)
    

    那么你可以推断出

    E SubClassOf (hasColor some Color)
    

    所以从这个意义上说,存在继承。

    考虑以下示例。 “Lecturer”和“Student”的所有属性都对“Person”类可用吗?

    “可用”可能具有误导性。对于类(即类中的个人),哪些属性可用或不可用是没有意义的。如果你有这样的层次结构:

    Lecturer rdfs:subClassOf Person  
    teachesCourse rdfs:domain Lecturer
    teachesCourse rdfs:range Course
    

    这意味着当你看到一个三元组时

    Jones teachesCourse Calculus
    

    你可以推断出来

    Jones rdf:type Lecturer  
    Jones rdf:type Person  
    Calculus rdf:type Course
    

    从某种意义上说,teacherCourse 属性对每个 Person 都是“可用的”,但是一旦使用它,就意味着该 Person 必须是 Lecturer。这与您在面向对象的编程语言中所拥有的非常相似,不是吗?例如,如果你有 Java:

    class Person { }
    
    class Lecturer {
      Course[] getCourses() { /* ... */ }
    }
    

    那么可能会有 Person 的实例具有 getCourses() 方法。碰巧那些 Person 的实例也必须是 Lecturer 的实例。

    【讨论】:

      【解决方案2】:

      我会尝试回答你的一些问题

      RDF/OWL中的继承是什么意思?
      owl 中的继承与面向对象语言中的继承有些不同。我们可以从集合论的角度来思考它。猫头鹰类基本上表示个体的集合。然后使用属性来指定有关个人的事实。因此,当您在 owl 类上“定义”一个属性时,您基本上是在说该类的个体具有该属性(全部或部分取决于属性的定义方式)。
      从您链接的帖子中:
      “子类表示一个类是另一个类的子集,这意味着(通过推断)一个子类的所有成员都是(超)类的成员”

      因此,如果您说一个类是另一个类的子类,则基本上意味着超类(超集)个体上的任何属性都可以在子类(子集)的个体上

      从你自己的例子中,你问:
      “Lecturer”和“Student”的所有属性都可用于“Person”类吗?
      不,因为您已将 Lecutrer 和 Student 定义为类(集)Person 的子类(子集)。基本上,每个学生或讲师都是一个人,但反之则不然。因此,在 Person 上定义的属性可以被 Lecturer 和 Student 使用。

      是否可以用OWL/RDF构造面向对象的语言类型类-子类继承
      嗯,是的,但这有点困难。由于开放世界的假设,这一切都变得更加模糊。

      希望这能稍微消除您的困惑。我建议使用本体和推理器来查看这些断言的实际行为。有很多有趣的行为(部分源于深度学习,但主要是由于开放世界假设)。 Protege 是一个很好的工具。

      【讨论】:

      • 我认为当有人说 RDFS/OWL 具有任何形式的继承时,这个问题就会变得混乱。它通过暗示集合论/谓词逻辑语义起作用。其中一些可以被解释为类似于 OO 系统中的继承,但随着时间的推移,在许多设置中,我发现最好明确 RDFS/OWL 中不存在继承,并解释集合、子集和标准推理如何配置文件(影响)工作。
      • 感谢您的回答。您提到“因此,如果您说一个类是另一个类的子类,则基本上意味着超类(超集)个体上的任何属性都可以在子类(子集)的个体上。”但是,@Joshua Taylor:说“没有财产继承的概念。”是不是很矛盾?如果我有一个名为“Person”的类,它有两个属性“age”和“address”,假设“Lecturer”是“Person”的子类。那么属性“年龄”和“地址”将像面向对象语言一样对“讲师”可用?
      • 不,这些陈述并不矛盾。具有属性:age:address:Person 的类定义对:Person 的实例没有任何影响,并且不适用于:Lecturer:age:address 将仅可用于 :Person 类定义。这是 RDFS 和 OO 编程语言的本质区别。
      • 实际上,我怀疑“因此,如果您说一个类是另一个类的子类,则基本上意味着超类(超集)个体上的任何属性都可以在子类的个体上(子集)。”是错误引用或措辞不当。你能指出我说这话的地方吗?
      • 没有。在 RDFS 和 OWL 中,类/子类仅与类成员资格(集)有关。 rdfs:subClassOf 没有其他语义。