OWL学习笔记(一)
本体是用来描述某个领域的知识的。描述了该领域内各个概念和概念间的关系。(使用本体是为了用它进行关于个体的推理)
OWL(Ontology Web Language) 是一种本体语言,是W3C(World Wide Web Constraint)
<!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: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>