第2章 RDF:关联数据所用的数据模型

第2章 RDF:关联数据所用的数据模型

本章内容

  • RDF简介
  • 作为关联数据数据模型的RDF
  • 与关联数据相关的RDF格式
  • 关联数据词表

如果没有一个一致的底层数据模型,关联数据将无从立足。这个数据模型就是RDF(Resource Description Framework,资源描述框架)。某些用户对RDF的印象不佳,他们认为这种数据模型过于复杂。这些负面印象主要是在RDF发展初期形成的,与RDF的第一种序列化格式有关。第一种序列化格式基于XML,其原理相当复杂。不过通过本章的学习,读者会发现RDF其实很简单,各种不同的序列化格式让当前的RDF变得易于使用。

第1章简要介绍了RDF,并提到单条RDF陈述(statement)描述了两个事物以及它们之间的关系。多条RDF陈述可以连接在一起形成信息图谱(graph),而不只是分层信息。唯一让RDF看起来复杂的原因或许在于,大部分事物以及它们之间的关系采用URI命名[1]。如果URI较长,未经处理的RDF陈述可能确实难以阅读。好在不少RDF序列化格式都能处理较长的URL,并可以对URL进行缩写。

这一章将介绍RDF数据模型以及它与关联数据之间的关系。我们首先将再次讨论指导关联数据使用的4条原则,它们不仅是关联数据的基础,也对RDF的应用作出了规定。接下来,我们将深入探讨RDF数据模型,包括如何查找、使用并创建RDF词表(vocabulary)。RDF词表提供了RDF数据的模式信息,类似于关系数据库中的模式(schema)。最后,我们将介绍关联数据最常用的4种RDF序列化格式。完成这一章的学习之后,读者将掌握编写关联数据的方法,并开始理解如何编写自己的关联数据。

注意

 

有关RDF规范的详细信息,请参考W3C网站[2]

2.1 关联数据原则让RDF得以扩展

首先,我们回顾第1章所讨论的关联数据原则,以便读者了解RDF数据模型的用法,以及这些原则对RDF数据模型在万维网上的应用所作的规定。

关联数据第1原则是“使用URI命名事物”。RDF支持在客体位置采用URI或字面量(literal)来命名事物,例如<http://www.manning.com/dwood/> dc:creator “David Wood”。相比之下,采用URI更为灵活,因为它对链接和扩展的支持更好,而字面量(如字符串、数字或日期)则无法作为主体。

图2.1显示了3条RDF陈述,它们使用相同的主体(<http://www.manning.com/dwood/>)和谓词(dc:creator)。其中两条陈述以字面量客体(David Wood和Marsha Zaidman)结尾,第3条陈述在客体位置使用以下URI:http://lukeruth.co/me.ttl#Me。在万维网上,这个URI解析为一份描述Luke Ruth的RDF文档,并为Luke提供了一个唯一、全球性、无歧义的Web标识符。

..\17-1007 改图\0201.tif

图2.1 RDF陈述中的客体既可以是字面量,也可以是URI

对于较长的URI:http://purl.org/dc/elements/1.1/creator,谓词dc:creator是它的缩略形式。2.4节将详细介绍各种RDF序列化格式以及它们简化URI的方法。目前,为了简化URI,可以将其分解为前缀(如http://purl.org/dc/elements/1.1/)和后缀(creator),然后为前缀分配一个短名称(本例是dc:),从而使dc:creator与http://purl.org/dc/elements/1.1/creator具备相同的含义。在之后的示例中,我们将继续使用两种URI(长URI和前缀URI),以便读者逐渐习惯它们的用法。与之类似,也可以为任何URI分配一个短前缀。本章其余示例将使用表2.1列出的前缀。

表2.1 除非另行指定,本章示例均使用以下URI前缀

前  缀

命名空间URI

dc:

http://purl.org/dc/elements/1.1/

foaf:

http://xmlns.com/foaf/0.1/

rdf:

http://www.w3.org/1999/02/22-rdf-syntax-ns#

rdfs:

http://www.w3.org/2000/01/rdf-schema#

vcard:

http://www.w3.org/2006/vcard/ns#

从图2.2不难看出用户更愿意使用URI作为事物名称的原因。由于RDF的主体必须是URI,我们也可以创建和Luke有关的其他陈述,比如他的姓名和感兴趣的事物。我们需要将David Wood和Marsha Zaidman的字面量改为URI,以便在同一张图谱中作出更多的陈述。

关联数据第2原则是“使用HTTP URI以便于用户查找事物名称”。RDF本身并未指定所用的URI类型。我们可以使用FTP: URI、ISBN: URI甚至自定义URI。关联数据特别规定使用HTTP URI,以便将数据绑定到万维网中。关联数据URI应是可解析的,它们本质上属于万维网的一部分。

读者可以在Web浏览器的地址栏中输入Luke Ruth的URI(如图2.1和图2.2所示),尝试对其进行解析。该URI将解析为一份Turtle格式的RDF文档,后者包含有关Luke的RDF陈述。图2.1所示的RDF图谱虽然不大,但它能提供更多关于Luke的信息。关联数据的强大功能由此可见一斑:通过少量的关联数据,就能获得更多的关联数据。

在创建自定义数据时,同时应创建相应的URI,后者应该是HTTP URI。下面列出了其他的一些注意事项:

  • 尽可能采用URI命名事物;
  • 使用受控的DNS域;
  • 使用自然键(natural key);
  • 保持URI与实现细节的无关性;
  • 谨慎使用片段标识符(fragment identifier)。

读者已经了解了如何使用URI命名事物,接下来,我们深入讨论其他注意事项。假设读者拥有一个名为example.com的DNS域名,则可以创建类似于http://example.com/some_stuff这样的URI。当然,example.com并非读者所有,因此应将其替换为自己拥有的域名。在其他用户的DNS域名中构建URI——俗称“铸造”URI(minting URI)——是一种极不礼貌的行为。尽管RDF支持任何用户描述任何事物(如同万维网一样),但仍然需要谨慎对待数据源(如同万维网上的文档来源一样)。使用自己拥有的域名构建并发布URI,有助于增加其他用户对数据的信任。这是发布关联数据时一种固有的社会契约(social contract)。

..\17-1007 图\0202.tif

图2.2 使用URI能为后续陈述提供更强的灵活性

自然键是URI中人类可读的类别和子标识符(sub-identifier),它反映了标识符所描述的内容。创建URI时应尽量使用自然键,以便其他采用源格式阅读RDF数据的用户(大部分是开发人员)能快速理解URI的含义。假设我们创建一个URI来描述烘培店中销售的某种黑麦面包,则既可以采用产品编号这样的非自然键(non-natural key)[3],也可以采用自然键[4],但使用自然键的URI显然让用户更容易理解。

中立URI(neutral URI)能避免暴露URI中的实现细节,不过相当多的网站采用非中立URI(non-neutral URI)。如果某个网站采用类似于http://example.com/index.aspx这样的URI时,说明该网站使用了Microsoft ASP.NET技术。当网站管理员修改Web服务器基础设施时,所有相应的URI都会改变。无论是为页面添加书签的用户,还是编写使用这些URI的RDF的开发人员,都可能受到影响。相比之下,中立URI对用户隐藏了实现细节,因为暴露这些细节的弊大于利。http://example.com/2013/03/20/linked-data-book就是一个中立URI,从中无法判断出网站采用了哪种技术。

片段标识符是HTTP URI的一部分,以井号(#)开头,不会被Web客户端(如浏览器)传递给Web服务器。也就是说,如果用户试图解析http://example.com/id/vocabulary#linked_data这样的URI,浏览器只会向服务器发送http://example.com/id/vocabulary。为保护用户隐私,片段标识符将在本地进行处理。片段标识符通常用于HTML页面,指向页面中某个特定的模块。用户不必告知Web服务器管理员需要阅读文档的哪一部分,因为片段标识符已收集了足够的用户浏览习惯信息。不少关联数据词表都使用片段标识符,因为词表通常用作文档,而片段标识符用于处理文档中的特定术语。

但是,片段标识符也存在一些问题。如果用户要求Web服务器返回关于http://example.com/ cars#porsche的资源信息,会发生什么呢?由于服务器根本无法收到#porsche,它将返回所有汽车的相关信息。有鉴于此,应谨慎使用片段标识符,避免出现无法预知的后果。如果不使用片段标识符,则无需考虑向Web服务器传递哪些信息。

无论URI是否使用片段标识符,均存在相应的合法用例。除非了解选择可能造成的后果,否则在命名资源时最好避免使用片段标识符,但后者不妨在创建词表时使用。图2.3总结了创建URI时需要遵循的一些规则。

关联数据第3原则是“在用户查找URI时提供有用的信息”。该原则将关联数据和相关文档以及万维网上任何与之有关的信息联系起来。在解析Luke的URI(图2.1)时,读者其实已经接触了第3原则在实际中的应用,对吧?如果没有,最好马上尝试一下。由于关联数据的便利性,它要求用户URI是可解析的,而RDF则没有这样的要求。

..\17-1007 改图\0203.tif

图2.3 如何创建自定义URI(来源:Richard Howlett)

关联数据第4原则是“包含指向其他URI的链接”。关联数据并非单纯的数据,它是包含链接的数据。链接是关联数据优于其他结构化数据的原因,它提高了关联数据的灵活性和扩展性。与网页类似,链接越多,关联数据的价值越大。如图2.4所示,藉由在示例图谱中包含其他可解析的URI,关联数据的价值得以提升。通过添加可解析的新URI,我们可以任意扩展图谱读者所能访问的信息。例如,可以为每位作者添加指向其社交媒体账户(如Facebook、LinkedIn和Twitter)的URI。我们还能链接到更多的关联数据。所添加的URI既可以指向其他数据,也可以指向一般的万维网。与第3原则类似,关联数据需要包含指向其他URI的链接,而RDF则没有这样的要求。

..\17-1007 图\0204.tif

图2.4 与网页类似,链接越多,关联数据的价值越大

读者是否还记得第 1 章讨论的关联数据咖啡杯?提供指向其他数据的链接可以将RDF数据从四星提升为五星。创建五星关联数据始终是我们追求的目标。

这一节介绍了如何采用RDF作为数据模型以实现关联数据原则,以及在这些原则的基础上构建RDF。关联数据鼓励使用HTTP URI作为事物名称,RDF则支持使用字符串字面量;关联数据鼓励URI在万维网上可解析,以使网页更有意义;关联数据鼓励链接到其他用户的数据。总而言之,关联数据原则是数据网赖以存在的基础。

2.2 RDF数据模型

这一节将深入探讨RDF。之前曾经介绍过,RDF陈述又称为三元组(triple),它们可以相互连接以形成图谱,我们也讨论过如何采用URI命名主体、谓词和某些客体。接下来,我们将讨论这种数据模型的其他细节。

RDF数据模型定义了三元组各个组件所包含的内容(如URI或字面量),还定义了其他一些重要概念,如利用数据类型或所用的(人类)语言对字面量作出限制。如果将RDF数据模型的某些组件(使用URI命名)划分到不同的类中,就能更容易地发现、搜索或查询这些组件。这一节将介绍RDF数据模型的各种组件,并讨论相应的术语。

2.2.1 三元组

目前所讨论的RDF三元组都很短,但RDF或关联数据并未限制长字面量的使用(用户有时的确会这么做)。通过从DBpedia的倭黑猩猩词条中提取其余数据,很容易就能将第 1 章讨论的倭黑猩猩示例加以扩展。这些数据包括摘要以及采用多种语言编写的注释,其中一些相当冗长。图2.5显示了在示例图谱中采用英文添加的rdfs:comment

..\17-1007 图\0205.tif

图2.5 将一个长字面量添加到倭黑猩猩的示例图谱

但从另一方面讲,应避免使用过长的字面量客体,这在实际中有章可循。大部分RDF数据库(以及普通的数据库)并未针对很长的字面量客体进行优化。一般来说,最好链接到一个包含大量数据的页面,而不是将其置于字面量客体中。不过何种规模的数据才是“大量的”取决于用户。

倭黑猩猩示例的数据全部来自维基百科,但数据来源不必是唯一的。换言之,可以采用多种来源创建RDF图谱。比如在倭黑猩猩示例中添加一个三元组,告诉读者可以从网络生命大百科(Encyclopedia of Life)[5]中查阅更多相关信息。这通过RDF Schema词表中的seeAlso关系实现,其过程如图2.6所示。对客体中的URI进行解析,将跳转到一个描述倭黑猩猩的美观页面。

..\17-1007 图\0206.tif

图2.6 通过rdfs:seeAlso提供指向外部资源的链接

2.2.2 空节点

除URI和字面量之外,RDF陈述的客体也可以是空节点(blank node)。空节点类似于一个没有名称的URI,有时也被称为匿名资源(anonymous resource)。在需要链接到某个信息项的集合但又不希望为此专门创建一个URI时,空节点就能派上用场。

然而,不少用户都避免使用空节点。如果返回的查询结果中包含空节点,之后就无法再次进行查询,从而造成不便。此外,由于空节点没有名称,因此无法被解析。有鉴于此,许多用户在需要时都会选择URI,而完全避免使用空节点。不过读者仍然应对空节点有所了解,因为确有部分用户会使用空节点,读者也可能在处理万维网上的数据时遇到它们。

如图2.7所示,我们采用空节点表示美国圣地亚哥动物园(San Diego Zoo)的地址。动物园有一个URI,但地址本身没有。另一种方案是使用地址信息中的自然键,为地址创建一个URI[6]

某些RDF数据库(以及其他采用SPARQL语言查询RDF的系统)会自动为空节点分配URI,以方便对它们进行操作。这个过程称为斯科伦化(skolemization),定义在RDF规范中[7]

..\17-1007 图\0207.tif

图2.7 采用空节点创建地址

2.2.3 类

通过使用RDFS(RDF Schema)标准定义的rdf:type属性,可以将RDF资源划分到若干个称为类(class)的组中。RDFS是一种RDF词表定义语言(vocabulary definition language),用于创建新的RDF词表。类的成员称为类的实例(instance),与面向对象编程中的实例类似,但两个概念完全不同。RDFS类本身属于RDF资源,其类型为rdfs:Class。可以采用rdfs:subClassOf属性声明某个类是另一个类的子类。另一种RDF词表定义语言是Web本体语言(Web Ontology Language,OWL[8]),后者也可用于定义类。

例如,我们注意到,倭黑猩猩生活在美国的圣地亚哥动物园、哥伦比亚动物园和水族馆(Columbus Zoo and Aquarium)。如图2.8所示,两个动物园的类型为ex:Zoo,后者是http://example.com/Zoo(一个虚构的URI)的缩写,它被指定为rdfs:Class。即便没有在OWL等系统中实现完整的逻辑形式,许多RDF数据库也能识别RDFS类关系。

..\17-1007 改图\0208.tif

图2.8 采用类将资源分组

2.2.4 类型字面量

到目前为止,我们只讨论了由简单字符串构成的RDF字面量,比如人、动物园以及地点的名称。当然,用户可能也需要描述数字、日期或其他数据类型。RDF允许将字面量标记为XML Schema: Datatypes标准[9]定义的任何数据类型。尽管也可以创建自定义的数据类型,但通常不在关联数据中这样处理,因为这会破坏现有系统之间的互操作性。

数据类型的应用如图2.9所示。从图中可以看到,圣地亚哥动物园于1993年4 月 3 日(UTC-8时区)举办了一场名为“Pygmy Chimps at Bonobo Road”的展览。图2.9还显示了空节点的另一种应用。

注意

 

有关XML Schema数据类型的完整列表,请参考W3C网站[10]

..\17-1007 图\0209.tif

图2.9 使用显式数据类型属性

RDF数据模型是关联数据的基础,它定义了数据元素并将各个元素关联在一起,还提供了合并各种来源的数据所需的通用框架。掌握RDF数据模型是理解关联数据工作原理的第一步。

前面已经介绍过,RDF谓词可以将两种事物关联在一起。某些谓词可以划分到词表的分组中。RDF词表的作用与关系数据库中的模式相同,它描述了数据所表示的内容。关联数据词表采用HTTP URI命名,其描述在万维网上是可解析的。下一节将介绍如何理解、查找、使用甚至创建用户自己的词表。

2.3 RDF词表

我们在倭黑猩猩示例中介绍了不少关联数据所用的术语(如foaf:namerdfs:labelvcard:locality),它们组合在一起构成了RDF词表。例如,rdfs:labelrdfs:commentrdfs:seeAlso等术语定义在RDF Schema词表[11]中,该词表有一个和前缀rdfs:关联的URI。与之类似,vcard:localityvcard:regionvcard:country-name等术语定义在vCard词表[12]中,该词表有一个和前缀vcard:关联的URI。

RDF词表提供了数据网所需的模式。与关系数据库中的模式类似,RDF词表包含术语定义,用于描述数据元素之间的关系。不同的是,RDF词表分布在万维网上,由全球各地的用户创建和维护。如果很多用户都选择某个RDF词表,它就会在关联数据中得到广泛应用。

任何用户都能创建RDF词表,也确实有相当多的用户是这样做的。不过这可能导致灾难性的后果:如果关联数据包含之前从未出现过的术语,其他用户将无法重用关联数据。可以采用两种方案解决这个问题,一种是技术层面的,即确保定义关联数据词表本身的URI遵循关联数据原则;另一种是社会层面的,即尽可能重用现有的词表。

RDF词表使用可解析的HTTP URI并提供描述词表的有用信息,用户“按图索骥”就能找到应用新术语所需的信息。

重用现有词表能确保在大部分常见的用例中,大部分用户将使用大部分常见的词表。这是一种社会契约,或许应作为一条附加的关联数据原则予以遵循。

某些词表在实践中被反复使用,它们逐渐演变为描述关联数据的重要工具,我们将其称为核心词表(core vocabulary)。另一些词表用于表达特定的信息,它们的使用频率没有核心词表高,我们将其称为权威词表(authoritative vocabulary)。这一节将讨论这两种词表,并给出它们的URI。

图2.10总结了重用现有词表时应遵循的最佳实践方针。

..\17-1007 图\0210.tif

图2.10 尽可能重用词表(来源:Richard Howlett)

2.3.1 通用词表

在关联数据中,人物、项目、Web资源、出版物以及地址通常是首先描述的客体。用户也可能希望将现有的分类法(taxonomy)或其他分类体系迁移到RDF词表中。定义这些术语的词表有时也称为核心RDF词表。

核心RDF词表如图2.11所示。对最常见的一些关联数据类型建模时,可以使用相应的核心词表。

..\17-1007 改图\0211.tif

图2.11 核心词表(来源:Richard Howlett)

如果某些词表对一些常见的客体进行建模并被广泛接受,这些词表将成为权威词表。这样的例子如图2.12所示,包括销售产品、地理位置和地名、书目信息、许可、在线社区和社交网络、复合数字对象等数据。

..\17-1007 图\0212.tif

图2.12 权威词表(来源:Richard Howlett)

总而言之,读者可以通过图2.11和图2.12快速查找最常用的RDF词表。如果没有找到所需的词表,请参考表2.2。

表2.2列出了关联数据中最常用的一些RDF词表,包括它们的首选短前缀、命名空间URI以及用途。尽管这些词表无法涵盖实际中可能遇到的所有词表,但对于本章的学习已经足够,且有助于读者理解公共万维网中出现的大部分关联开放数据。

注意

 

LODStats项目整理了一些最常用词表的统计数据[13]

表2.2 核心RDF词表与其他通用RDF词表

名  称

前  缀

命名空间URI

描  述

机场本体

air:

http://www.daml.org/2001/10/html/airport-ont#
(原链接已失效)

最近的机场

BIBO

bibo:

http://purl.org/ontology/bibo/

参考书目

Bio

bio:

http://purl.org/vocab/bio/0.1/

传记资料

ccREL(知识共享权利表达语言)

cc:

https://creativecommons.org/ns#

许可

DOAP

doap:

http://usefulinc.com/ns/doap#

项目

都柏林核心元素(Dublin Core Element)

dc:

http://purl.org/dc/elements/1.1/

出版物

都柏林核心术语(Dublin Core Term)

dct:

http://purl.org/dc/terms/

出版物

FOAF

foaf:

http://xmlns.com/foaf/0.1/

人物

Geo

pos:

http://www.w3.org/2003/01/geo/wgs84_pos#

位置(position)

GeoNames

gn:

http://www.geonames.org/ontology#

位置(location)

GoodRelations

gr:

http://purl.org/goodrelations/v1#

产品

ORE(对象重用与交换)

ore:

http://www.openarchives.org/ore/terms/

资源映射

RDF

rdf:

http://www.w3.org/1999/02/22-rdf-syntax-ns#

核心框架

RDFS

rdfs:

http://www.w3.org/2000/01/rdf-schema#

RDF词表

SIOC

sioc:

http://rdfs.org/sioc/ns#

在线社区

SKOS

skos:

http://www.w3.org/2004/02/skos/core#

受控词表

vCard

vcard:

http://www.w3.org/2006/vcard/ns#

名片

VoID

void:

http://rdfs.org/ns/void#

词表

Web本体语言(OWL)

owl:

http://www.w3.org/2002/07/owl#

本体

WordNet

wn:

http://xmlns.com/wordnet/1.6
(原链接已失效)

英语单词

XML Schema Datatypes

xsd:

http://www.w3.org/2001/XMLSchema#

数据类型

如果仍然找不到所需的词表,请尝试在Sindice[14]上搜索相关术语。Sindice是一个语义网搜索引擎,用于搜索术语并查找定义这些术语的词表(Sindice是一个意大利语单词,发音为“sindee’cheh”,但“e”不发音)。

如果还是找不到所需的词表,不必担心,请继续阅读下面的内容。

2.3.2 自定义词表

藉由RDF和关联数据,任何用户可以对任何内容进行描述。而创建自定义词表并使其在万维网上可解析,对RDF和关联数据而言至关重要。这可以近乎无限地扩展术语的数量,从而在万维网扩展的同时也让RDF描述的规模得以扩展。

在倭黑猩猩示例中,我们讨论过一个名为ex:Zoo的自定义词表术语。URI ex:(http://example.com)存在的唯一目的是告诉用户可以在示例中放心地使用这个术语,既不用担心它丢失,也不用担心许多用户不经过协调就在同一个命名空间中定义相互冲突的术语。http://example.com可以用于任何示例,但切记不要使用这个URI发布实际的词表。

通过搜索Sindice,可以将ex:Zoo转换为一个真正的关联数据术语。搜索后会发现,DBpedia(毫无疑问)已经为“动物园”定义了一个术语[15]。因此,我们可以将ex:Zoo的所有实例替换为dbpedia:The_Zoo。如果一时找不到可用的词表,在发布自定义词表之前,应放置占位符(placeholder)并查找是否已有相关的术语存在。

如果无法在现有词表中找到一个术语来替换占位符中的术语,就需要构建新的词表,并在其中创建术语。例如,我们希望创建一个RDF三元组,用于描述“倭黑猩猩的味道闻起来像旧袜子”。显然,现有词表中不大可能存在这样一个主观的术语。我们所需的RDF三元组应该类似于dbpedia:Bonobo ex:smellsLike ex:OldSocks。接下来,我们需要为ex:smellsLikeex:OldSocks创建真正的术语,并创建一个包含这些术语的词表文档,然后将其发布出去。

应将术语ex:OldSocks设置为RDFS类,因为今后我们也可能希望创建其他事物的类,用于描述“动物的味道闻起来像什么”。很容易就能将RDFS类转换为OWL类,因此创建二者并不复杂。术语ex:smellsLike用作谓词,因此可能最适合作为RDFS属性。

我们同样需要创建一个前缀以替换ex:。由于词表与气味有关,我们选择odor:作为前缀。

最后,我们需要一个URI以发布新创建的词表。只要能将信息发布到所定义的空间,URI的名称无关紧要。我们使用http://linkeddatadeveloper.com/ns/odor#作为URI,注意它仅供演示使用。

最终的词表如清单2.1所示。现在,唯一要做的就是通过我们设置的URI[16]发布该文档。如果读者希望在万维网上发布这个文档,请修改HTTP权限中的DNS域(并在需要时修改路径)以及文档中与前缀odor:相关联的URI。

清单2.1 自定义RDF词表(Turtle格式)

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix odor: <http://linkeddatadeveloper.com/ns/odor#> .
# Classes
odor:OldSocks a rdfs:Class, owl:Class ;
rdfs:label "Old socks" ;
  rdfs:comment "The odor associated with old socks or bonobos." .

# Properties
odor:smellsLike
     rdf:type rdf:Property ;
     rdfs:label "smells like" ;
     rdfs:comment "Relates an arbitrary subject to a class that identifies an
➥    odor." .

注意

 

可以使用SpecGen[17]为词表生成美观的HTML文档。OWL-Doc、LODE与Parrot也是不错的工具。

词表发布后,我们有时会发现,其他用户也创建了一个非常类似甚至完全相同的术语。修改所有术语并非易事,其他词表发布者也不一定能让词表保持在发布状态。这时该如何处理呢?解决方案其实并不复杂,只需发布一个RDF三元组,声明两个术语的含义相同即可。用于关联两个术语的谓词是owl:sameAs

假设我们创建了一个名为odor:smellsLike的谓词,它和其他某个词表中的术语smells:like完全相同。那么,只要在万维网中发布一个内容为odor:smellsLike owl:sameAs smells:like的RDF三元组即可。无论哪个用户收到了这个三元组,都能了解odor:smellsLikesmells:like具有相同的含义。

SameAs.org[18]收集了大量owl:sameAs三元组。在创建自己的词表或发布新的owl:sameAs三元组之前,应养成在SameAs.org中搜索的习惯。

如果希望精通RDF词表的创建,应考虑与他人合作。Richard Cyganiak是一名词表创建专家,他在2011年发表的Creating an RDF vocabulary: Lessons learned一文[19]中阐述了处理词表时应遵循的方针。

2.4 关联数据所用的RDF格式

RDF是一种数据模型而非数据格式。许多格式都能将RDF数据以及关联数据序列化,这一节将讨论其中最常用的4种格式。

之所以存在不同的RDF格式,是因为不同的系统具有不同的“原生”格式。此外,客户端系统(如电话和浏览器)希望尽可能减少计算量,以方便获得原生格式并作进一步处理。例如,Web开发人员通常倾向于使用JSON,因为JavaScript能提供完善的库支持,而在XML技术上投入巨大的企业则更青睐XML格式。

这一节将讨论以下4种格式:

  • Turtle:一种简单且人类可读的格式;
  • RDF/XML:用于XML的原始RDF格式;
  • RDFa:HTML属性中嵌入的RDF格式;
  • JSON-LD:针对Web开发人员的新格式。

需要注意的是,所有RDF格式都表示RDF数据模型中的数据,它们是可互换的。无论哪种格式的数据都能被解析为RDF,不同格式的数据也可以在单个RDF图谱中相互合并。这种灵活性使得用户可以选择自己最熟悉的格式,并在需要时利用工具将数据转换为其他格式。

我们以倭黑猩猩示例中的两个RDF三元组为例,说明它们在4种RDF格式中的表示方法。<http://dbpedia.org/resource/San_Diego_Zoo> rdfs:label "San Diego Zoo"@enand dbpedia:Bonobo rdf:type dbpedia-owl:Mammal.两个三元组分别表示“‘圣地亚哥动物园’的英文名为‘San Diego Zoo’”和“倭黑猩猩是哺乳动物”。

这一节将从较高层次上讨论RDF格式,帮助读者熟悉它们的用法。

读者能否从不同格式的倭黑猩猩示例中找出所有RDF陈述呢?在学习每种格式时,请尝试找出几条陈述。

2.4.1 Turtle:人类可读的RDF

对大部分用户而言,Turtle是最容易阅读的一种RDF格式,也是多数语义网和关联数据开发人员经常使用的格式。“Turtle”是“Terse RDF Triple Language”的简称。

图2.13显示了经过抽象的两个示例三元组,它们均采用Turtle格式。请读者观察主体、谓词和客体,了解Turtle格式的原理。

可以看到,最简单的Turtle格式就是按出现的顺序对主体、谓词、客体的直接映射。每条陈述后跟一个句点(.)以标记它的结束。

使用前缀URI时,通常在文件开头对前缀进行声明。不过前缀也可以出现在文件中的任何位置,只要在使用前进行声明即可。

..\17-1007 改图\0213.tif

图2.13 采用Turtle格式表示的RDF三元组

清单2.2显示了完整的倭黑猩猩示例数据(Turtle格式)。请注意,前缀声明出现在清单的开头。

清单2.2 倭黑猩猩示例数据(Turtle格式)

@prefix dbpedia: <http://dbpedia.org/resource/> .
@prefix dbpedia-owl: <http://dbpedia.org/ontology/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix ex: <http://example.com/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix vcard: <http://www.w3.org/2006/vcard/ns#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

dbpedia:Bonobo
    rdf:type    dbpedia-owl:Eukaryote , dbpedia-owl:Mammal ,        ←---“倭黑猩猩是哺乳动物”三元组的位置
dbpedia-owl:Animal ;
    rdfs:comment "The bonobo, Pan paniscus, previously called the pygmy
     chimpanzee and less often, the dwarf or gracile chimpanzee, is a great
     ape and one of the two species making up the genus Pan; the other is Pan
     troglodytes, or the common chimpanzee. Although the name \"chimpanzee\"
     is sometimes used to refer to both species together, it is usually
     understood as referring to the common chimpanzee, while Pan paniscus is
     usually referred to as the bonobo."@en ;
    foaf:depiction <http://upload.wikimedia.org/wikipedia/commons/a/a6/
     Bonobo-04.jpg> ;
    foaf:name    "Bonobo"@en ;
    rdfs:seeAlso <http://eol.org/pages/326448/overview>
.

<http://dbpedia.org/resource/San_Diego_Zoo> rdfs:label "San Diego Zoo"@en ;   ←---“圣地亚哥动物园标记”三元组的位置
    <http://semanticweb.org/wiki/Property:Contains> dbpedia:Bonobo ;
    vcard:adr _:1 ;
    dbpedia:Exhibit _:2 ;
    a ex:Zoo
.

<http://dbpedia.org/resource/Columbus_Zoo_and_Aquarium> rdfs:label "Columbus
     Zoo and Aquarium"@en ;
    <http://semanticweb.org/wiki/Property:Contains> dbpedia:Bonobo ;
    a ex:Zoo
.

_:1 vcard:locality "San Diego" ;
    vcard:region "California" ;
    vcard:country-name "USA"
.

_:2 rdfs:label "Pygmy Chimps at Bonobo Road"@en ;
    <http://dbpedia.org/property/dateStart> "1993-04-03-08:00"^^xsd:date ;
    <http://semanticweb.org/wiki/Property:Contains> dbpedia:Bonobo
.

ex:Zoo a rdfs:Class .

我们也可以使用经过简化的Turtle格式,从而不必列出每个三元组的所有组件。“倭黑猩猩是哺乳动物”三元组的简化格式是dbpedia:Bonobo rdf:type dbpedia-owl:Mammal,它可能出现在Turtle文档中。清单2.2将各个组件加以分解,因此主体dbpedia:Bonobo可以应用于其他三元组。如果三元组仅有客体不同,可以使用逗号(,)将客体隔开,如dbpedia:Bonobo rdf:type dbpedia-owl:Eukaryote, dbpedia-owl:Mammal, dbpedia-owl:Animal。此外,可以使用分号(;)将仅共享同一个主体的三元组隔开。不难看到,在清单2.2中的第一个陈述块中,所有三元组都共享主体dbpedia:Bonobo

空节点由以下划线(_)和冒号(:)开头的“临时”标识符表示(与清单2.2中的“_:1”相同)。所有能解析Turtle文件的软件或系统都将丢弃这种标识符,并替换为本地空标识符。请读者观察清单2.2,找出示例RDF中使用的两个空节点。

在Turtle格式中使用@base指令能进一步简化URI。@base定义了一个基准URI(base URI),文档中所有的相对URI(relative URI)引用将附加到该基准URI之后,以构成完整的URI。例如,在清单2.2中,我们可以采用基准URI(@base <http://example.com/> .)替换ex:词表命名空间(@prefix ex: <http://example.com/> .),然后使用相对URI替换所有对ex:词表的引用。这种情况下,我们将ex:Zoo改为相对URI:<Zoo>

注意

 

有关Turtle格式的详细信息,请参考W3C网站[20]

2.4.2 RDF/XML:企业所用的RDF

RDF/XML是最早的一种RDF序列化格式。遗憾的是,由于XML自身的格式化和标准化较为复杂,RDF/XML给用户造成了很大的困惑。近年来,RDF/XML的应用逐渐减少,不过由于存在许多可用的XML工具,这种RDF序列化格式仍有一定价值。

如果企业已部署了基于XML的基础设施,则需要对RDF/XML予以特别关注。

图2.14显示了采用RDF/XML格式的两个示例三元组。读者可能会首先注意到XML标签的存在(位于尖括号中),且三元组可以被拆分成标签、标签属性和内容。

..\17-1007 图\0214.tif

图2.14 采用RDF/XML格式表示的RDF三元组

为便于理解,可以将RDF/XML格式视为一系列头尾相连的RDF三元组:主体(位于标签中)后跟谓词(位于标签中),谓词后跟客体URI(位于标签中)或客体字面量(位于标签的内容中)。每当客体成为主体时,这种模式都会重复。

进一步观察“倭黑猩猩是哺乳动物”三元组可以发现,它实际上违反了我们刚刚讨论的模式:三元组的主体位于XML属性rdf:about中,谓词是隐含的,客体URI由标签本身给出。这给相当一部分用户造成了困惑。这个三元组中的谓词是一种特殊的谓词rdf:type,之前的示例曾对它进行过特殊处理,即采用Turtle格式中的a替换rdf:type

在开放的XML标签中,只要将URI的前缀定义为XML命名空间,就能使用前缀URI。严格来说,这种形式的前缀称为限定名(QName),XML开发人员或相关规范中可能会提到这个术语。与Turtle格式中使用的前缀命名方案类似,限定名也是为了缩短URI以方便阅读。需要注意的是,限定名的冒号后必须跟一个有效的XML元素(标签)名。

图2.14所示的第2个三元组更具代表性,因为它包含一个额外的三元组。可以看到,第1个标签是<ex:Zoo>,后者添加了一个“额外”的三元组,声明圣地亚哥动物园是ex:Zoo类的一个实例。按理说,示例中不应该出现这个额外的三元组,不过为便于理解,我们有意将其列出。解决这个问题的方法是为主体增加一个标签dbpedia:San_Diego_Zoo

请读者观察清单2.3,看能否从倭黑猩猩示例中找到更多采用RDF/XML格式的三元组。如有必要也可以参考清单2.2。清单中的三元组采用Turtle格式,更方便阅读。

清单2.3 倭黑猩猩示例数据(RDF/XML格式)

<?xml version="1.0"?>
<rdf:RDF xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
     xmlns:dbpedia="http://dbpedia.org/resource/" xmlns:xsd="http://
     www.w3.org/2001/XMLSchema#" xmlns:foaf="http://xmlns.com/foaf/0.1/"
     xmlns:vcard="http://www.w3.org/2006/vcard/ns#" xmlns:ex="http://
     example.com/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:dbpedia-owl="http://dbpedia.org/ontology/" xmlns:wiki="http://
     semanticweb.org/wiki/" xmlns:property="http://dbpedia.org/property/">
    <dbpedia-owl:Eukaryote rdf:about="http://dbpedia.org/resource/Bonobo">
        <rdf:type rdf:resource="http://dbpedia.org/ontology/Mammal" />    ←---“倭黑猩猩是哺乳动物”三元组
        <rdf:type rdf:resource="http://dbpedia.org/ontology/Animal" />
        <rdfs:comment xml:lang="en">The bonobo, Pan paniscus, previously
     called the pygmy chimpanzee and less often, the dwarf or gracile
     chimpanzee, is a great ape and one of the two species making up the
     genus Pan; the other is Pan troglodytes, or the common chimpanzee.
     Although the name "chimpanzee" is sometimes used to refer to both
     species together, it is usually understood as referring to the common
     chimpanzee, while Pan paniscus is usually referred to as the bonobo.</
     rdfs:comment>
        <foaf:depiction rdf:resource="http://upload.wikimedia.org/wikipedia/
     commons/a/a6/Bonobo-04.jpg" />
        <foaf:name xml:lang="en">Bonobo</foaf:name>
        <rdfs:seeAlso rdf:resource="http://eol.org/pages/326448/overview" />
    </dbpedia-owl:Eukaryote>
    <ex:Zoo rdf:about="http://dbpedia.org/resource/San_Diego_Zoo">
        <rdfs:label xml:lang="en">San Diego Zoo</rdfs:label>    ←---“圣地亚哥动物园标记”三元组
        <wiki:Property:Contains rdf:resource="http://dbpedia.org/resource/
     Bonobo" />
        <vcard:adr vcard:locality="San Diego" vcard:region="California"
     vcard:country-name="USA" />
        <dbpedia:Exhibit>             ←---展览描述三元组
            <rdf:Description>
                <rdfs:label xml:lang="en">Pygmy Chimps at Bonobo Road</
     rdfs:label>
                <property:dateStart rdf:datatype="http://www.w3.org/2001/
     XMLSchema#date">1993-04-03-08:00</property:dateStart>
                <wiki:Property:Contains rdf:resource="http://dbpedia.org/
     resource/Bonobo" />
            </rdf:Description>
        </dbpedia:Exhibit>
    </ex:Zoo>
    <ex:Zoo rdf:about="http://dbpedia.org/resource/
     Columbus_Zoo_and_Aquarium">
        <rdfs:label xml:lang="en">Columbus Zoo and Aquarium</rdfs:label>
        <wiki:Property:Contains rdf:resource="http://dbpedia.org/resource/
     Bonobo" />
    </ex:Zoo>
    <rdfs:Class rdf:about="http://example.com/Zoo" />
</rdf:RDF>

RDF/XML也可以定义一个基准URI来简化URI,这通过在靠近命名空间声明的rdf:RDF标签中使用xml:base指令实现。为采用基准URI替换ex:命名空间,需要用基准声明(如xml:base="http://example.com")替换ex:命名空间声明(xmlns:ex="http://example.com/")。

注意

 

有关RDF/XML格式的详细信息,请参考W3C网站[21]

2.4.3 RDFa:嵌入HTML网页的RDF

万维网主要由文档构成,而不只是其中包含的结构化数据。我们倾向于在非结构化文本中包含本身就是数据元素的事物,如电话号码、地址、人名甚至产品描述。如果能在网页中标记这些元素,就可以将它们提取为结构化数据。RDFa的作用就在于此。“RDFa”是“RDF in (HTML) Attributes”的缩写,意为“(HTML)属性中的RDF”。

RDFa文档本质上属于HTML,只是比后者多了一些标记。通过修改某个HTML页面的DOCTYPE声明,RDFa解析器可以快速判断该页面是否值得解析,以及HTML属性能否在解析页面时提供创建RDF三元组所需的信息。表2.3列出了网页所用的DOCTYPE声明可以包含的RDFa。

表2.3 RDFa的DOCTYPE标头

文 档 类 型

HTML DOCTYPE声明

RDFa 1.0

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3. org/MarkUp/DTD/xhtml-rdfa-1.dtd">

XHTML1+RDFa 1.1

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.1//EN" "http://www.w3. org/MarkUp/DTD/xhtml-rdfa-2.dtd">

HTML+RDFa 1.1 或 XHTML5+RDFa 1.1

<!DOCTYPE html> 或找到的任何其他 DOCTYPE

观察图2.15的示例三元组,可以看到嵌入HTML的RDFa。如果Web浏览器不支持RDFa,它将忽略任何无法识别的HTML属性,并从<span>Here are some things we know about Bonobos</span>开始处理。而支持RDFa的系统将显示完全相同的文本,但也会提供RDF三元组dbpedia:Bonobo rdf:type dbpedia-owl:Mammalresource属性提供主体,而特殊的typeof属性提供rdf:type谓词。第2个三元组显示了如何使用property属性提供谓词。

..\17-1007 图\0215.tif

图2.15 采用HTML+RDFa格式表示的RDF三元组

与其他格式一样,RDFa也提供了简化URI的方法,后者称为CURIE(Compact URI Expression,紧凑URI表达)。严格来说,CURIE属于RDF/XML限定名的扩展,因为它支持冒号后面的部分使用无效XML元素名的值。CURIE是限定名的超集(superset)。

RDFa既能用于搜索引擎优化(SEO),也能用于几大搜索引擎力推的Schema.org方案。这是因为搜索引擎可以借助RDFa来强化其搜索结果。例如,在搜索某部电影时,结果中可能会显示放映时间和评论链接;在搜索某个产品时,结果中可能会出现相应的价格。这些信息可能来自RDFa。

开发人员可以使用RDFa.info提供的工具[22]或类似工具从HTML中提取RDFa。例如,将清单2.4中的代码输入RDFa Play[23],就能从倭黑猩猩示例中恢复RDF陈述。

读者能否从清单2.4中找出圣地亚哥动物园举办的倭黑猩猩展览的日期?

清单2.4 倭黑猩猩示例数据(HTML+RDFa格式)

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.1//EN" "http://www.w3.org/
     MarkUp/DTD/xhtml-rdfa-2.dtd">
<html xmlns='http://www.w3.org/1999/xhtml'>
    <head>
        <base href='' />
        <title>
            Stuff we know about bonobos
        </title>
    </head>
    <body>
        <p>
            <span resource='http://dbpedia.org/resource/Bonobo'
     typeof='http://dbpedia.org/ontology/Eukaryote http://dbpedia.org/
     ontology/Mammal          ←---“倭黑猩猩是哺乳动物”三元组
     http://dbpedia.org/ontology/Animal'><span>Here are some things we know
     about <span lang='en' property='http://xmlns.com/foaf/0.1/name'
     xml:lang="en">Bonobos</span>:</span> <span lang='en' property='http://
     www.w3.org/2000/01/rdf-schema#comment' xml:lang="en">The bonobo, Pan
     paniscus, previously called the pygmy chimpanzee and less often, the
     dwarf or gracile chimpanzee, is a great ape and one of the two species
     making up the genus Pan; the other is Pan troglodytes, or the common
     chimpanzee. Although the name "chimpanzee" is sometimes used to refer to
     both species together, it is usually understood as referring to the
     common chimpanzee, while Pan paniscus is usually referred to as the
     bonobo.</span> <span>Bonobos are mammalian animals and are thus also
     eukaryotes.</span> <span><img src='http://upload.wikimedia.org/
     wikipedia/commons/a/a6/Bonobo-04.jpg' property='http://xmlns.com/foaf/
     0.1/depiction' /></span> <span>More information may be found at <a
     href='http://eol.org/pages/326448/overview' property='http://www.w3.org/
     2000/01/rdf-schema#seeAlso'>the bonobo entry at the Encyclopedia of
     Life</a></span></span>
        </p>
        <p>
            Some zoos that contain bonobos include:
        </p>
        <ul>
            <li>
                <span resource='http://dbpedia.org/resource/
     Columbus_Zoo_and_Aquarium' typeof='http://example.com/Zoo'><span
     lang='en' property='http://www.w3.org/2000/01/rdf-schema#label'
     xml:lang="en">Columbus Zoo and Aquarium</span><span rel='http://
     semanticweb.org/wiki/Property:Contains' resource='http://dbpedia.org/
     resource/Bonobo'>&nbsp;</span></span>
            </li>
            <li>
                 <span resource='http://dbpedia.org/resource/San_Diego_Zoo'
     typeof='http://example.com/Zoo'><span lang='en' property='http://
     www.w3.org/2000/01/rdf-schema#label' xml:lang="en">    ←---“圣地亚哥动物园标记”三元组
     San Diego Zoo</span> <span rel='http://www.w3.org/2006/vcard/ns#adr'
     resource='_:1'>which is located in <span property='http://www.w3.org/
     2006/vcard/ns#locality'>San Diego</span>, <span property='http://
     www.w3.org/2006/vcard/ns#region'>California</span>, <span
     property='http://www.w3.org/2006/vcard/ns#country-name'>USA</span>.</
     span><span rel='http://semanticweb.org/wiki/Property:Contains'
     resource='http://dbpedia.org/resource/Bonobo'>&nbsp;</span><span
     rel='http://dbpedia.org/resource/Exhibit' resource='_:2'>The main bonobo
     exhibit is called <span lang='en' property='http://www.w3.org/2000/01/
     rdf-schema#label' xml:lang="en">Pygmy Chimps at Bonobo Road</span>. It
     has been at the San Diego Zoo since <span content='1993-04-03-08:00'
     datatype='http://www.w3.org/2001/XMLSchema#date' property='http://
     dbpedia.org/property/dateStart'>Saturday, 03 April 1993</span>.<span
     rel='http://semanticweb.org/wiki/Property:Contains' resource='http://
     dbpedia.org/resource/Bonobo'>&nbsp;</span></span></span>
             </li>
        </ul>
    </body>
</html>

注意

 

有关RDFa格式的详细信息,请参考W3C网站[24]和RDFa.info[25]

2.4.4 JSON-LD:JavaScript开发者所用的RDF

似乎每个Web开发人员都了解JSON(JavaScript Object Notation,JavaScript对象表示法),且所有主流的编程语言都有多个可以解析JSON的库。在关联数据社区中,经常听到的一句话是“为什么不把数据放入JSON”?

人们之所以青睐RDF,是因为它很容易就能与其他来源的RDF数据进行组合。如果希望合并数据,就需要使用某种RDF序列化格式。“JSON-LD”的全称为“JSON for Linking Data”(用于关联数据的JSON),它是JSON中使用的一种RDF序列化格式。

关联数据社区希望JSON-LD既能方便开发人员读写JSON,也能为合并万维网上的数据提供帮助。

图2.16显示了JSON-LD格式的示例三元组。代码开头的客体@context定义了前缀,接下来的代码都可以使用经过简化的URI(与其他RDF格式类似)。

..\17-1007 图\0216.tif

图2.16 采用JSON-LD格式表示的RDF三元组

此外,客体@graph定义了RDF三元组。其中@id用于标识RDF主体,而@type用于标识特殊的rdf:type谓词。其他谓词用引号括起来,如图2.16中的rdfs:label

无论采用哪种形式的JSON,注意不要混淆方括号([ ])和花括号({ })。花括号中的内容是客体,而方括号中的内容是数组。因此,图2.16中的@type是只包含一个类(dbpedia-owl:Mammal)的数组,不过它也可以包含更多的类。RDF客体是JSON对象,可能包含URI、由@value表示的字面量以及数据类型或语言信息(可选)。

读者能否从清单2.5中找出表示倭黑猩猩的图片?如果遇到困难,请留意以.jpg结尾的URI。

清单2.5 倭黑猩猩示例数据(JSON-LD格式)

{
  "@context": {
    "foaf": "http://xmlns.com/foaf/0.1/",
    "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
    "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
    "vcard": "http://www.w3.org/2006/vcard/ns#",
    "xsd": "http://www.w3.org/2001/XMLSchema#"
  },
  "@graph": [
    {
      "@id": "_:t0",
      "vcard:country-name": "USA",
      "vcard:locality": "San Diego",
      "vcard:region": "California"
    },
    {
      "@id": "_:t1",
      "http://dbpedia.org/property/dateStart": {
        "@type": "xsd:date",
        "@value": "1993-04-03-08:00"
      },
      "http://semanticweb.org/wiki/Property:Contains": {
        "@id": "http://dbpedia.org/resource/Bonobo"
      },
      "rdfs:label": {
        "@language": "en",
        "@value": "Pygmy Chimps at Bonobo Road"
      }
    },
    {
      "@id": "http://dbpedia.org/resource/Bonobo",
      "@type": [
        "http://dbpedia.org/ontology/Eukaryote",
        "http://dbpedia.org/ontology/Mammal",          ←--- “倭黑猩猩是哺乳动物”三元组
        "http://dbpedia.org/ontology/Animal"
      ],
      "foaf:depiction": { "@id": "http://upload.wikimedia.org/wikipedia/
     commons/a/a6/Bonobo-04.jpg" },
      "foaf:name": {
        "@language": "en",
        "@value": "Bonobos"
      },
      "rdfs:comment": {
        "@language": "en",
        "@value": "The bonobo, Pan paniscus, previously called the pygmy
      chimpanzee and less often, the dwarf or gracile chimpanzee, is a great
      ape and one of the two species making up the genus Pan; the other is Pan
      troglodytes, or the common chimpanzee. Although the name \"chimpanzee\"
      is sometimes used to refer to both species together, it is usually
      understood as referring to the common chimpanzee, while Pan paniscus is
      usually referred to as the bonobo."
        },
        "rdfs:seeAlso": {
          "@id": "http://eol.org/pages/326448/overview"
        }
      },
      {
        "@id": "http://dbpedia.org/resource/Columbus_Zoo_and_Aquarium",
        "@type": "http://example.com/Zoo",
        "http://semanticweb.org/wiki/Property:Contains": {
          "@id": "http://dbpedia.org/resource/Bonobo"
        },
        "rdfs:label": {
          "@language": "en",
          "@value": "Columbus Zoo and Aquarium"
        }
      },
      {
        "@id": "http://dbpedia.org/resource/San_Diego_Zoo",
        "@type": "http://example.com/Zoo",
        "http://dbpedia.org/resource/Exhibit": { "@id": "_:t1" },
        "http://semanticweb.org/wiki/Property:Contains": {
          "@id": "http://dbpedia.org/resource/Bonobo"
        },
        "rdfs:label": {
          "@language": "en",
          "@value": "San Diego Zoo"     ←---“圣地亚哥动物园标记”三元组
        },
        "vcard:adr": { "@id": "_:t0" }
      }
    ]
}

注意

 

有关JSON-LD格式的详细信息,请参考W3C网站[26]和JSON-LD.org[27]

2.5 与Web服务器和关联数据发布有关的问题

如果希望万维网上发布的关联数据被其他用户重用,就需要为某些Web浏览器提供额外的支持,以便浏览器能正确显示关联数据的内容。开发人员和用户都应注意这些问题。这一节将介绍实际开发中所用的技术,Web服务器可以藉此向Web浏览器(或其他类型的客户端)通知正在处理的关联数据类型,以便客户端决定如何呈现这些数据。这通过HTTP的Content-Type标头实现。

图2.17显示了实际的工作流程。Web浏览器向服务器请求一个路径为/data/dave.ttl的URL,服务器找到该文件并将其成功回送(这就是200 OK状态码的含义)。依照惯例,text/turtle的Content-Type标头与文件扩展名.ttl相匹配,这种Content-Type已在互联网号码分配机构(IANA)注册。空行之后的标头之后为文件内容。

..\17-1007 图\0217.tif

图2.17 简化的HTTP会话,显示了Content-Type标头

关联数据的Content-Type标头依据所用的具体格式而有所不同。本书的大部分示例均使用适合RDF处理的Turtle格式,其Content-Type标头为text/turtle。而具有XML背景的用户(特别是企业开发人员)可能使用较早的RDF/XML格式,其Content-Type标头为application/rdf+xml。

注意

 

HTTP Content-Type又称MIME类型。“MIME”是“Multipurpose Internet Mail Extensions(多用途互联网邮件扩展)”的缩写,它是一种将多媒体邮件附件(如图片、视频或Office文档)编码为纯文本的技术,以便于邮件传输。在HTTP传输过程中,万维网采用相同的机制对多媒体进行编码。

接下来,我们将详细讨论其他格式。RDFa是一种将关联数据嵌入到网页中的技术。从表2.4可以看出,由于数据被埋入HTML,因此RDFa并没有自己的Content-Type标头,而HTML页面的Content-Type标头为text/html。Web客户端负责确定网页中是否存在嵌入的RDFa。

我们也可以采用JSON-LD发布JSON格式的关联数据。JSON-LD文件的首选Content-Type标头是application/ld+json;由于JSON-LD是JSON的一种形式,也可以使用application/json作为Content-Type标头。

表2.4 关联数据的Content-Type标头

RDF格式

首选Content-Type标头

备选Content-Type标头

RDF Turtle文件

text/turtle

 

RDF/XML文件

application/rdf+xml

 

RDFa

text/html

 

JSON-LD文件

application/ld+json

application/json

OWL文件

application/owl+xml

application/rdf+xml

N-Triples

application/N-Triples

text/plain

OWL是一项用于知识表示(knowledge representation)的W3C标准,它采用形式化的方法描述信息比特之间的逻辑关系。OWL有时也用于关联数据网,它基于RDF,能与其他关联数据无缝对接。OWL文件一般采用XML编写,使用application/owl+xml或application/rdf+xml作为Content-Type标头,二者并无太大差别。如果使用application/owl+xml,建议采用不同的方法来解释数据,以便推断某些信息。有关两种标头之间的细微差别,请参考OWL规范[28]。受篇幅所限,本书不对OWL作深入讨论。

最后,我们介绍N-Triples格式。它是最简单的RDF格式,但很少在自动化测试或批量数据传输(数据转储)以外的领域使用。N-Triples的首选Content-Type标头是application/N-Triples,不过之前也曾使用过text/plain(纯文本格式)。

注意

 

截至2015年,JSON-LD和N-Triples的首选Content-Type标头尚未正式采用,但预计将很快获批。建议读者将application/ld+json和application/N-Triples作为二者的首选标头,以便文件能匹配其他用户所用的Content-Type标头。不过也要注意到,相当数量的服务目前仍然使用备选(旧有)Content-Type标头。

2.6 文件类型与Web服务器

一般来说,Web服务器会自动提供合适的Content-Type标头。用户无需告知Web服务器如何处理PNG/JPEG图片或HTML页面,因为服务器通常都默认支持这些文件类型。然而,大部分Web服务器尚未提供对RDF Content-Type标头的默认支持。用户经常需要自己配置Web服务器(或请求系统管理员的协助),以支持关联数据的Content-Type标头。

如果Web服务器配置不当,它将采用默认的Content-Type标头处理文件,通常为text/plain(纯文本格式)或普适的application/octet-stream(二进制格式)。这种情况下,由于Web客户端无法获得必要的信息,就难以决定如何处理关联数据的内容。如果Content-Type为text/plain,大部分浏览器将以文本格式显示内容;如果Content-Type为application/octet-stream,浏览器通常会提示用户保存文件。也就是说,Content-Type标头不合适会导致Web浏览器无法确定采用哪种方式处理文件。为避免出现问题,需要正确配置Web服务器以处理关联数据的Content-Type标头。

2.6.1 如何配置Apache服务器

为正确处理关联数据,最简单的办法是为Web服务器配置合适的Content-Type标头。无需担心,这并没有想象中的困难。需要添加的指令如清单2.6所示。

清单2.6 关联数据Content-Type标头的Apache服务器指令

# Directives to ensure RDF files are served as the appropriate Content-Type
AddType text/turtle .ttl
AddType application/rdf+xml .rdf
AddType application/ld+json .jsonld
AddType application/N-Triples .nt

可以将这些指令添加到Apache服务器实例的httpd.conf文件、vhost(虚拟主机)配置文件或.htaccess文件中。

注意

 

上述指令将文件扩展名映射给Content-Type标头。这意味着用户需要使用列出的文件扩展名,才能保证Content-Type正确无误。例如,如果希望使用清单2.6中的指令,则所有Turtle格式的文件名必须以.ttl结尾,所有JSON-LD格式的文件名必须以.jsonld结尾。

如果需要,也可以为给定的Content-Type标头创建多个文件扩展名,不过最好始终采用一种文件扩展名。

注意

 

2008年,W3C发布了一份名为Best Practice Recipes for Publishing RDF Vocabularies的文档[29],该文档详细列出了使用Apache HTTP服务器发布RDF内容时的注意事项,包括如何构建数据的URI、利用同一个URL发布RDF和HTML文档、使用PURL(持久化URL)等。

2.7 对Apache服务器的控制有限时如何处理

如果无法直接对Apache服务器进行配置该怎么办呢?尽管可以使用2.6节讨论的.htaccess文件,但只有当服务器管理员允许用户覆盖AddType指令时才能对该文件进行操作。好在不少网络托管提供商允许用户对Apache进行一定限度的配置,这一般通过名为cPanel的管理界面来实现。cPanel是一种开源软件,被不少托管服务所采用。如果用户具有访问cPanel的权限以配置Web服务器,就可以选择将Apache处理程序与文件扩展名关联在一起。

默认安装的一个Apache处理程序是用于发送文件的mod_asis,以这种方式发送的文件包含由空行隔开的HTTP标头。用户可以借此强制Web服务器发送任何所需的HTTP标头,包括一些特定的Content-Type。如果希望使用text/turtle作为Content-Type标头来处理dave.ttl文件(位于\data目录),只需配置mod_asis来处理扩展名为.ttl的文件,并将相应的HTTP标头添加到dave.ttl文件中。上述操作如清单2.7所示。

清单2.7 将HTTP标头添加到Apache mod_asis处理的文件中

Content-Type: text/turtle

@prefix foaf: <http://xmlns.com/foaf/0.1/> .

<http://3Roundstones.com/dave/#me>
  a foaf:Person .

...

注意

 

清单2.7中的空行是有意为之。与邮件类似,在as-is文件中,必须用空行将HTTP标头和文档正文隔开。此外,在Turtle文件中,前缀和文档其余部分之间也经常会插入空行。但这并非强制要求,只是为了增强可读性。

如果将mod_asis和某个包含自定义HTTP标头的文件(具有映射扩展名)进行合并,则文件的其余部分将采用指定的标头进行处理。这种情况下,通过普通的网络托管服务,就能从任何希望使用的URL返回合适的Content-Type标头。

2.8 关联数据平台

当然,并非一定要使用Apache或某种特定的Web服务器,我们可以选择任何一种关联数据平台或语义网产品来处理数据(如Turtle、RDF/XML、RDFa、JSON-LD、OWL以及N-Triples),它们提供了处理这些内容所需的Content-Type标头。

第 9 章将介绍Callimachus,后者是一种开源关联数据管理系统。有关其他解决方案的详细信息,请参考SemanticWeb.org[30]和W3C网站[31]

2.9 小结

本章介绍了RDF以及它和关联数据之间的关系。我们重点讨论了关联数据原则,它们对RDF的应用作出了进一步的规定,以便万维网上的数据能更紧密地连接在一起。这一章还介绍了RDF数据模型,以及实际开发中可能用到的重要概念。

此外,我们讨论了4种RDF序列化格式。Turtle是最简单且最符合人类阅读习惯的格式,也是大部分关联数据开发人员使用的首选格式。RDF/XML是第1种RDF格式,目前仍然被广泛应用于企业内部和熟悉XML的程序员。如果希望将RDF嵌入网页以描述HTML中的文本内容,RDFa将是最佳方案。如果Web开发人员熟悉处理JSON格式的结构化数据,则JSON-LD是一个不错的选择。

本章还讨论了RDF词表的查找和使用,包括如何处理两个词表中含义相同的术语,以及创建自定义词表的方法。此外,本章对确定何时需要查找或创建术语的过程也有所涉及。

本章最后介绍了与文件类型和Web服务器有关的一些常见问题以及相应的解决方案。开发人员和用户都应注意这些问题。


[1] 2013年,RDF规范1.1将统一资源标识符(Uniform Resource Identifier,URI)调整为国际化资源标识符(Internationalized Resource Identifier,IRI)。在本书中,当提到URI或IRI时,它们通常表示相同的含义,二者的区别可以忽略不计。如果读者有疑问,请记住,当前的RDF和关联数据采用IRI这个术语。

[2] 参见https://www.w3.org/standards/techs/rdf#w3c_all(原链接跳转至此)。

[3] 如http://paulsbakery.example.com/984d6a。

[4] 如http://paulsbakery.example.com/baked_goods/bread/rye-12。

[5] 一个免费的、由各国生物学家合作编撰的百科全书项目,旨在记录地球上全部190万个物种的信息,该项目于2008年2月正式启动。——译者注

[6] 如http://example.com/address/usa/california/san_diego(采用可控的DNS域)。

[7] 参见RDF 1.1 Concepts and Abstract Syntax:https://www.w3.org/TR/rdf11-concepts/。

[8]  “OWL”这个缩写来自小熊维尼故事中的角色猫头鹰(Owl),它将自己的名字错拼为“WOL”。

[9] 参见https://www.w3.org/TR/xmlschema-2/。

[10] 参见https://www.w3.org/TR/xmlschema11-2/。

[11] 从https://www.w3.org/2000/01/rdf-schema#下载。

[12] 从https://www.w3.org/2006/vcard/ns#下载。

[13] 参见http://stats.lod2.eu/vocabularies。

[14] 2014年5月,创始团队宣布停止对Sindice提供支持,Sindice.com目前已无法访问。——译者注

[15] 参见http://dbpedia.org/page/The_Zoo。

[16] 即http://linkeddatadeveloper.com/ns/odor#。

[17] 参见https://github.com/specgen/specgen。

[18] 参见http://sameas.org/。

[19] 参见http://richard.cyganiak.de/blog/2011/03/creating-an-rdf-vocabulary/。

[20] 参见https://www.w3.org/TR/turtle/。

[21] 参见https://www.w3.org/TR/rdf-syntax-grammar/。

[22] 参见http://rdfa.info/tools。

[23] 参见http://rdfa.info/play/。

[24] 参见https://www.w3.org/TR/rdfa-primer/。

[25] 参见http://rdfa.info/。

[26] 参见https://www.w3.org/TR/json-ld-syntax/。

[27] 参见http://json-ld.org/。

[28] 参见https://www.w3.org/2001/sw/wiki/OWL#specs(原链接跳转至此)。

[29] 参见https://www.w3.org/TR/swbp-vocab-pub/。

[30] 参见http://semanticweb.org/wiki/Tools.html(原链接跳转至此)。

[31] 参见https://www.w3.org/2001/sw/wiki/Tools。

目录

相关技术