当前位置: 首页 > 工具软件 > Owl > 使用案例 >

OWL学习笔记

朱兴安
2023-12-01

OWL学习笔记(一)

参考博客
官方文档

本体

本体是用来描述某个领域的知识的。描述了该领域内各个概念和概念间的关系。(使用本体是为了用它进行关于个体的推理)

OWL介绍

OWL(Ontology Web Language) 是一种本体语言,是W3C(World Wide Web Constraint)

三类OWL

  • OWL-lite :三类中层次结构最简单的
  • OWL-DL : 和OWL-Lite相比,OWL-DL表达能力要丰富许多,它的基础是描述逻辑
  • OWL-full 表达能力最强,不能进行自动推理

OWL本体的组成

  • individual 也被称作instance owl不使用唯一命名假设,即两个不同的名称可以对应一个个体。在owl中,必须要明确表示两个个体之间是否相同,否则他们的关系是不明确的。
  • property 属性是个体之间的二元关系,在描述逻辑中他们就是角色的概念。
    一种分法分为:
    函数属性,通过这个属性只能连接一个个体,例如hasBirthMother
    反函数属性
    传递属性
    对称属性

    另一种更为常见的分法:
    对象属性:连接两个个体,两个类的实例间的关系
    数据类型属性:连接个体和XML schema数据类型值或者rdf literal,该属性不能为传递的,对称的,反函数的。
    标注属性:用来对类、属性、个体和本体添加信息。
  • class 类,表示一些个体的集合。用数学的方法描述该类成员必须具备的条件。有时候也被称作概念,实际上类是概念的一个具体表现。

OWL中本体的结构

  • 命名空间
    在使用一组术语之前,需要精确地指出哪些具体的词汇表将会用到。一个典型的OWL本体以命名空间声明开始,这些命名空间写到rdf:RDF 标签中。
    属性值是不具有命名空间的,在OWL里可以写出它们的完整URI。完整的URI中可以利用实体定义来简略。
    如:
<!DOCTYPE rdf:RDF [
<!ENTITY vin  "http://www.w3.org/TR/2004/REC-owl-guide-20040210/wine#" >
<!ENTITY food "http://www.w3.org/TR/2004/REC-owl-guide-20040210/food#" > 
]>

在这些声明实体后,我们可以将vin/merlot作为http://www.w3.org/TR/2004/REC-owl-guide-20040210/wine#merlot的简写

  • 本体头部
    在owl:Ontology标签中给出本体的声明,这些标签支持一些重要的常务工作,比如注视、版本控制以及其他本体的嵌入
    rdf:about 属性为本体提供一个名称或者引用
    rdf:comment提供本体的注解

基本元素

  • 简单的具名类:一个领域中最基本的概念对应各个分类层次树的根
    rdf:ID = "Region"被用于引入一个名称(作为定义的一部分)之后,我们可以用#Region来引用Region类,例如:rdf:resource= “#Region”
    rdfs:subClassOf是用于类的基本分类构造符,次关系是可以传递的。
    一个类的定义由两部分组成,引入或引用一个名称,以及一个限制表。
<owl:Thing rdf:ID="CentralCoastRegion" />
<owl:Thing rdf:about="#CentralCoastRegion"> 
<rdf:type rdf:resource="#Region"/> 

表示个体,type是一个rdf属性,用于关联一个个体和它所属的类
</owl:Thing>或者使用 语句来表示个体

  • 定义属性
<owl:ObjectProperty rdf:ID="madeFromGrape"> 
     <rdfs:domain rdf:resource="#Wine"/> /*表示定义域*/
    <rdfs:range rdf:resource="#WineGrape"/> /*表示值域*/
</owl:ObjectProperty>

在OWL中,一个值域可被用来推断一个类型

<owl:Thing rdf:ID="LindemansBin65Chardonnay">
   <madeFromGrape rdf:resource="#ChardonnayGrape" />
 </owl:Thing>

可以推断出,LindemansBin65Chardonnay为一种葡萄酒,因为其定义域为wine
可以定义子属性,属性是传递的,例如X为Y的子属性,如果具有属性X,则必然同时具有属性Y。

**数据类型属性:**将个体关联到数据(值域为:RDF文字或XML Schema数据类型)

<owl:Class rdf:ID="VintageYear" />  /*有一个类叫VintageYear*/
<owl:DatatypeProperty rdf:ID="yearValue"> /*有一种数据属性叫做yearValue*/
<rdfs:domain rdf:resource="#VintageYear" />   /*这种数据属性的的定义域是VintageYear*/
    <rdfs:range  rdf:resource="&xsd;positiveInteger"/> /*值域是正整数*/
</owl:DatatypeProperty> 

yearValue属性将VintageYears与一个整数值相关联。

  • 本体映射
    用于实现本体的共享

概念、属性的等价关系(equivalentClass、equivalentProperty)
属性 owl:equivalentClass被用来表示两个类有着完全相同的实例、owl:sameAs表示两个类各个方面都完全一致
类似的我们也可以通过owl:equivalentProperty属性来声明属性是等同的。

  • 复杂类
    就是利用交并补的方式定义出来的类,可以把它看作是匿名类
    用于创建类的表达式。OWL支持基本的几何操作,即并交补运算。他们分别被命名为owl:unionOf, owl:intersectionOf和owl:complementOf, 类还可以是枚举的。

  • 集合运算符
    交运算owl:intersectionOf: 正如下面的例子,我们定义了一个复杂类WhiteWine,它是Wine和hasColor(White)的交集,
    【这个例子表示,白葡萄酒就是葡萄酒和白色物体的相交的集合。如果不这么表示,计算机只知道,白葡萄酒有白色的属性;却不知道,所有白色的葡萄酒是白葡萄酒】

<owl:Class rdf:ID="WhiteWine">
   <owl:intersectionOf rdf:parseType="Collection"> /*这是必须的,因为必须对集合操作*/
       <owl:Class rdf:about="#Wine" />
        <owl:Restriction>
             <owl:onProperty rdf:resource="#hasColor" />
             <owl:hasValue rdf:resource="#White" />
        </owl:Restriction>
   </owl:intersectionOf>
 </owl:Class>

另外一个例子【WhiteBurgundy类恰好是白葡萄酒和Burgundies的交集】

<owl:Class rdf:ID="WhiteBurgundy">
  <owl:intersectionOf rdf:parseType="Collection">
    <owl:Class rdf:about="#Burgundy" />
    <owl:Class rdf:about="#WhiteWine" />
  </owl:intersectionOf> 
</owl:Class>

并运算owl:unionOf: 跟交运算非常类似,下面是一个关于并运算的例子

<owl:Class rdf:ID="Fruit">
  <owl:unionOf rdf:parseType="Collection">
    <owl:Class rdf:about="#SweetFruit" />
    <owl:Class rdf:about="#NonSweetFruit" />
  </owl:unionOf>
</owl:Class>

fruit类包含两个延展类,一个是SweetFruit 一个是NonSweetFruit.
需要注意的是,这跟直接描述甜水果和不甜水果都是他的子类完全不同!

<owl:Class rdf:ID="Fruit">
  <rdfs:subClassOf rdf:resource="#SweetFruit" />
  <rdfs:subClassOf rdf:resource="#NonSweetFruit" />
</owl:Class>   

补运算owl:unionOf:就是表示差集,complementOf典型的用法是与其它集合运算符联合使用,如下

<owl:Class rdf:ID="NonFrenchWine">
  <owl:intersectionOf rdf:parseType="Collection">
    <owl:Class rdf:about="#Wine"/>
    <owl:Class>
      <owl:complementOf>
        <owl:Restriction>
          <owl:onProperty rdf:resource="#locatedIn" />
          <owl:hasValue rdf:resource="#FrenchRegion" />
        </owl:Restriction>
      </owl:complementOf>
    </owl:Class>
  </owl:intersectionOf>
</owl:Class>     

这定义了一个NonFrenchWine,他是Wine和所有not locatedIn FrenchRegion的交集。

枚举类 owl:oneOf:OWL提供了通过直接枚举其成员来指定一个类的方法。这是用oneOf结构完成的。值得注意的是,这个定义完全指定了类的扩展,因此没有其他个体可以被声明为属于这个类。

<owl:Class rdf:ID="WineColor">
  <rdfs:subClassOf rdf:resource="#WineDescriptor"/>
  <owl:oneOf rdf:parseType="Collection">
    <owl:Thing rdf:about="#White"/>
    <owl:Thing rdf:about="#Rose"/>
    <owl:Thing rdf:about="#Red"/>
  </owl:oneOf>
</owl:Class>

【这段代码说明,WineColor只包含三种,white rose和red,任何其他的颜色都不是winecolor类的实例】

oneOf结构的每一个元素都必须是一个有效声明的个体。一个个体必须属于某个类。在上面的例子中,每一个个体都是通过名字来引用的。我们使用owl:Thing简单地进行引用,尽管这有点多余(因为每个个体都属于owl:Thing)。另外,我们也可以根据具体类型WineColor来引用集合中的元素:

<owl:Class rdf:ID="WineColor">
  <rdfs:subClassOf rdf:resource="#WineDescriptor"/>
  <owl:oneOf rdf:parseType="Collection">
    <WineColor rdf:about="#White" />
    <WineColor rdf:about="#Rose" />
    <WineColor rdf:about="#Red" />
  </owl:oneOf>
</owl:Class>

另外,较复杂的个体描述同样也可以是oneOf结构的有效元素,例如:

<WineColor rdf:about="#White">
  <rdfs:label>White</rdfs:label>
</WineColor> 

不相交类owl:disjointWith:使用owl:disjointWith构造子可以表达一组类是不相交的。它保证了属于某一个类的个体不能同时又是另一个指定类的实例。

<owl:Class rdf:ID="Pasta">
  <rdfs:subClassOf rdf:resource="#EdibleThing"/>
  <owl:disjointWith rdf:resource="#Meat"/>
  <owl:disjointWith rdf:resource="#Fowl"/>
  <owl:disjointWith rdf:resource="#Seafood"/>
  <owl:disjointWith rdf:resource="#Dessert"/>
  <owl:disjointWith rdf:resource="#Fruit"/>
</owl:Class>

Pasta例子声明了多个不相交类。注意它只声明了Pasta与其它所有类是不相交的。例如,它并没有保证Meat和Fruit是不相交的。为了声明一组类是互不相交的,我们必须对每两个类都使用owl:disjointWith来声明。

在下面的例子中,我们定义了Fruit是SweetFruit和NonSweetFruit的并集。而且我们知道这些子类恰好将Fruit划分成了连个截然不同的子类,因为它们是互不相交的。随着互不相交的类的增加,不相交的声明的数目也会相应的增加到n的2次方。然而,在我们已知的用例中,n通常比较小。

<owl:Class rdf:ID="SweetFruit">
  <rdfs:subClassOf rdf:resource="#EdibleThing" />
</owl:Class>

<owl:Class rdf:ID="NonSweetFruit">
  <rdfs:subClassOf rdf:resource="#EdibleThing" />
  <owl:disjointWith rdf:resource="#SweetFruit" />
</owl:Class>

<owl:Class rdf:ID="Fruit">
  <owl:unionOf rdf:parseType="Collection">
    <owl:Class rdf:about="#SweetFruit" />
    <owl:Class rdf:about="#NonSweetFruit" />
  </owl:unionOf>
</owl:Class>
 类似资料: