3.3.2 RDFS
RDF使用命名特性和值来表达与资源有关的简单声明。但是,在某些情况下,用户希望能够根据需要自定义一些词汇,然后用这些词汇来描述资源。这些词汇表明用户正在描述某种资源,并且会采用某些特定的特性来描述。类似的情况,那些对图书资源比较感兴趣的RDF开发人员可能会描述ex2:Book或者ex2:MagazineArtical这样的类,并使用ex2:author、ex2:title、ex2:subject之类的特性来描述这些类。其他的一些应用可能会描述诸如ex3:Person、ex3: Company这样的类和ex3:age、ex3:jobTitle、ex3:stockSymbol、ex3: numberofEmployee之类的一些特性。RDF本身并不能针对特定应用需求来定义一些类和特性。这些类和特性被称为RDF词汇,它们需要通过RDF词汇描述语言——RDF Schema(简称RDFS)来定义。
RDFS并没有针对特定应用提供诸如exterms:Tent、ex2:Book或者ex3:Person这样的一些类或者是诸如exterms:weightInKg ex2: author或者ex3:JobTitle这样的一些特性词汇。RDFS只是提供了描述一种这些类和特性的能力(facilities),并且可以暗示某些类和特性,期望合在一起使用(例如,特性ex3:jobTitle应该用来描述ex3: Person)。换句话说,RDF Schema为RDF提供了一个类型系统。RDF Schema类型系统在某些方面类似于Java这样的面向对象编程语言的类型系统。例如,RDF Schema允许资源被定义为一个或者多个类的实例。另外,RDFS通常把类组织成为一种分级结构;例如,类ex:Dog可以定义为ex:Mammal的子类,而ex:Mammal又是ex: Animal的子类。如果某个资源是类ex:Dog的实例,那么隐含着它也是ex:Animal的实例。然而,RDF类和特性在某些方面又与编程语言的类型系统有着明显的差异。RDF类和特性并没有过多束缚资源的描述方式,而是提供了一些关于RDF资源的额外描述信息。
RDF Schema所具有的这些能力本身也是以RDF词汇形式提供的。也就是说,这些RDF词汇是一组带有特殊含义的、预定义的RDF资源。这些资源的(RDF Schema词汇)URI带有前缀http://www.w3.org/2000/01/rdf-schema#(QName通常采用前缀rdfs:)。采用RDF Schema语言所定义的词汇描述(schemas)也是合法的RDF图。因此,即使一个软件不是专为处理新加的RDF Schema词汇而开发的,它仍然可以将schema解释为一个包含了各种资源和特性的合法RDF图,但是这个软件并不能“理解”新添加的RDF Schema术语的内在含义。为了理解新加术语的含义,RDF软件必须能够处理一种扩展语言。这种扩展语言不仅仅包含rdf:前缀的词汇,而且还包含了rdfs:前缀的词汇,以及这些词汇的内在含义。
1.描述类
描述过程通常从划分被描述事物的种类开始。RDF Schema把事物的种类称之为类(class)。RDF Schema中的类(class)与我们通常所说的类型(type)或者分类(category)基本相同,有点类似于面向对象编程语言(比如Java)中的类(class)的概念。RDF类可以用来表示事物的任何分类,例如网页、人、文档类型、数据库或者抽象概念等。类可以通过RDF Schema中的资源(rdfs:Class和rdfs:Resource)以及特性(rdf:type和rdfs:subClassOf)来表示。
例如,假设example.org这个组织想用RDF来提供有关不同种类机动车(Motor vehicles)的信息,那么它在RDF Schema中首先需要一个代表机动车这一分类(category)的类(class)。属于某个类(class)的资源被称为该类的实例(instances)。在本例中,所有属机动车的资源都是这个类的实例。
在RDF Schema中,一个类是任何具有rdf:type特性,并且该特性的值为rdfs:Class的资源。因此,可以这样来描述一个机动车类:为该类指定一个URIref,比如ex:MotorVehicle(其中的前缀ex:代表URIref http://www.example.org/schemas/vehicles,ex:被用作example.org词汇表中的所有URIrefs的前缀),然后将这个机动车类描述为一个具有rdf:type特性,并且特性值为rdfs:Class的资源。特性rdf:type用来表明一个资源是某个类的实例。因此,将ex: MotorVehicle描述为类之后,可以用下面的RDF声明来描述资源exthing:companyCar是一辆机动车。example.org在描述了ex: MotorVehicle类之后,也许还要再定义一些类来代表各种特定种类的机动车,例如客车(passenger vehicles)、大篷货车(vans)、小型货车(minivans)等。这些类可以采用和类ex:MotorVehicle同样的方法来定义。
但是上面这些声明本身只是对单个的类的定义。example.org可能还要描述上面定义的类与类ex:MotorVehicle之间的特定关系,比如它们是机动车(MotorVehicle)中的一种。这种两个类之间的特化关系(specialization relationship)可以用预定义的特性rdfs: subClassOf来描述。例如,描述ex:Van是一种特殊的ex: MotorVehicle。rdfs:subClassOf的含义是:任何ex:Van类的实例同时也是ex:MotorVehicle类的实例。因此,如果资源exthings: companyVan是ex:Van的一个实例,那么理解RDF Schema词汇表的RDF软件可以根据上面声明的rdfs:subClassOf关系推理出额外的有用信息,即exthings:companyVan也是ex:MotorVehicle的一个实例。exthings:companyVan的例子说明了一点,即RDF Schema可以定义一种扩展语言。但是,RDF本身并没有定义RDF Schema中的词汇(比如rdfs:subClassOf)所具有的含义。因此,即使某个RDF schema定义了ex:Van和ex:MotorVehicle之间的rdfs:subClassOf关系(通过编写一个RDF声明),但是对于不理解RDF Schema术语的RDF软件来说,这个RDF声明只是一个以rdfs:subClassOf为谓词的三元组,该RDF软件并不能理解rdfs:subClassOf所代表的含义,因此也不能据此得到额外的结论:exthing:companyVan也是ex:MotorVehicle的实例。从这些声明可以推理出ex:MiniVan同时也是ex: MotorVehicle的子类。相应地,如果RDF Schema定义了某个资源是ex:MiniVan的实例,那么它也是ex:MotorVehicle的实例(同时也是类ex:Van的实例)。一个类可以是一个或多个类的子类。(例如: ex:MiniVan可以同时为ex:Van和ex:PassengerVehicle的子类)。RDF Schema规定:所有的类总是rdfs:Resource的子类(因为任何类的实例都是资源)。
图3-6是上面这些例子的一个完整的类层次图。它所对应的RDF/XML编码如例3-7所示。
图3-6 车辆类层次图
【例3-7】用RDF/XML书写的车辆类层次图。(www.xing528.com)
2.描述属性
用户除了描述他们想要描述的类(classes),通常还需要能够定义刻画这些类的特性(properties)(例如用rearSeatLegRoom来描述一辆客车)。在RDF schema中,特性是用RDF类rdf:Property以及RDF Schema特性rdfs:domain(定义域)、rdfs:range(值域)以及rdfs; subPropertyOf来描述的。
RDF中的所有特性都被描述为类rdf:Property的实例。因此一个新特性(例如exterms:weigntInKg)的描述是通过为它指派一个URIref,并使用一个值为rdf:Property的rdf:type特性来完成的。RDF Schema还提供了一些词汇用于描述如何在RDF数据中正确使用特性和类。其中最重要的一个信息是由RDF Schema特性rdfs: range和rdfs:domain提供的,它们用于进一步描述与应用相关的特性。
rdfs:range用于表明某个特性的值(定义域)是给定类的实例。一个特性(比如ex:hasMother)可以有零个、一个、或多个range特性。如果ex:hasMother没有range特性,那么对ex:hasMother特性的值而言,就没有什么限制。如果ex:hasMother有一个range特性限制,例如指定ex:Person作为其值域,这表明ex:hasMother特性的值是类ex:Person的实例。如果ex:hasMother有多个range特性,例如在指定ex:person为它的range特性的同时,还指定了ex:Femal作为它的range特性,这说明了ex:hasMother特性的值是所有被指定的类的实例。例如,ex:hasMother的值既是一个ex:Femal又是一个ex: Person。rdfs:range特性也可用于表明特性的值是一个类型文字。
rdfds:domain用于表明某个特性应用于指定的类(定义域)。例如,如果example.org要表明特性ex:author应用于类ex:Book的实例上。一个给定的特性(例如exterms:weight)可能有零个、一个或多个domain特性。如果exterm:weight没有domain特性,那么便没有规定exterms:weight特性对应的主体是某类资源,也就是说任何资源都可以作为exterms:weight特性的主体。如果exterms:weight有一个domain特性,例如指定ex:Book作为其定义域,这表明exterms:weight特性应用于类ex:Book的实例。如果exterms:weight有多个domain特性,例如一个domain特性指定其定义域为ex:Book,另一个domain特性指定其定义域为ex:MotorVehicle,这表明具有exterms: weight特性的资源是所有被指定为定义域的类的实例,即具有exterms:weight特性的资源既是ex:Book类的实例又是ex: MotorVehicle类的实例(对待具体问题,需要认真分析,仔细地指定定义域和值域)。
我们可以扩展车辆类的schema来举例说明值域(range)和定义域(domain)描述的使用方法:增加两个特性ex:registeredTo和ex: rearSeatLegRoom,然后添加一个新的类ex:Person,并显式地将xsd: integer声明为数据类型。ex:registerdTo特性应用于任何ex: MotorVehicle,并且它的值是ex:Person。对本例而言,ex: rearSeatLegRoom仅仅应用到ex:PassengerVehicle类的实例上,其值是一个xsd:integer(该值给定了后座的脚部活动空间的厘米数)。
RDF Schema提供了一种方法来像描述类的特化关系一样来描述特性之间的特化关系。这种两个特性之间的特化关系可以使用预定义的rdfs:subPropertyOf特性来描述。例如,如果ex:primaryDriver和ex:driver都是特性,则example.org可以通过下列RDF声明来描述“ex:primaryDriver是ex:driver的特化”。rdfs:subPropertyOf关系的含义在于,如果一个实例exstaff:fred是实例ex:companyVan的一个ex:primaryDriver,那么RDF Schema定义exstaff:fred也是ex: companVan的一个ex:driver。一个特性可以是零个、一个或多个特性的子特性(subproperty)。当RDF Schema中的rdfs:range和rdfs: domain特性应用于某个RDF特性时,它们也会应用于该RDF特性的子特性。因此,在上面的例子中,RDF Schema定义了ex: primaryDriver也具有rdfs:domain约束(值为ex:MotorVehicle),因为ex:primaryDriver是ex:driver的子特性。
例3-8显示了这些描述的RDF/XML。
【例3-8】用RDF/XML书写的车辆类和属性。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。