RDF入门 推荐标准
TransWiki - W3CHINA.ORG开放翻译计划(OTP)
| 译文(Translation Document) | RDF入门 推荐标准http://zh.transwiki.org/cn/rdfprimer.htm (http://zh.transwiki.org/cn/rdfprimer.htm) |
| 原文(Original Document) | RDF Primer Recommendation(http://www.w3.org/TR/rdf-primer/ (http://www.w3.org/TR/rdf-primer/)) |
| 说明(Notes) |
http://www.w3.org/Consortium/Legal/copyright-documents.html Reserved. W3C liability, trademark, document use and software licensing rules apply.
|
| 译者及校对(Translators&Reviewers) |
关于本文档翻译工作的说明、任务分配及进展情况,请参见http://bbs.xml.org.cn/dispbbs.asp?boardid=2&id=8689&star=1#8689 (http://bbs.xml.org.cn/dispbbs.asp?boardid=2&id=8689&star=1#8689)。 |
|
致谢 |
|
RDF入门
W3C 推荐标准 2004年02月10日
当前版本:
http://www.w3.org/TR/2004/REC-rdf-primer-20040210/ (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/)
最新版本:
http://www.w3.org/TR/rdf-primer/ (http://www.w3.org/TR/rdf-primer/)
上一版本:
http://www.w3.org/TR/2003/PR-rdf-primer-20031215/ (http://www.w3.org/TR/2003/PR-rdf-primer-20031215/)
编者:
Frank Manola, fmanola@acm.org (mailto:fmanola@acm.org)
Eric Miller, W3C, em@w3.org (mailto:em@w3.org)
系列文档编者:
Brian McBride, Hewlett-Packard Laboratories, bwm@hplb.hpl.hp.com (mailto:bwm@hplb.hpl.hp.com)
阅读时请参照本文档的勘误表 (http://www.w3.org/2001/sw/RDFCore/errata#rdf-primer),其中可能会包含一些规范性的修正。
也要留意译文 (http://www.w3.org/2001/sw/RDFCore/translation/rdf-primer)。
Copyright (http://www.w3.org/Consortium/Legal/ipr-notice#Copyright)? 2004 W3C? (MIT, ERCIM, Keio (http://www.keio.ac.jp/)), All Rights Reserved. W3C liability (http://www.w3.org/Consortium/Legal/ipr-notice#Legal_Disclaimer), trademark (http://www.w3.org/Consortium/Legal/ipr-notice#W3C_Trademarks), document use (http://www.w3.org/Consortium/Legal/copyright-documents) and software licensing (http://www.w3.org/Consortium/Legal/copyright-software) rules apply.
摘要
资源描述框架 (RDF) 是用来表现万维网上各类资源的信息的一种语言,为了帮助读者了解一些必备的基础知识后能有效地使用 RDF,特编写此基础入门教程。本书介绍了RDF的一些基本概念以及RDF基于XML(可扩展标记语言)的语法。本书还讨论了如何用RDF词汇描述语言来定义RDF词汇集,并总结了目前所部署的一些基于RDF的应用。最后,本文介绍了其他RDF规范文档的内容和用途。
本文档的状态
本文档已被W3C成员及其他相关方面审阅,并已被W3C总监(W3C Director)[译注//Director是W3C组织的最高行政职位,目前由Tim Berners-Lee担任。]批准为W3C推荐标准(W3C Recommendation) (http://www.w3.org/2003/06/Process-20030618/tr.html#RecsW3C)。W3C 制定推荐标准的任务是使之受到关注,并促使其被广泛应用。这将增强Web的功能性(functionality)与互操作性(interoperablity)。
本文档是一套文档系列 (http://www.w3.org/TR/2004/REC-rdf-concepts-20040210/#section-Introduction)中的一份,该文档系列 (http://www.w3.org/TR/2004/REC-rdf-concepts-20040210/#section-Introduction)共六份,他们分别是:入门 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/)、概念 (http://www.w3.org/TR/2004/REC-rdf-concepts-20040210/)、语法 (http://www.w3.org/TR/2004/REC-rdf-syntax-grammar-20040210/)、语义 (http://www.w3.org/TR/2004/REC-rdf-mt-20040210/)、词汇表 (http://www.w3.org/TR/2004/REC-rdf-schema-20040210/)和测试用例 (http://www.w3.org/TR/2004/REC-rdf-testcases-20040210/))之中的一份。该文档系列将替换原有的资源描述框架规范(Resource Description Framework specifications)、RDF的模型与语法 推荐标准 (http://www.w3.org/TR/1999/REC-rdf-syntax-19990222/)和RDF Schema 推荐标准 (http://www.w3.org/TR/2000/CR-rdf-schema-20000327/)。 本文档由RDF核心工作组(RDF Core Working Group) (http://www.w3.org/2001/sw/RDFCore/)制定,它是W3C语义网行动组(W3C Semantic Web Activity) (http://www.w3.org/2001/sw/)的一部分(行动组声明 (http://www.w3.org/2001/sw/Activity),工作组章程 (http://www.w3.org/2002/11/swv2/charters/RDFCoreWGCharter))的一部份,被定于在2004年2月10日发布。
自建议推荐标准以来的修改已被详细记录在更改日志中。
欢迎大家将意见发送至www-rdf-comments@w3.org (mailto:www-rdf-comments@w3.org)(存档文件 (http://lists.w3.org/Archives/Public/www-rdf-comments/))并积极参与www-rdf-interest@w3.org (mailto:www-rdf-interest@w3.org)(存档文件 (http://lists.w3.org/Archives/Public/www-rdf-interest/))上的相关技术讨论。
一个RDF的实现列表可通过http://www.w3.org/2001/sw/RDFCore/impls (http://www.w3.org/2001/sw/RDFCore/impls)获得。
W3C维护着一个有关这项工作的已公开专利列表 (http://www.w3.org/2001/sw/RDFCore/ipr-statements)。
本节描述了本文档在发布时的状态。本文档有可能被其他本文档所替代。W3C推荐标准及其他技术文档(technical document)的最新列表可从以下网址获得:http://www.w3.org/TR (http://www.w3.org/TR)。
目录
1. 介绍(Introduction) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#intro)
2. 关于资源的陈述(Making Statements About Resources) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#statements)
2.1 基本概念(Basic Concepts) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#basicconcepts)
2.2 RDF模型(The RDF Model) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#rdfmodel)
2.3 结构化属性值与空白节点(Structured Property Values and Blank Nodes) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#structuredproperties)
2.4 类型文字(Typed Literals) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#typedliterals)
2.5 总结(Concepts Summary) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#conceptsummary)
3. RDF/XML - 一种用于RDF的XML语法(An XML Syntax for RDF: RDF/XML) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#rdfxml)
3.1 基本原理(Basic Principles) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#basicprinciples)
3.2 简化和组织RDF URIrefs(Abbreviating and Organizing RDF URIrefs) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#newresources)
3.3 总结(RDF/XML Summary) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#rdfxmlsummary)
4. 其它RDF表达能力(Other RDF Capabilities) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#othercapabilities)
4.1 RDF容器(RDF Containers) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#containers)
4.2 RDF集合(RDF Collections) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#collections)
4.3 RDF具体化(RDF Reification) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#reification)
4.4 关于结构化值(rdf:value)的更多信息(More on Structured Values: rdf:value) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#rdfvalue)
4.5 XML文字(Literal)(XML Literals) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#xmlliterals)
5. RDF Schema - 定义RDF的词汇表(Defining RDF Vocabularies: RDF Schema) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#rdfschema)
5.1 描述类(Class)(Describing Classes) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#schemaclasses)
5.2 描述属性(Property)(Describing Properties) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#properties)
5.3 理解RDF Schema声明(Interpreting RDF Schema Declarations) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#interpretingschema)
5.4 其它关于Schema的信息(Other Schema Information) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#otherschema)
5.5 更丰富的Schema语言(Richer Schema Languages) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#richerschemas)
6. 一些RDF的应用:具体领域中的RDF(Some RDF Applications: RDF in the Field) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#applications)
6.1 都柏林核心元数据倡议(Dublin Core Metadata Initiative) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#dublincore)
6.2 PRISM (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#prism)
6.3 XPackage (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#xpackage)
6.4 RSS 1.0:RDF站点汇总(RSS 1.0: RDF Site Summary) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#rss)
6.5 CIM/XML (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#cimxml)
6.6 基因本体协会(Gene Ontology Consortium) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#geneont)
6.7 描述设备性能与用户偏好(Describing Device Capabilities and User Preferences) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#devcap)
7. RDF规范的其它部分(Other Parts of the RDF Specification) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#otherparts)
7.1 RDF语义(RDF Semantics) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#semantics)
7.2 测试用例(Test Cases) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#testcases)
8. 参考文献(References) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#references)
8.1 规范性参考文献(Normative References) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#normative-references)
8.2 参考性资料(Informational References) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#informational-references)
9. 致谢(Acknowledgments) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#acknowledgements)
附录
A. 关于URI的更多信息(More on Uniform Resource Identifiers (URIs)) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#identifiers)
B. 关于XML的更多信息(More on the Extensible Markup Language (XML)) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#documents)
C. 改动记录(Changes) (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#changes)
1. 介绍(Introduction)
资源描述框架(Resource Description Framework, 简称 RDF)是一个用于表达关于万维网(World Wide Web)上的资源的信息的语言. 它专门用于表达关于Web资源的元数据, 比如Web页面的标题、作者和修改时间,Web文档的版权和许可信息,某个被共享资源的可用计划表等。然而,将“Web资源(Web resource)”这一概念一般化后,RDF可被用于表达关于任何可在Web上被标识的事物的信息,即使有时它们不能被直接从Web上获取。比如关于一个在线购物机构的某项产品的信息(例如关于规格、价格和可用性信息),或者是关于一个Web用户在信息递送方面的偏好的描述。
RDF用于信息需要被应用程序处理而不是仅仅显示给人观看的场合。RDF提供了一种用于表达这一信息、并使其能在应用程序间交换而不丧失语义的通用框架。既然是通用框架,应用程序设计者可以利用现成的通用RDF解析器(RDF parser)以及通用的处理工具。能够在不同的应用程序间交换信息意味着对于那些并非信息的最初创建者的应用程序也是可利用这些信息。
RDF基于这样的思想:用Web标识符(称作统一资源标识符,Uniform Resource Identifiers或URIs)来标识事物,用简单的属性(property)及属性值来描述资源。这使得RDF可以将一个或多个关于资源的简单陈述表示为一个由结点和弧组成的图(graph),其中的结点和弧代表资源、属性或属性值。为了让讨论显得尽量具体一些,下面的这组陈述“有一个人由http://www.w3.org/People/EM/contact#me 标识, 他的名字是Eric Miller, 他的电子邮件地址是em@w3.org,他的头衔是Dr.”可以表示为图1 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#figure1)所示的图:
图1:一个描述Eric Miller的RDF图
图1 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#figure1)展示了RDF用URIs来标识:
- 个体(individual),例如Eric Miller,他被标识为http://www.w3.org/People/EM/contact#me
- 事物的种类,例如Person,它被标识为http://www.w3.org/2000/10/swap/pim/contact#Person
- 上述事物的属性(property),例如mailbox,它被标识为http://www.w3.org/2000/10/swap/pim/contact#mailbox
- 上述属性的值,例如 mailto:em@w3.org是mailbox 属性的值。(RDF也使用字符串(比如"Eric Miller")以及其它数据类型中的值(如整数,日期等)作为属性的值)
RDF提供了一种基于XML的语法(称为RDF/XML)用于保存和交换RDF图。图1 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#figure1)所示的RDF用RDF/XML来书写的话就像下面的例1 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#example1)这样:
例1:一段描述Eric Miller的RDF/XML
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:contact="http://www.w3.org/2000/10/swap/pim/contact#">
<contact:Person rdf:about="http://www.w3.org/People/EM/contact#me">
<contact:fullName>Eric Miller</contact:fullName>
<contact:mailbox rdf:resource="mailto:em@w3.org"/>
<contact:personalTitle>Dr.</contact:personalTitle>
</contact:Person>
</rdf:RDF>
注意:上述RDF/XML也包含URIs,同样地还包含简略形式的属性(比如mailbox和fullName)及各个属性的值(em@w3.org和Eric Miller)。
和HTML一样,RDF/XML也是机器可处理的,也使用URIs,RDF也可以链接Web上任何地方的信息。然而与传统超文本不同的是,RDF URIs可以引用任何可标识的事物,包括那些不是直接可从Web上获取的事物(比如Eric Miller这个人)。结果是,RDF除了能够描述像网页这类事物以外,还可以描述汽车,商业活动,人类,新闻事件等等。此外,RDF中的属性本身有URIs,用以准确标识被链接的事物之间的关系。
下列文档都属于RDF规范的一部分:
- RDF概念和抽象语法 (http://www.w3.org/TR/rdf-concepts/) [RDF-CONCEPTS (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-rdf-concepts)]
- RDF/XML语法规范 (http://www.w3.org/TR/rdf-syntax-grammar/) [RDF-SYNTAX (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-rdf-syntax)]
- RDF词汇描述语言1.0: RDF Schema (http://www.w3.org/TR/rdf-schema/) [RDF-VOCABULARY (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-rdf-vocabulary)]
- RDF语义 (http://www.w3.org/TR/rdf-mt/) [RDF-SEMANTICS (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-rdf-semantics)]
- RDF测试用例 (http://www.w3.org/TR/rdf-testcases/) [RDF-TESTS (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-rdf-tests)]
- RDF入门 (http://www.w3.org/TR/rdf-primer/)(本文档)
本文档旨在提供一个关于RDF的介绍,并描述一些已有的RDF应用,以帮助信息系统设计者及应用程序开发者理解RDF的特性和如何使用这些特性。特别地,本文档旨对下列这类问题做出回答:
- RDF看起来是怎样的?
- RDF可以表达什么信息?
- RDF信息是如何被创建、访问和处理的?
- 现有信息如何能够与RDF结合?
本文档是一个非规范性(non-normative)文档,也就是说它并不是关于RDF的权威性的规范。本文档中的例子和其他解释性的资料用于帮助读者理解RDF,但是它们有可能并不是权威性的和充分完善的。在这些情况下,请参考RDF规范中相关的规范性文档。为此,本文档描述了RDF规范中的其他文档所担任的角色,并在适当的地方提供了指向规范性文档中相关部分的链接。
需要注意的是,上述RDF文档更新并更清晰地解释了先前发布的一些RDF规范,资源描述框架(RDF)的模型和语法规范 (http://www.w3.org/TR/1999/REC-rdf-syntax-19990222/) [RDF-MS (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-rdfms)]和资源描述框架模式(RDF Schema)规范1.0 (http://www.w3.org/TR/2000/CR-rdf-schema-20000327/)[RDF-S (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-rdf-s)]。所以,一些术语、语法和概念已经稍有变化。本文档反映的是在上面的列表中给出的新版本RDF规范。因此,对于熟悉旧规范或基于旧规范的教程、入门读物的读者,应留意当前版本的规范与先前版本的一些差异。关于先前版本的RDF中出现的一些问题以及它们在当前版本中的解决方案的列表,请参见[http://www.w3.org/2000/03/rdf-tracking/ RDF问题跟踪(Issue Tracking)。
2. 关于资源的陈述
RDF是用以提供一种发表关于Web资源(如网页)的陈述的简单方法的。这部分描述了RDF提供这些能力(描述这些概念的规范标准就是RDF概念和抽象语法 (http://www.w3.org/TR/rdf-concepts/)[RDF-CONCEPTS (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-rdf-concepts)])背后的基本思想。
2.1 基本概念
试想一下这样的情形:有一个叫John Smith的人创建了某个网页。如果用自然语言(比如英语)来陈述该事实,一种简洁明了的方式是采用下面这种简单陈述的形式:
http://www.example.org/index.html has a creator whose value is John Smith
强调该陈述的各个部分是为了强调:为了描述某事物的特性,需要某些方法来命名或标识多种事物:
- 陈述所描述的事物(譬如此例中John Smith所创建的网页)
- 陈述所描述事物的具体属性(property)(譬如本例中的creator)
- 陈述所描述的作为该属性(陈述所描述事物对应的)的值的事物(如这个网页的creator是谁)。
在上面的陈述中,网页用它的URL(Uniform Resource Locator,统一资源定位符)来标识。另外,单词“creator”被用来标识事物的属性(property),短语“John Smith”被用来标识作为属性(property)的值的事物(一个人)。
该网页的其他属性(property)可以通过书写其他具有相同形式的英文陈述来描述:用URL标识该网页,用单词(或其他表达式)来标识网页的属性(properties)及其值。例如:这个网页的创建日期和所用的语种可以由下列陈述来描述:
http://www.example.org/index.html has a creation-date whose value is August 16, 1999
http://www.example.org/index.html has a language whose value is English
RDF是基于这一思想的:被描述的事物具有一些属性 (http://www.w3.org/TR/rdf-concepts/#dfn-property) (properties),而这些属性各有其值(values);对资源的描述可以通过对它作出指定了上述属性及值的陈述(statement)来进行(就像上面例子中的那样)。RDF用一套特定的术语来表达陈述中的各个部分。确切地说,关于事物(譬如上例中的网页)的陈述中用于识别事物的那部分就叫做主体 (http://www.w3.org/TR/rdf-concepts/#dfn-subject),而用于区分陈述对象主语的各个不同属性(譬如:作者,创建日期,语种等等)的那部分就叫做谓词 (http://www.w3.org/TR/rdf-concepts/#dfn-predicate),陈述中用于区分各个属性的值的那部分叫做客体 (http://www.w3.org/TR/rdf-concepts/#dfn-object)。因此,考虑英文陈述:
http://www.example.org/index.html has a creator whose value is John Smith
这个陈述里的不同部分用RDF术语来说就是:
- 主体是URL http://www.example.org/index.html
- 谓词是词“creator”
- 客体是短语“John Smith”
正如英语是作为(用英语沟通的)人们之间很好沟通工具一样,RDF是用来做出机器可处理的声明的工具。那么,如果想做出这种适合机器处理的声明,还需要两件事:
- 一个可用来区分标识一个陈述中的主体,谓词,客体的机器可处理的标识符系统,同时这个标识符系统不会和其他人可能在Web上使用的相似的标识符系统混淆;
- 一种用以表示这些陈述并让这些陈述可在机器间交流的机器可处理的语言;
幸运地是,现有的Web体系结构提供了这两个必需的工具。
正如前面所描述的,Web已经提供了一种形式的标识符-URL(Uniform Resource Locator,同一资源定位符)。在第一个例子中,就采用了一个URL来标识John Smith所创建的网页。URL是标识(identify)Web资源(Web resource)的字符串,这是通过标识资源的首选访问机制来实现的(本质上,即资源的网络“位置”)。然而,对于许多不具有网络地址或URL的资源(这一点与网页是不同的),能够记录关于它们的信息也是同等重要。
Web提供了一套更通用的标识符形式,称为统一资源标识符 (http://www.isi.edu/in-notes/rfc2396.txt)(Uniform Resource Identifier,URI)。URL是URI的一种具体形式。所有URI都具有共同的特征:即不同的人或组织可以彼此独立地创建并使用URI来标识事物。但是,URI并不局限于标识具有网络地址或其他计算机访问机制的资源。实际上,我们可以创建URI来引用陈述中需要被标识的任何资源,包括:
- 网络可访问资源,譬如,一份电子文档、一个图片、一个服务(例如,“洛山矶的今日天气预报”)或是一组其他的资源;
- 非网络可访问资源,譬如,人、公司、在图书馆装订成册的书籍;
- 不物理存在的抽象概念,如“作者(creator)”这个概念;
由于上述通用性,RDF用URIs作为其标识机制(用于标识陈述中的主体、谓词和客体)的基础。更准确地说,RDF使用的是URI引用(URI references) (http://www.w3.org/TR/rdf-concepts/#dfn-URI-reference) [URIS (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-uri)]。一个URI引用(或“URIref”)是一个在尾部附加了可选的“片段识别符(fragment identifier)”的URI。比如,URI引用(URIref) http://www.example.org/index.html# 由URI http://www.example.org/index.html 和(由符号#分隔的)的section2 (片段标识符)组成。RDF URIrefs可以包含Unicode[UNICODE (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-unicode)]字符(参见[RDF-CONCEPTS (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-rdf-concepts)]),这就允许在URIrefs中使用多种语言。RDF将“资源(resource)”定义任何可被为URI引用(URIref)标识的事物。因此,使用URIrefs,RDF实际上可以描述任何事物,并陈述这些事物之间的关系。URIrefs和片段标识符将在Appendix A (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#identifiers)和[RDF-CONCEPTS (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-rdf-concepts)]中作进一步的阐述。
为了用一种机器可处理的(machine-processable)方式来表示RDF陈述(RDF statements),RDF采用了可扩展标记语言(Extensible Markup Language) (http://www.w3.org/TR/2000/REC-xml-20001006)[XML (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-xml)]。XML被设计成允许任何人来设计他们自己的文档格式,并可用这种格式书写文档。RDF定义了一个特殊的XML标记语言(称为RDF/XML)来表示RDF信息和在机器间交换这些信息。在第一节 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#intro)中有一个关于RDF/XML的例子。这个例子(例 1 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#example1) )使用了一些诸如<contact:fullName>和<contact:personalTitle>这样的标签来相应地区分Eric Miller和Dr这些文本内容。这些标签能让那些理解这些标签含义的程序正确地解释文本内容。XML的内容和标签(除了一些特例)能够包含统一字符编码[UNICODE (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-unicode)] 的字符,这就允许了来自各种语言的信息可以被直接显示出来。附录 B (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#documents)大体上给出了关于XML进一步的背景知识。关于RDF的RDF/XML专用语法在第三节 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#rdfxml)中有更详细的描述,且定义在规范[RDF-SYNTAX (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-rdf-syntax)]中。
2.2 RDF模型
在2.1节 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#basicconcepts) 中阐述了以下内容:RDF陈述的基本概念,用URIref标识RDF陈述中涉及的事物的方法,以及用RDF/XML作为一种机器可处理的方式来表示RDF陈述。基于这些铺垫,这节将描述RDF是如何用URIs发表关于资源的陈述的。在介绍(第1节)中已经说明了,RDF的基本思想是:表达简单的资源陈述,其中每个陈述都是由主体(subject),谓词(predicate),客体(object)组成的。在RDF中,如下的英文陈述:
http://www.example.org/index.html has a creator whose value is John Smith
可以由RDF陈述来表示:
- 一个主体 http://www.example.org/index.html
- 一个谓词 http://purl.org/dc/elements/1.1/creator
- 和一个客体 http://www.example.org/staffid/85740
请注意是如何用URIrefs不仅标识了陈述的主体,还标识了谓词和客体,而不分别用单词“作者”和“John Smith”(这样使用URIrefs的效果将会在这节的稍后部分做论述)。
RDF把图中的节点和弧作为陈述的模型。RDF的图模型 (http://www.w3.org/TR/rdf-concepts/#section-data-model)已在[RDF概念 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-rdf-concepts)]里有过详细说明。在这个表示法(图示法)中,一个陈述可表示为:
- 一个表示主体的节点;
- 一个表示客体的节点;
- 一个由主体节点指向客体节点的表示谓词的弧;
因此以上的RDF陈述可以描述为如图2 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#figure2)所示的那样:
图2:一个简单的RDF陈述
一组陈述相应地被一组节点和弧表示。所以,为了在RDF中表示其他的英文陈述:
http://www.example.org/index.html has a creation-date whose value is August 16, 1999
http://www.example.org/index.html has a language whose value is English
可以用图3 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#figure3)所示的图(用合适的URIrefs标识属性"creation-date" 和 "language"):
图3:关于同一资源的多个陈述:
图3 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#figure3) 说明了RDF陈述中的客体可以是URIrefs,也可以是常量值(称作文字),即用于表示某种属性值的字符串。
图 3 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#figure3)显示了:为了表示多种类型的属性值,RDF陈述中的客体可能是URIrefs或字符串表示的常数(称为文字 (http://www.w3.org/TR/rdf-concepts/#section-Literals),literal)。(比如在以 “http://purl.org/dc/elements/1.1/language” 为谓词的例子中,那个文字就是一个英文的国际标准双字母码。)在RDF的陈述中,文字(literal)可能不被用作主体或者谓词。在画RDF图时,节点为URIrefs的用椭圆来表示,而节点为文字的则用方框来表示(这个例子中的简单字符串文字叫做平凡文字 (http://www.w3.org/TR/rdf-concepts/#dfn-plain-literal),它与将会在2.4节 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#typedliterals)做介绍的类型文字 (http://www.w3.org/TR/rdf-concepts/#dfn-typed-literal)(typed literals)是不同的。在[[RDF-CONCEPTS (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-rdf-concepts)]中详细说明了各种不同的可用于RDF陈述中的文字。平凡文字和类型文字都能容许采统一字符编码[UNICODE (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-unicode)]的字符,即允许信息用多种语言描述。)
有时在讨论它们的时候画图不太方便,因此也会用到一个替代的书写陈述的方法,称为三元组 (http://www.w3.org/TR/rdf-concepts/#dfn-rdf-triple)。在三元组表示法中,图中的每个陈述都可以写成一个依次为主体,谓词,客体的三元组。如图3 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#figure3)所表示的陈述用三元组表示法来写就是:
<http://www.example.org/index.html> <http://purl.org/dc/elements/1.1/creator> <http://www.example.org/staffid/85740> .
<http://www.example.org/index.html> <http://www.example.org/terms/creation-date> "August 16, 1999" .
<http://www.example.org/index.html> <http://purl.org/dc/elements/1.1/language> "en" .
每一个三元组均对应于图中的一条弧,且这个弧的起始节点和终止节点分别是陈述中的主体和客体。和图形表示法不同(倒像是原先的陈述),三元组表示法要求一个节点在它出现的每个陈述中都要有标识。因此,例如, “http://www.example.org/index.html” 在三元组表示法中共出现了三次(在每个三元组中均出现一次),而在图形表示法中只出现了一次。但是,三元组表示法和图示法描述了完全相同的信息,这揭示了一个要点:RDF的基础是陈述的图模型,而用于表示或描述这个图的表示法则是次要的。
完全的三元组表示法要求写出完整的URIref(括在尖刮号中),正如上面例子那样,所以导致了在一页中有很多长句。为方便起见,本文档用一种简写法(也在其他的RDF规范里使用)来书写三元组。在这种简写法中, 一个不用尖刮号的XML限定名(QName)作为一个完整的URIref 的缩写形式 (QName 会在附录 B (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#documents)进一步讨论)。一个QName包括一个被赋为命名空间URI的前缀,其后是一个冒号,然后是个"局部名称"(local name)。由QName可以生成完整的URIref,即将局部名称添加到已经赋了命名空间URI的前缀。因此,例如,如果将命名空间URI“http://example.org/somewhere/”赋值给QName前缀foo,那么QName “foo:bar”就是URIref“http://example.org/somewhere/bar”的缩写。在本文档的例子中也会用一些“公认的”QName前缀(这些前缀无需说明就可使用),定义如下:
前缀 rdf:, 命名空间 URI: http://www.w3.org/1999/02/22-rdf-syntax-ns#
前缀 rdfs:, 命名空间 URI: http://www.w3.org/2000/01/rdf-schema#
前缀 dc:, 命名空间 URI: http://purl.org/dc/elements/1.1/
前缀 owl:, 命名空间 URI: http://www.w3.org/2002/07/owl#
前缀 ex:, 命名空间 URI: http://www.example.org/ (or http://www.example.com/)
前缀 xsd:, 命名空间 URI: http://www.w3.org/2001/XMLSchema#
显然,“example”的前缀 “ex:”的变形在需要时也会用在示例中,例如:
前缀 exterms:, 命名空间 URI: http://www.example.org/terms/ (作为示例的组织中的词汇),
前缀 exstaff:, 命名空间 URI: http://www.example.org/staffid/ (作为示例的组织中的雇员标识),
前缀 ex2:, 命名空间 URI: http://www.domain2.example.org/ (作为示例的第二个组织中的词汇), and so on.
用这种简写法,先前的三元组可以写成:
ex:index.html dc:creator exstaff:85740 .
ex:index.html exterms:creation-date "August 16, 1999" .
ex:index.html dc:language "en" .
因为RDF用URIref替代词语来命名陈述中的事物,RDF称一个URIref的集合(特别是为了某个目的集合)为词汇表(vocabulary)。通常,这些词汇表中的URIrefs被组织为一个有相同前缀的QName的集合。也就是说,一个词汇表中的所有术语都有一个相同的命名空间URIref,通常这个URIref(无论是谁控制)定义了这个词汇表。
包含在词汇表里的URIrefs是通过在公用的URIref的末端加上局部名称形成的,这样就构成了一套有着公用前缀的URIrefs。譬如:正像前面的例子展示的那样,一个组织,比方说是example.org,可能定义一个由前缀全部为http://www.example.org/terms/ 的URIrefs构成的词汇表,用来表示这个组织在业务中用到的术语(例如:“创建日期”,“产品”等),同时也会定义一个全部由http://www.example.org/staffid/ 开头的URIrefs词汇表来标识这个组织的雇员。RDF用相同的方法来定义它自己的术语的词汇表,这些术语在在RDF中有着特定的含义。RDF 词汇表中的 URIrefs 都以 “http://www.w3.org/1999/02/22-rdf-syntax-ns# ”开头,通常情况下,其QName用前缀“rdf:”来表示。RDF词汇描述语言(将会在 第五节 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#rdfschema)做阐述)定义了另一套都以http://www.w3.org/2000/01/rdf-schema# 开头的URIrefs的术语集合,其QName用前缀“rdfs:”来表示。(当一个特定的QName前缀以这种方式与一个已给定的术语集相关联的时候,那么这个QName前缀有时会用以作为这个词汇表的名称,比如,有人可能说“rdfs: 词汇”)。
使用公用的URI前缀提供了一种便捷的方法来组织一套相关的术语集URIrefs,然而,这仅仅只是一种约定。RDF模型只认可完整的URIrefs;它不会去看URIrefs的具体内容或使用任何关于它们结构的知识。特别地,RDF不会仅仅因为URIrefs有一个公用的前缀而认定这些URIrefs之间有联系(更深入的探讨请看附录A (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#identifiers) )。当 URIrefs 带有不同的前缀时,并没有规定说,这些URIrefs就不能被认为属于同一个词汇表。 某个特定的组织、过程(process)或者工具等可以根据自己的需要,来定义词汇。这些词汇的 URIrefs可以来自于任何其它的词汇,数目不受限制。
另外,有时一个组织将使用词汇表的URIref命名空间用作是提供关于该词汇表的详细资料这种Web资源所在地的URL。例如:像著名的QName前缀dc: 将会在本文档的例子中用到,它是和命名空间URIref http://purl.org/dc/elements/1.1/ 相关联的。事实上,这指在6.1节 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#dublincore)阐述的都柏林核心词汇表。通过在网页浏览器中访问这个URIref命名空间就能获得关于都柏林核心词汇表(明确地说,是一个RDF Schema)的其他一些信息。然而,这也仅仅只是一种约定。RDF不会认为每个URI命名空间都能确定一个可获取的Web资源(更深入的探讨请看附录B (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#documents) )。
在这个入门文档的其余部分里,当涉及到一些为特殊目而定义的一套URIref,比如供RDF自身的使用而定义的各种URIref ,或者是example.org定义的用来标识它雇员的一套URIref,时都将会用到术语“词汇表”。术语“命名空间”只是在特指XML命名空间这个语法概念的时候才会使用(或者用来描述 QName中的URI前缀)。
在RDF图中可以自由混合来自不同词汇表的URIrefs。譬如:在图 3 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#figure3) 中用到了分别采用了exterms:,exstaff:,dc:词汇表的URIref。在RDF图中,RDF也没有限制能用多少个具有同一谓词URIref的陈述描述同一个资源。例如:如果资源ex:index.html是由约翰·史密斯和其他几名工作人员努力合作创造的话,那么example.org可能写以下陈述:
ex:index.html dc:creator exstaff:85740 .
ex:index.html dc:creator exstaff:27354 .
ex:index.html dc:creator exstaff:00816 .
这些RDF陈述的例子开始展现一些使用URIref作为RDF标识事物的基本方式的优势所在。譬如:在第一个陈述中,不用字符串“John Smith”来作为网页的制作者,而是把一个URIref(使用基于他的雇员号码的URIref)http://www.example.org/staffid/85740赋予给他。这样使用URIref的一个优点就是陈述主体可以被更加精确的标识出来。就是说,这个网页的制作者不是字符串“John Smith”,也不是数以千计的名叫John Smith的人中的一个,而是与那个URIref(且不管是谁创建了定义了这种关系的URIref)相关的那个特殊的John Smith。而且,因为一个指向John Smith的URIref,他就成为一个成熟的资源,并且仅仅通过增加其他主体为John的 URIref的RDF陈述,就可以记录他的一些其他信息。例如:图 4 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#figure4)展示了可给出关于John的姓名和年龄的一些陈述。
图4:更多关于John Smith的信息
这些例子也说明了RDF在RDF陈述中用URIref作为谓词。就是说,RDF使用URIrefs标识属性,而不是使用像“creator”或者“name”那样的字符串(或词组)。用URIref来标识属性的重要性是基于很多原因的。第一,它可以把一个人用的属性和其他人用的属性区别开来,尽管他们可能用相同的字符串来表示属性。例如:在图4 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#figure4)中的例子,example.org使用"name"想要使写出的某人的全名作为一个字符串文字(譬如:“John Smith”),但是其他人可能想要使"name"代表某些不同的事物(譬如:在一个程序段中的变量名)。当一段程序遇到“name”作为一个Web上的属性标识符(或者当合并来自多个数据源的数据)时将不一定能区分这些使用方法。但是,如果example.org用“http://www.example.org/terms/name”当作它定义的“name”的值,并且其他人用“http://www.domain2.example.org/genealogy/terms/name”当作他们定义的“name”的值,那么显然不同的“name”包含着不同的值(即使一个程序不能自动确定它们的具体含义)。此外,使用URIrefs来区分属性能使属性被看成是资源本身。因为属性也是资源,仅仅通过增加主体为属性的URIref的RDF陈述,就能记录关于属性的信息(譬如:example.org 所用的“name”属性的含义的英文描述)。
用URIref作为RDF陈述的主体,谓词,客体支持了Web上的共享词汇表的使用和发展,因为人们可以发现并开始使用已经在用的词汇表来描述事物,这反映了人们对那些概念的共享理解。例如:在三元组“ex:index.html dc:creator exstaff:85740 ”中:
ex:index.html dc:creator exstaff:85740 .
当谓词“dc:crearot”完全展开为一个URIref时,就明确的指向了Dublin Core元数据属性集(一个广泛使用的描述各种各样信息的一套属性集,将在6.1节 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#dublincore)中做深入的讨论)中的“creator”的属性。这个三元组的作者有效地说明了网页(由http://www.example.org/index.html 所标识)和网页的作者(一个独一无二的人,由http://www.example.org/staffid/85740 所标识)之间的关系正是一个由http://purl.org/dc/elements/1.1/creator 标识的概念。另一个熟悉Dublin Core词汇的人,或是查明了“dc:creator”确切含义(通过在Web上查找的它的定义)的人,将会明白这个关系的含义。另外,在这种理解的基础上,在处理含有谓词“dc:creator”的三元组时,人们就能编写出行为与这个含义一致的程序来。
当然,这有赖于越来越普遍地使用URIref而不是用文字来指代事物;譬如:用URIref像“exstaff:85740”和“dc:creator”来代替字符串文字像“John Smith”和“creator”。即使是那样,RDF对URIre的使用仍不能解决所有的标识问题,因为例如:人们仍然能够用不同的URIref来指代同一个事物。由于这个原因,尽量使用现有的词汇表(比如Dublin Core)的术语,而不发明可能与其他词汇表中术语重复的术语,这是个不错的想法。 正如在第6节 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#applications)描述的应用展示的那样,在特定领域里适用的词汇表一直都在完善中。然而,即使同义词被建立了,在普遍可访问的“Web 空间”中使用不同的URIref,即提供了在这些URIref中识别等价关系的机遇,也提供了转向使用通用词汇表的机遇。
另外,重要的是,要区分RDF本身赋予RDF陈述中的词汇(比如在先前例子里的dc:creator)的含义与人们(或人编写的程序)可能赋予这些词汇的其他外部定义的含义。作为一门语言,RDF直接定义的只有主体,谓词,客体三元组的图示语法,在rdf:词汇表中的URIrefs的某些含义,和稍后会做介绍的某些其他概念。这些事物在[RDF-CONCEPTS (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-rdf-concepts)]和[RDF-SEMANTICS (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-rdf-semantics)]有规范的定义。不过,RDF没有定义在RDF陈述中使用的其他词汇表中的术语的含义,比如:dc:creator。特定的词汇表会被创建且其中的URIref会被赋予特定的含义,但这是在RDF之外的。使用了这些词汇表中的URIref的RDF陈述可能会把那些术语的特定含义传达给熟悉这些词汇表的人,或是处理这些词汇表的RDF应用程序,而不会把这些含义传达给不是特意处理这些词汇表的通用RDF应用程序。
例如,人们可以给一个三元组如:
ex:index.html dc:creator exstaff:85740 .
赋予一定的含义,这是基于单词“creator”作为URIref“dc:creator”的一部分出现所表示的含义,或者基于在他们理解了“dc:creator”在Dublin Core词汇表中的确切定义。 不过,就通用的RDF应用程序而言,这个三元组和下面的三元组在内在的含义上是一样的:
fy:joefy.iunm ed:dsfbups fytubgg:85740 .
与此类似,任何可能在Web上找到的描述“dc:creator”含义的自然语言文本都无法为一个通用的RDF应用程序提供其直接可用的额外的含义信息。
当然,来自一个特定词汇表的URIrefs可以在RDF陈述中被使用,尽管给定的应用程序可能不能把任何特定的含义赋予他们。例如,通用的RDF软件会识别出上述表达式是一个RDF陈述,其中“ed:dsfbups”是一个谓词,等等。它不会把词汇表开发人员赋予给一个URIref(比如 ed:dsfbups)的任何特定含义赋给这个三元组。此外,基于他们对一个给定的词汇表的理解,人们仍可以编写出一个与这个词汇表中的URIref的特定含义一致的RDF应用程序,尽管这个含义对不是以这种方式编写的RDF应用程序是无法理解的。
结果是:RDF提供了一种发表更易被应用程序处理的陈述的方法。一个应用不能真正理解这些陈述,就如当一个数据库系统处理一个查询语句如:SELECT NAME FROM EMPLOYEE WHERE SLALRY > 35000 的时候,数据库系统对像“employee”或“salary”这类的词汇的理解一样。但是, 如果一个应用程序编写的很合理,那么它处理RDF陈述时就好像它确实理解它们一样,这正像是一个数据库系统和它的程序并没有理解什么是“employee”和“payroll”却能在处理雇员和薪水的数据信息时做有用的工作一样。例如:一个人能搜寻Web找到全部书评并且为每本书创建一个平均等级。 然后,这个人就可以把这些关于书的信息放到Web上。 而另一网站能获取这些书平均等级的列表并且创造一个"评价最高的十本书"页面。 这里,一个关于书等级的共享词汇表的可用性和及其使用,以及用于标识那些书的一组共享的URIref,允许个人建造一个在Web上可相互理解和用处日益广泛(或说是做了其他贡献那样)的关于书的“信息库”。相同的原则适用于人们每天在Web上创建的关于数以千计的主题的大量信息。
RDF陈述和很多其他信息记录格式类似,像:
- 在一个数据处理系统里,一个简单的记录或是目录清单中的实体,
- 一个简单的关系数据库的行,
- 形式逻辑的简单断言,
并且,这些格式的信息都能看成RDF陈述,这使得RDF能用于集成来自多个数据源的数据。
2.3 结构化的属性值与空节点
需要记录的信息,如果用简单的RDF语句的形式来描述就足够了,那么,一切都将变得很简单,但是,大多数现实世界中的数据,至少表面看起来,要比简单的RDF语句所能描述的形式复杂得多。例如,在最初的那个例子中,用来记录创建网页的是一个简单的数据:creation-date属性,这个属性的值是简单的字符型,但是,假设这个creation-date属性的值需要分别记录年、月、日,或者,在描述John Smith的个人信息的情况下,我们来考虑John的地址,整个的地址可以被写作一个简单的字符串,或者一个三元组"1501 Grant Avenue, Bedford, Massachusetts 01730"。
exstaff:85740 exterms:address "1501 Grant Avenue, Bedford, Massachusetts 01730" .
然而,设想一下约翰的地址需要记录为由一个街道,城市,州和邮政编码组成的结构,这些在RDF中是如何做到的?
像这样的结构化的数据信息在RDF中是通过以下方式描述的:把被描述的事物聚集体(比如:John Smith的住址)看成一个资源,然后发表关于这个新资源的陈述。所以,在RDF图中,为了将John Smith住址分解成它的各个组成部分,一个用来描述John Smith住址这一概念的新节点就随之产生了,并用一个新的URIref来标识,如http://www.example.org/addressid/85740 (可缩写为exaddressid:85740)。把这个节点作为主体,RDF陈述(附加的弧和节点)可用来描述附加的信息,如图5 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#figure5)所示:
图5:分解John的住址:
相应的三元组表示如下:
exstaff:85740 exterms:address exaddressid:85740 .
exaddressid:85740 exterms:street "1501 Grant Avenue" .
exaddressid:85740 exterms:city "Bedford" .
exaddressid:85740 exterms:state "Massachusetts" .
exaddressid:85740 exterms:postalCode "01730" .
这中描述RDF结构化数据的方法会产生很多的“中间的”URIrefs,比如像描述聚集体概念(如John's address)的URIref exaddressid:85740。这些概念可能从来不会被从RDF图的外部引用,因此可能不需要“通用的”标识符。另外,在用于描述一组陈述的图
图5 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#figure5)中,用来标识“John Smith's address”的URIref并不是真正需要的,因为这个图可以简单地标识为如图6 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#figure6)所示:
图6:使用一个空节点
图6 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#figure6)是一个近乎完美的RDF图,它使用了一个没有URIref的节点来表示“John Smith's address”这一概念。这个空节点 (http://www.w3.org/TR/rdf-concepts/#dfn-blank-node)虽然没有URIref,但表达了它应该表达的含义,因为这个空节点本身提供了图中各个部分之间必需的连通作用(空节点在[RDF-MS (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-rdfms)]中被称作匿名资源(anonymous resources))。然而,为了把这个图表示为三元组的形式,就需要一个某种形式的能清楚表示那个空节点的标识符。这里试着写出了与图6 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#figure6) 所示的内容相应的三元组:
exstaff:85740 exterms:address ??? .
??? exterms:street "1501 Grant Avenue" .
??? exterms:city "Bedford" .
??? exterms:state "Massachusetts" .
??? exterms:postalCode "01730" .
“???”出现的地方正是出空节点出现过的地方。因为一个复杂的图包含的空节点可能会不只一个,所以需要一种区分在图的三元组表示法中出现的不同空节点的办法。因此,三元组使用空节点标识符 (http://www.w3.org/TR/rdf-concepts/#dfn-blank-node-id),以“_:name”的形式来表示空节点。例如:在这个例子中,空节点标识符“_:johnaddress”可以用来表示空节点,那么相应的三元组可以写成如下的形式:
exstaff:85740 exterms:address _:johnaddress .
_:johnaddress exterms:street "1501 Grant Avenue" .
_:johnaddress exterms:city "Bedford" .
_:johnaddress exterms:state "Massachusetts" .
_:johnaddress exterms:postalCode "01730" .
在表示一个图的三元组中,图中每个不同的空节点都被赋予一个不同的空节点标识符。与URIref和文字不一样,空节点标识符并不被认为是RDF图的一个实际组成部分(这从图6 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#figure6)所示的就可以看出来,并且注意在图中空节点并没有空节点标识符)。空节点标识符仅仅是在把RDF图表示成三元组形式的时候,用来表示图中的空节点的(并且区分不同的空节点)。空节点标识符只是在用三元组表示单一的图的时候才有意义(两个有相同空节点数目的RDF图可能会独自地使用相同的空节点标识符来区别那些空节点,但是如果假设不同RDF图中具有相同标识符的空节点是相同的就不对了)。如果希望图中的一个节点需要从图的外部来引用,那么就应该赋予一个URIref值来标识它。最后,因为空节点标识符表示的是(空)节点而非弧,所以在一个图的三元组表达式中:空节点标识符只能出现在三元组主体和客体的位置上;不能出现在谓词的位置上。
这一节的开头部分记录了聚集体结构(比如John Smith's address)可以通过如下的方式来描述:聚集体被作为一种资源描述,然后发表关于这个新资源的陈述。这个例子阐明了RDF的一个重要方面:RDF只能直接表示二元关系,例如:John Smith和描述他住址的文字(literal)之间的关系。要描述John和由这个地址的每个单独部分组成的组的关系的时候,就要涉及到处理一个N元(n-ary)关系(在这里N=5),其中这五元分别是John,街区(street),城市(city),州(state),和邮政编码(postal code)。为了要在RDF中直接的描述这种结构(例如:把地址看作是由街区(street),城市(city),州(state),和邮政编码(postal code)这四个部分构成的一个组),就必须把这个N元关系分解为一组二元关系。空节点提供了一种完成这个任务的方法:对于每一个N元关系,选择其中的一元(
participant)作为这个关系的主体(比如John),创建一个空节点来描述其余的关系(比如John's address),这个N元关系的其他元(比如city)则被描述成由空节点标识的新资源的各个单独的属性。
有些资源可能没有URI,空节点也同样提供了一种更准确的发表关于这些资源的陈述的方法,但这是通过和那些有URI的资源的关系来描述的。例如:当发表一个关于某人(比如Jane Smith)的陈述的时候,可能会很自然的想到要用基于这人的email地址的URI作为她的URI(mailto:jane@example.org ),但是,这种方法可能会导致一些问题。如果需要同时记录关于Jane(比如她目前的实际住址)和她的邮箱(比如,它所在的服务器)两者的信息,那么,还用基于她邮箱地址的URI作为她的URIref的话,就会很难区分表述的到底是Jane还是她的邮箱。同样的问题也会出现在下面这种情况:当一个公司用它公司的网页URL(比如:http://www.example.com/)作为自己的URI的时候。同样地,当需要同时记录关于网页(比如:是谁于何时创建的)和这个公司两者的信息时,如果还用“http://www.example.com/”作为两者的标识符,就会导致很难区分谁是真正意义上的主体。
这些问题出现的根本原因就是:用Jane的邮箱来代表Jane是不正确的,因为Jane和她的邮箱根本就是两码事,因此她和它应该区别对待。当Jane自己没有URI时,空节点提供了一条为这种情形更正确的建模方法:Jane可以由一个空节点表示,并且用这个以“exterms:mailbox”为属性的空节点作为陈述的主体,且用URIref“mailto:jane@example.org” 作为它的这个属性的值。这个空节点也可以用以“exterms:Person”为值的一个“rdf:type”属性来表述(类型(type)将在以后章节做更详细的讨论),或者是其他有用的描述性信息,正如下列三元组所示的:
_:jane exterms:mailbox <mailto:jane@example.org> .
_:jane rdf:type exterms:Person .
_:jane exterms:name "Jane Smith" .
_:jane exterms:empID "23748" .
_:jane exterms:age "26" .
(注意在第一个三元组中“ mailto:jane@example.org”写在两个尖括号里面,这是因为“mailto:jane@example.org” 在mailto URI模式中是个完整的URIref,而不是一个QName缩写,在三元组表示法里一个完整的URIref必需写在一对尖括号内。)
这些三元组准确地说明了:“有一个资源,其类型为exterms:Person,其电子邮箱是由“mailto:jane@example.org” 来标识的,其名字是Jane Smith,等等”。就是说,空节点可以读作“有一个资源”。以这个空节点作主体的陈述就提供关于这个资源特性方面的信息。
实际上,在这些情况下用空节点替代URIref并不会在信息处理方面带来太多改变。例如:人们知道一个email地址唯一确定在example.org里的某人(特别地,如果这个地址不能被重用的话),那么,这个email地址会被用来聚集来自多个数据源的关于这个人的信息。尽管这个email地址不是这人的URI。在这种情况下,如果在Web上找到了一些描述一本书的RDF,并且给出了作者的联系资料如 mailto:jane@example.org,那么把这条新信息和先前的一套三元组结合起来,然后推断作者的名字是Jane Smith,这样做就可能是合理的。这种说法的关键有点像"这书的作者是 mailto:jane@example.org"是“这书的作者是邮箱是mailto:jane@example.org的某人"的一种典型的缩写一样。用一个空节点来表示这个“某人”是一种更准确地来表示真实世界的方法。(顺便说一下,一些基于RDF的模式语言特别指出允许某些属性可以作为它们描述的资源的”唯一标识符“。这些将在5.5节 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#richerschemas)做更深入的探讨。)
这种使用空节点的方法也可以帮助人们避免文字(literals)在可能不适当情况下的使用.例如:当描述Jane的书而又缺少一个识别作者的URIref时,出版商就可能这样写(使用出版商自己的ex2terms:词汇表):
ex2terms:book78354 rdf:type ex2terms:Book .
ex2terms:book78354 ex2terms:author "Jane Smith" .
但是,书的作者却不是字符串“Jane Smith”,而是一个名叫Jane Smith的人。于是,当出版商用一个空节点时相同的信息就可能会被更准确的表达出来:
ex2terms:book78354 rdf:type ex2terms:Book .
ex2terms:book78354 ex2terms:author _:author78354 .
_:author78354 rdf:type ex2terms:Person .
_:author78354 ex2terms:name "Jane Smith" .
这实质上说,“ex2terms:book78354”的类型是“ex2terms:book”,并且它的作者是类型为“ex2terms:Person”的一个资源,作者的名字是“Jane Smith”。当然,在这个特例中,出版者为了要鼓励对作者的外部引用,可能对作者指派他自己的URIrefs而不是使用空节点识别他们。
最后,上面的例子给出了Jane的年龄是26说明了这么一件事实就是:有时一个属性的值可能表面上看来很简单,但实际上可能会更复杂。在这种情况,Jane的年龄实际上是26岁,但是单位量(岁)没有明确给出。当确信某个访问文本中属性值的人由此能推定所使用的单位量时类似的单位量经常被省略。但是,在Web上无际的文本海洋里,这样的“确信”通常是不可靠的,例如:一个美国地址也许给定一个重量单位--磅,但是某个从外部访问这个数据的人可能会推想给定的单位是千克。总的来说,对于单位或是类似的信息应该经过缜密的考虑然后进行明确的表述。这个问题将会在4.4节 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#rdfvalue)做更深入的探讨,在这节中将会讲述能把这样的信息表述成构造值(structured values)是RDF特色之一,同时也会涉及到另外一些用于表述这类信息的技术。
2.4 类型文字
上一节讲述了怎样处理如下这种情况:用平凡文字表示的属性值分解为能表示那些文字每个单独部分的构造值。例如:如果要记录一个网页的创建日期的话,这种方法用一个专门的平凡文字作为它的值,这个值会以一个由年,月,日组成的结构体作为资料的各个部分,并分别用平凡文字来表示相应的值,就取代了通过创建一个单独exterms:creation-date属性来记录一个网页创建日期的方法。但是,到目前为止,所有可以在RDF中作为客体的常量值都用这些平凡(非类型)文字表示,甚至当意图是用数字(例如一个年份属性或是年龄属性的值)或者其他更特殊的值当作属性值时。
例如,如图4 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#figure4) 所示的一个记录关于John Smith资料的RDF图,这个图中记录的John Smith的属性“exterms:age”值为平凡文字“27”,正如图7 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#figure7)所示的那样:
图7:表示John Smith的年龄
在这个例子中,假设的组织example.org可能想要用一个数字来表示“27”,而不是用由“2”和后面的“7”组成的字符串来表示(因为文字表示了一个属性“age”的值)。但是,图7并没有明确指出“27”应当被解释成一个数字。同样地,example.org可能也想把“27”表示成一个十进制数(比如,一个值为二十七的十进制数),而不是表示成一个八进制数(比如,一个值为二十三的八进制数)。然而,同样地,图7也没有明确指出这些信息。一些特殊的应用程序可能会在编码时把属性exterms:age的值解释成十进制数,但这意味着对这个RDF的正确解释会依赖RDF图中没有明确提供的信息,因而还依赖一些其他需要解释这个RDF的应用程序不一定能获取的信息。
在程序设计语言和数据库系统里通常都会提供一个关于如何解释文字的附加信息:即给文字关联一个数据类型,比如在这个例子里,数据类型是小数或者是整数。一个能理解数据类型的应用程序就会知道,比如,把文字“10”表示成数字十,还是数字二,还是由字符“1”和后面的字符“0”组成的一个字符串,取决于指定的数据类型是整数,二进制数,还是字符串。(虽然这本入门文档不会详细说明关于数据类型的概念,但在2.3节 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#structuredproperties)的结尾处已经提到过更多可以用来包含单位信息的专门的数据类型,比如:一个为intergerYears数据类型。)在RDF中,类型文字 (http://www.w3.org/TR/rdf-concepts/#dfn-typed-literal) 是用来提供这类信息的。
一个RDF类型文字是通过把一个字符串与一个能确定一个特殊数据类型的URIref配对形成的。结果在RDF图中的一个文字节点就是这个配对。类型文字表示的值就是把指定的字符串赋值给指定的数据类型的值。例如,使用一个类型文字,John Smith的年龄将会被表述成在三元组中使用的整数27:
<http://www.example.org/staffid/85740> <http://www.example.org/terms/age> "27"^^<http://www.w3.org/2001/XMLSchema#integer> .
或者,使用QName来简化URI则可写成:
exstaff:85740 exterms:age "27"^^xsd:integer .
或者,如图8所示的:
图8:一个表示John Smith年龄的类型文字
同样地,如图3 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#figure3)所示它表述了关于一个网页的信息资料,网页的 exterms:creation-date属性值写成了平凡文字“August 16,1999”。然而,如果使用一个类型文字,那么这个网页的创建日期就可以明确的表述成1999年8月16号(August 16, 1999),用三元组表示就是:
ex:index.html exterms:creation-date "1999-08-16"^^xsd:date .
或正如图9 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#figure9)所示的那样:
图9:一个表示一个网页创建日期的类型文字
不像典型的程序设计语言和数据库系统那样,RDF没有自己的内置数据类型,比如,整型,实型,字符型,或者日期类型。但是,RDF类型文字为一个已给定的文字提供了一种简单的方法来指出应该用什么样的数据类型来说明它。在类型文字中使用的类型在外部定义,并且由它们的数据类型URI (http://www.w3.org/TR/rdf-concepts/#dfn-datatype-URI)来确定。(有一个例外,RDF用URIref“rdf:XMLLiteral”定义了一个内置数据类型用来把XML内容表示成一个文字值。这个数据类型定义在[RDF-CONCEPTS (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-rdf-concepts)],并在4.5节 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#xmlliterals)讲述的它的使用方法。)例如:图8 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#figure8)和图9 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#figure9) 的例子都使用了整数的数据类型和来自XML数据类型的数据,其中,在XML模型的第二部分:数据类型 (http://www.w3.org/TR/xmlschema-2/) [XML-SCHEMA2 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-xmlschema2)]中定义了XML数据类型。用这种方法的优点之一便是它赋予了RDF直接表述信息的机动灵活性,因为在表述那些来自不同信息源的信息时无需进行信息源和RDF本身的数据类型集之间的转换。(当在不同的数据类型集系统之间移动信息时,还是要进行类型转换的,但当信息在RDF中移入或移出时,RDF无需额外的数据类型转换。)
正如在RDF概念(RDF Concepts)和抽象语法(Abstract Syntax) (http://www.w3.org/TR/rdf-concepts/)[RDF-CONCEPTS (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-rdf-concepts)]中叙述的那样,RDF数据类型概念是基于XML数据类型[XML-SCHEMA2 (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-xmlschema2)]的概念框架上的,这种概念框架定义了包含以下部分的数据类型:
- 一个要用数据类型文字表示的值的集合,被称作值空间(value space)。例如,XML模型数据类型xsd:date的值空间就是日期的集合。
- 一个数据类型用来表示它的值的字符串的集合,被称作是词法空间(lexical space)。词法空间决定了哪一种字符串能够合乎规则地被用来表示这种数据类型的文字。例如:数据类型xsd:date定义了“1999-08-16”是书写这种类型文字的一种合乎规则的方法(相反的如果写成“August 16,1999”则可认为是不合乎规则的)。正如在[RDF-CONCEPTS (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-rdf-concepts)]中定义的,一种数据类型的词法空间是一个双字节字符[UNICODE (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-unicode)]串集,它允许直接表示来自很多语言的信息。
- 一个从词空间到值空间的“词-值(lexical-to-value)映射”.这决定了这样的一个字符串的值:一个为表示这种特殊数据类型的取自词法空间里的一个特定的字符串。例如:一个映射到数据类型xsd:date的词-值映射,决定了对于这种数据类型,字符串“1999-08-16”表示日期“August 16, 1999”。词-值映射是个重要因素因为相同的字符串可能为不同数据类型表示不同的值。
并不是所有数据类型都适和在RDF中使用。一种适和在RDF中使用的数据类型必须符合上述的概念框架。主要意思就是:对于一个特定的字符串,数据类型必须明确地说明这个字符串是否在它的词法空间内,以及这个字符串在它的值空间里所表示的值。例如:基本的XML数据类型(比方说是xsd:string,xsd:boolean,xsd:date等等)就适合用在RDF当中。然而,一些XML内建数据类型就不适合用在RDF当中。例如:xsd:duration没有一个良式定义(well-defined)的值空间,并且xsd:QName需要一个封装的XML文本文档。到目前为止所认为适合和不适合用在RDF中的XML数据类型的清单已经在[RDF-SEMANTICS (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-rdf-semantics)]中给出了。
因为一个特定类型文字表示的值是由类型文字的数据类型决定的,且RDF没有定义任一种数据类型(rdf:XMLLiteral是例外),对一个出现在RDF图中的类型文字的实际解释(例如:决定它所表示的值)必须由那些编写成能正确处理RDF和类型文字的数据类型的软件完成。也就是说,这种软件必须能处理一种RDF的扩展语言,即把RDF和数据类型都作为其内置词汇表的一部分。这使得关于哪种将会在RDF软件中普遍用到的数据类型的争论日益激烈。通常,那些在[RDF-SEMANTICS (http://www.w3.org/TR/2004/REC-rdf-primer-20040210/#ref-rdf-semantics)]罗列出的适合在RDF中使用的XML模型数据类型在RDF中有着“首屈一指”的地位。正如已注明的,
