关于RDF的一些概念

来源:互联网 发布:china linux 编辑:程序博客网 时间:2024/05/26 20:24

资源描述框架RDF(Resource Description Frame)是全球资讯网协会W3C提出的。其主要目的在于描述关于资源的元数据,即关于数据的数据,从而能够是数据本身的信息得以存储,并能够被机器理解和处理。例如在传统的信息程序中,一个人名Jack可能只是一个字符串,人能够理解这个字符串是一个人的名字,但机器是没有办法理解的。又例如在传统的数据库系统中,一个SQL语句“Select Name from employee where salary > 30000”,机器不能真正地理解employee和salary。而通过对数据的数据,即元数据的描述,有可能让机器理解这样的信息并进行相关的处理。

RDF用主体、谓词、客体的三元组来描述一个数据的元数据。比如John Smith创建了某个网页,用自然语言来描述是“http://www.example.org/index.html has a creator whose value is John Smith。这里,网页是一个主体,即一个数据,而John Smith是一个客体,creator则是一个谓词。客体和谓词都是主体的属性。通过对主体的属性填入相应的值,则描述了关于主体的数据,即元数据。一个这样的三元组描述关于主体的一个特性,多个这样的三元组则可以描述多个属性。一个三元组可以用一个图:一个表示主体的节点,一个表示客体的节点和一个由主体指向客体的表示谓词的弧来表示。如下图就表示了关于网页的几个特性,它的建立者,它的语言和建立的时间。

fig3nov19.png

为了完成上述的描述资源的任务,需要有两个元素:能够区分主体、客体和谓词的标示系统,该系统不能和其它人可能在Web上使用的标示混淆;能够可以表示这些陈述,并让这些陈述可以在机器间交流的语言。RDF采用统一资源标示符URI(注意,不是统一资源定位符URL)的引用URIref来完成第一个任务,而采用可以扩展其意义的可扩展标记语言XML来完成第二个任务。
一个URIref是写在尖括号中的完整的长的字符串。为了简便,可以采用命名空间的写法使其简化,采用不用尖括号的XML限定名来表示这样的命名空间。这样的URIref的缩写形式包括一个命名空间URI的前缀,一个冒号和一个局部名称,如:
前缀rdf:,命名空间URI:http://www.w3.org/1999/02/22-rdf-syntax-ns#

则rdf:string则表示了完整的URIref:< http://www.w3.org/1999/02/22-rdf-syntax- ns/string>

很多情况下,一个命名空间中定义了一组用于某种特定目的的URIref集合,称为一个词汇表。这样,我们可以通过这样的URIref来使用和共享这些成果。
在RDF中,主体、客体和谓词都采用这样的URIref来描述。如假设已经定义了命名空间ex,dc和exstaff:
ex:index.html dc:creator exstaff:85740
则可能表示了前述的由John Smith建立的网页的陈述。不过我们要注意,RDF只有定义主体、谓词和客体的语法,即通过RDF规定的语法,只能区分谁是主体,谁是谓词,谁是客体。至于这些由URIref指向的特定的词汇表的词汇的含义,则是在RDF外定义的,这些意义不能由通用的RDF程序解释,只能传递给理解这些含义的人或者应用程序,由他们进行相应的处理。
简单的信息只用简单的RDF语句即可。但现实世界的信息往往需要复杂得多的结构化信息。比如日期信息需要描述年、月、日,人的信息包括更复杂的很多条目等。在RDF中,把这类事物的聚集体(如人)看作是一个资源,然后发表这个新资源的陈述。如下图,通过引用John Smith的住址资源,从而得到了关于他的住址的完整结构化信息。

fig5may19.png

RDF并没有定义任何特定的数据类型(除rdf:XMLLiteral外)。因此,直接写出来的属性值被称为平凡文字。但实际处理中如其它程序语言一样,可能需要特定的数据类型,RDF中,是通过把一个字符串和一个特定数据类型的URIref配对来进行的。这些类型文字定义在http://www.w3.org/TR/rdf-concepts/#dfn-typed-literal中。这样,John Smith的年龄就可以写成:exstaff:85740 exterms:age “27”^^xsd:integer,而网页的创建日期也可以写成:ex:index.html exterms:creation-date “1999-08-16”^^xsd:date。
RDF的这种在外部定义数据类型的方法是基于XML数据类型概念框架上的。这种概念框架包含了一下部分的数据类型:

l         一个要用数据类型文字表示的值的集合,被称作值空间(value space)。例如,XML模型数据类型xsd:date的值空间就是日期的集合。

l         一个数据类型用来表示它的值的字符串的集合,被称作是词法空间(lexical space)。词法空间决定了哪一种字符串能够合乎规则地被用来表示这种数据类型的文字。例如:数据类型xsd:date定义了“1999-08-16” 是书写这种类型文字的一种合乎规则的方法(相反的如果写成“August 16,1999”则可认为是不合乎规则的)。

l         一个从词空间到值空间的“词-值(lexical-to-value)映射”.这决定了这样的一个字符串的值:一个为表示这种特殊数据 类型的取自词法空间里的一个特定的字符串。例如:一个映射到数据类型xsd:date的词-值映射,决定了对于这种数据类型,字符串“1999-08- 16”表示日期“August 16, 1999”。词-值映射是个重要因素因为相同的字符串可能为不同数据类型表示不同的值。

RDF采用基于XML的RDF/XML语法来描述RDF的概念图。具体的语法形式在相关的文献中可以查到。对于前面网页的建立者、建立日期和使用语言的RDF/XML例子如下:
1. <?xml version="1.0"?>

2. <!DOCTYPE rdf:RDF [<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#">]>

3. <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
4.         xmlns:dc="http://purl.org/dc/elements/1.1/"
5.         xmlns:exterms="http://www.example.org/terms/">
6.    <rdf:Description rdf:about="http://www.example.org/index.html">

7.       <exterms:creation-date rdf:datatype="&xsd;date">1999-08-16</exterms:creation-date>

8.       <dc:language>en</dc:language>

9.       <dc:creator rdf:resource="http://www.example.org/staffid/85740"/>
10.  </rdf:Description>
11. </rdf:RDF>
在RDF/XML文档中,没有行号,这里添加行号是为了说明的方便。其中,第1行声明了采用的是XML1.0的语法。第2行中的DOCTYPE声明定义了xsd实体,该实体用在第7行上。第3行以rdf:RDF元素开始,表明以下直到/rdf:RDF(10行)结束用于表达RDF。而第3到5行的其余内容用来声明了命名空间。6到9行是陈述的主要部分,用rdf:about陈述来指定主体资源的URIref,用creation-date标签来指定网页建立的日期,同时,通过rdf:datatype元素属性来指定了该数据类型,通过dc:language标签描述了网页语言,通过dc:creator标签的rdf:resource属性描述了网页建立者资源。

在下面的RDF/XML例子中,描述了一个关于帐篷的产品:

1.   <?xml version="1.0"?>

2.   <!DOCTYPE rdf:RDF [<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#">]>

3.   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"

4.           xmlns:exterms="http://www.example.com/terms/"

xml:base="http://www.example.com/2002/04/products">

6.     <rdf:Description rdf:ID="item10245">

7.          <rdf:type rdf:resource="http://www.example.com/terms/Tent"/>

8.          <exterms:model rdf:datatype="&xsd;string">Overnighter</exterms:model>

9.          <exterms:sleeps rdf:datatype="&xsd;integer">2</exterms:sleeps>

10.         <exterms:weight rdf:datatype="&xsd;decimal">2.4</exterms:weight>

11.         <exterms:packedSize rdf:datatype="&xsd;integer">784</exterms:packedSize>

12.    </rdf:Description>

13.  </rdf:RDF>

在这个例子中,注意第7行的属性rdf:type,这与本体中类的应用有关。假设我们已经在URIref http://www.example.com/terms/Tent中定义了某个帐篷类class用该属性来描述一个RDF资源时,则表示描述的资源是该URIref所标示的类的实例,这相当于在面向对象的程序中,对类的实例的声明。不过在RDF中,并没有提供方法在应用中定义特定的类,这些定义需要在RDF schema中用RDF schema语言来定义。

为了描述一组事务,如一本书的多个作者,一个班的多个学生,RDF提供了容器来进行描述。RDF的容器词汇包括三个预定义类型,以及他们的一些属性。这三个类型是:

rdf:Bag,包,表示一组可能包含重复成员,且成员间无序的资源或者文字;

rdf:Seq,序列,表示可能有重复成员,但成员间有序的一组资源或者文字;

rdf:Alt,替换,表示一组可以选择的资源或者文字。

除了容器,RDF还可以用集合来描述一组成员。一个RDF集合是用列表表示的一组事务,与容器的区别是容器不能封闭其成员,如描述所有的容器成员等。而集合则可以访问所有的集合成员。由于是列表,所以RDF集合词汇包括属性rdf:firstrdf:rest和资源rdf:nil