RDF使用命名特定和值来表达表达与资源有关的简单声明。但很多情况下,用户希望能够自定义一些词汇,然后用这些词汇来描述资源。总的说来,就是需要定义一些类和特性,比如定义Person类来描述人,定义Book类来描述图书,定义author特性来描述图书的作者等。RDF本身并不能定义这些类和特性,它们需要用RDF的描述语言RDF Schema来定义。
RDFS描述类是通过其中的资源rdfs:Class和rdfs:Resource,特性rdf:type和rdfs:subClassOf来完成的。比如我们要定义一个机动车类MotorVechile,我们为该类指定一个URIref,如ex:MotorVechile,然后将其描述成为一个具有rdf:type特性,其值为rdfs:Class的资源,如下:
ex:MotorVechile rdf:type rdfs:Class
而如果想使用这个类,即将某个资源,如某个特定机动车exthings:companyCar,描述为这个类的实例,则依然可以用rdf:type来完成,如下:
extings:companyCar rdf:type ex:MotorVechile
此外,利用rdfs:subClassOf,我们还可以定义子类。比如,我们可以定义货车Truck类为机动车MotorVechile的子类如下:
ex:Truck rdf:type rdfs:Class
ex:Truck rdfs:subClassOf ex:MotorVechile
下面是一个比较完整的机动车类层次的RDF Schema声明:
ex:MotorVehicle
rdf:type rdfs:Class .
ex:PassengerVehicle
rdf:type rdfs:Class .
ex:Van
rdf:type rdfs:Class .
ex:Truck
rdf:type rdfs:Class .
ex:MiniVan
rdf:type rdfs:Class .
ex:PassengerVehicle
rdfs:subClassOf ex:MotorVehicle .
ex:Van
rdfs:subClassOf ex:MotorVehicle .
ex:Truck
rdfs:subClassOf ex:MotorVehicle .
ex:MiniVan
rdfs:subClassOf ex:Van .
ex:MiniVan
rdfs:subClassOf ex:PassengerVehicle .
这个机动车类的概念图如下图示,我们可以利用RDF/XML定义完成,如下例:
<?xml version="1.0"?>
<rdf:RDF
<rdf:Description rdf:ID="MotorVehicle">
</rdf:Description>
<rdf:Description rdf:ID="PassengerVehicle">
<rdfs:subClassOf rdf:resource="#MotorVehicle"/>
</rdf:Description>
<rdf:Description rdf:ID="Truck">
<rdfs:subClassOf rdf:resource="#MotorVehicle"/>
</rdf:Description>
<rdf:Description rdf:ID="Van">
<rdfs:subClassOf rdf:resource="#MotorVehicle"/>
</rdf:Description>
<rdf:Description rdf:ID="MiniVan">
<rdfs:subClassOf rdf:resource="#Van"/>
<rdfs:subClassOf rdf:resource="#PassengerVehicle"/>
</rdf:Description>
</rdf:RDF>
也可以利用简写形式的RDF/XML定义如下:
<?xml version="1.0"?>
<rdf:RDF
<rdfs:Class rdf:ID="MotorVehicle"/>
<rdfs:Class rdf:ID="PassengerVehicle">
<rdfs:subClassOf rdf:resource="#MotorVehicle"/>
</rdfs:Class>
<rdfs:Class rdf:ID="Truck">
<rdfs:subClassOf rdf:resource="#MotorVehicle"/>
</rdfs:Class>
<rdfs:Class rdf:ID="Van">
<rdfs:subClassOf rdf:resource="#MotorVehicle"/>
</rdfs:Class>
<rdfs:Class rdf:ID="MiniVan">
<rdfs:subClassOf rdf:resource="#Van"/>
<rdfs:subClassOf rdf:resource="#PassengerVehicle"/>
</rdfs:Class>
</rdf:RDF>
除了上面利用RDF Schema定义类以外,还需要描述这些类的特性。在RDF Schema中,特性是利用RDF类rdf:Property和RDF Schema特性rdfs:domain(定义域)、rdfs:range(值域)和rdfs:subPropertyOf来进行的。
这里,定义域指某个特性只能用于指定的类,而值域则限定了该特性的取值范围,而rdfs:subPropertyOf则表明该特性是指定的特性的子特性。下例是关于书的作者特性的描述:
ex:Person rdf:type rdfs:Class .
ex:author rdf:type rdf:Property .
ex:author rdfs:range ex:Person .
ex:author
rdfs:domain ex:Book .
下例是关于车辆的RDF/XML描述:
<?xml version="1.0"?>
<rdf:RDF
<rdfs:Class rdf:ID="MotorVehicle"/>
<rdfs:Class rdf:ID="PassengerVehicle">
<rdfs:subClassOf rdf:resource="#MotorVehicle"/>
</rdfs:Class>
<rdfs:Class rdf:ID="Truck">
<rdfs:subClassOf rdf:resource="#MotorVehicle"/>
</rdfs:Class>
<rdfs:Class rdf:ID="Van">
<rdfs:subClassOf rdf:resource="#MotorVehicle"/>
</rdfs:Class>
<rdfs:Class rdf:ID="MiniVan">
<rdfs:subClassOf rdf:resource="#Van"/>
<rdfs:subClassOf rdf:resource="#PassengerVehicle"/>
</rdfs:Class>
<rdfs:Class rdf:ID="Person"/>
<rdfs:Datatype rdf:about="&xsd;integer"/>
<rdf:Property rdf:ID="registeredTo">
<rdfs:domain rdf:resource="#MotorVehicle"/>
<rdfs:range rdf:resource="#Person"/>
</rdf:Property>
<rdf:Property rdf:ID="rearSeatLegRoom">
<rdfs:domain rdf:resource="#PassengerVehicle"/>
<rdfs:range rdf:resource="&xsd;integer"/>
</rdf:Property>
<rdf:Property rdf:ID="driver">
<rdfs:domain rdf:resource="#MotorVehicle"/>
</rdf:Property>
<rdf:Property rdf:ID="primaryDriver">
<rdfs:subPropertyOf rdf:resource="#driver"/>
</rdf:Property>
</rdf:RDF>
从某种意义上讲,RDF Schema的类型系统与面相对象语言(如Java)是相似的,但它们之间还是有一些重要的区别。
第一个重要的区别是面向对象的类的属性是属于类本身的,而RDFS的属性是全局的。即如果我们定义了两个类:书和杂志,它们都有作者属性。在面向对象程序语言中,书和杂志的作者属性是分别属于类本身的,即作者属性是两个不同的,不能通用的属性。而在RDFS中,类和属性分别定义,具有全局作用,所以无论是书的作者属性还是杂志的作者属性,我们都可以使用相同的同一个属性来描述。
另一个重要区别是,在面向对象语言中,属性的声明是规约性(
prescriptive
)的,即通常可以看成是一种约束。比如对于
Book
类的
author
属性,若规定其值域是
Person
,则面向对象语言不允许一个实例没有属性
author
,也不允许
author
的取值不是
Person
。而在
RDF Schema
中,这些信息是对资源的额外描述进行的,即并不成为一个硬性的限制在其具体的实例上。这样,一个具体的应用即可以利用这些额外的信息进行检查,来施加相应限制,也可以不检查这些,从而并不形成相应的限制。这可以根据应用的需求来灵活操作。