写点什么

面向资源的架构:信息,而非容器

  • 2010-08-20
  • 本文字数:11981 字

    阅读完需:约 39 分钟

介绍

万维网因其主要的使用体验集中于文档而被认为是文档网络。就文档本身而言,数千年来,我们一直使用其代表的组织原则进行信息管理。该系列文章主要关注构建数据网络,在此过程中,我们一定不要忽视文档作为数据源的观点。在早期的 HTML 文档中,我们通过百般努力方能从页面上提取内容,但这一个过程如此苦痛和脆弱,以至于我们中的多数人认为这只是西西弗斯式的徒劳而将其放弃了。[译者注:西西弗斯,希腊神话中科林斯的国王,因其绑架死神而闻名,后被众神惩罚,神祇们处罚薛西弗斯,叫他不停地把一块巨石推上山顶去,由于它本身的重量,巨石又从山顶上滚下来。他们认为没有更可怕的处罚比得过从事徒劳无功和毫无希望的工作。后被阿尔贝·加缪塑造为一个悲剧式的英雄。]。尤其是如何在页面中展现信息,根本就无标准可言,这使得在该领域的努力更加徒劳。随着新技术的不断涌现,在网络上为可提取内容进行编码变得越来越容易了。在以后的文章中,我们会着眼于那些可以从无结构的信息中提取出结构化信息的技术。目前,我们将重点关注制作者如何提高文档的机器可处理性。

微格式

虽然大多数人在屏幕抓取上灰头土脸、败下阵来,但是一个意志坚定的社区却脱颖而出,她对于在文档中编码语义内容的前景被忽视甚为不满。因而,微格式得以作为一种小规模、目标明确、特定领域的命名规则而创立,它可以将特定类型的数据织入 HTML 中。日历、评论、人员、组织和提纲,这些都是使用它描述实际的,有用的信息的例子。提倡者很清楚这些努力首先是面向人的,其次才是机器。他们并不想要任何专用工具,或者新的语言,亦或是任何对大型语义网络显而易见的修饰。这其实是一个语义化网络的努力。

这里我们看看 hReview,它是一种围绕电影评论进行表述的微格式。hReview 特有的部分加粗表示。请注意,它并不遵从某种命名规则,看起来它与标签设计师和 Web 开发者已经习惯的用法极为相像。

复制代码
<div class="<strong>hreview</strong>">
<span class="<strong>reviewer vcard</strong>">
<span class="<strong>fn</strong>">O. Dinn</span>,
<abbr class="<strong>dtreviewed</strong>" title="20100412">April 12th, 2010</abbr>
</span>
<div class="<strong>item</strong>">
<a lang="en" class="<strong>url fn</strong>" href="http://www.imdb.com/title/tt0800369/">Thor</a>
</div>
<div>Rating: <span class="<strong>rating</strong>">5</span> out of 5</div>
<div class="<strong>description</strong>">
<p>Better than "Iron Man"!.</p>
</div>
</div>

小目标往往更易于实现,但其带来的收益通常也不大。因此,微格式一直在特定领域里收获有限的成功。然而,它们的限制使其无法满足那些有着更多需求的大社区。就各种微格式而言,并不存在统一的数据模型。虽然每种单独的格式都有各自的软件库来解析和提取信息,但却无法将不同的格式联系在一起。同时,对构建实体和关系的全局引用也无能为力,所有事情都聚焦于文档域的内容。而且也没有命名空间来防止偶然的命名冲突。

多数微格式的开发者对这些大问题的解决毫无兴趣,也不关心微格式立刻应用在更大的场景中。好在群组一直保持活跃,并且在这一主题上有一本非常受欢迎的新书刚刚出版。不过,这些成功刺激了人们去寻求可以受益于这种数据编码方法的更宽泛的解决方案。好消息是,支持更大的场景变得更容易了,同时,我们能将微格式社区已经贡献的财富收归己用。

GRDDL

需要解决的首要问题之一是:如何从使用微格式编码的页面中一致地获取语义内容。一种办法是使用称之为“从方言中采撷资源描述(GRDDL)”的技术。这个方法对不同的文档格式有更广泛的适用性,就(X)HTML 而言,其工作方式如下:为了向客户端指示某个页面中包含可提取的内容,文档要使用 GRDDL 的元数据概要(profile)信息进行自我标识:

复制代码
<head profile="http://www.w3.org/2003/g/data-view">

元数据概要由 HTML 4 引入,其目的是为了让作者向客户端提供一种或多种文档查看或分类的方法。在这里,它指的是,当客户端发现该概要时,它会预期在元素内发现一个或多个元素,每个元素都有一个 transformation 类型的 rel 属性。这些链接指向了将用来从文档中提取特定元数据的 XSLT 样式单的位置。

复制代码
<link rel="transformation" href="http://www.w3.org/2003/12/rdf-in-xhtml-xslts/grokFOAF.xsl" />
<link rel="transformation" href="http://www.w3.org/2003/12/rdf-in-xhtml-xslts/grokCC.xsl" />
<link rel="transformation" href="http://www.w3.org/2003/12/rdf-in-xhtml-xslts/grokGeoURL.xsl" />

我们这里看到的是可用来提取 Dubin Core 的出版元数据、 Creative Commons 的许可信息、以及地理位置信息等的链接。客户端可以自由地决定他们将采用哪个转换(transformation):查找已知的样式单还是简单地全部都用。为了解其实际工作情况,让我们看一个规范的 GRDDL 页面, Joe Lambda’s Homepage 。这里看到的是人类可阅读的版本:

但我们也可以注意到隐藏其背后的元数据:

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<<strong>head profile="http://www.w3.org/2003/g/data-view"</strong>>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Joe Lambda's Home page [an example of RDF in XHTML]</title>
<link rel="schema.DC" href="http://purl.org/dc" />
<link rel="meta" type="application/rdf+xml" title="FOAF"
href="http://www.w3.org/2000/06/webdata/xslt?xslfile=
http%3A%2F%2Fwww.w3.org%2F2003%2F11%2Frdf-in-xhtml-processor;xml
file=http%3A%2F%2Fwww.w3.org%2F2003%2F12%2Frdf-in-xhtml-xslts%2Fcomplete-example.html"
/>
<strong><meta name="DC.Title" xml:lang="en" lang="en"<br></br> content="Joe Lambda Home page as example of RDF in XHTML" /><br></br> <meta name="DC.Creator" content="Joe Lambda" /><br></br> <meta name="DC.Description" xml:lang="en" lang="en"<br></br> content="home page for the infamous Joe Lambda, with the purpose of demonstrating how to mix <br></br> several RDF vocabularies in XHTML"</strong>
/>
<strong><meta name="DC.Publisher"<br></br> content="W3C - World Wide Web Consortium - http://www.w3.org" /><br></br> <link rel="transformation" href="http://www.w3.org/2003/12/rdf-in-xhtml-xslts/grokFOAF.xsl" /><br></br> <link rel="transformation" href="http://www.w3.org/2003/12/rdf-in-xhtml-xslts/grokCC.xsl" /><br></br> <link rel="transformation" href="http://www.w3.org/2003/12/rdf-in-xhtml-xslts/grokGeoURL.xsl" /><br></br> <link rel="transformation" href="/2000/06/dc-extract/dc-extract.xsl" /><br></br> <link rel="transformation" href="/2000/08/w3c-synd/home2rss.xsl" /></strong>
<link rel="stylesheet" href="/StyleSheets/base" />
<link rel="stylesheet" type="text/css" href="/QA/2002/12/qa4.css" />
<strong><meta name="ICBM" content="39.2975, -94.71388888888889" /></strong>
</head>
<body>
<div class="<strong>foaf-person</strong>">
<h1>Joe Lambda's homepage</h1>
.
.
.

这里展示了从这个页面提取的信息。这个链接指向的服务会获取一个连接上述文档的引用,并将它发现的XSLT 样式单应用其上。注意:一些浏览器(我告诉你,就是Safari)在处理这些内容时表现的不佳。如果结果看上去不像正确的RDF/XML,那就试试Firefox 或者其它浏览器。

这个方法要求文档制作者遵循XSLT 样式单所期望的命名规范。一旦完成,无论何种客户端,在获取页面时都可以发现链接并进行转换。GRDDL 即可以与RDF 编码的数据协同工作,也可以与微格式数据亲密合作,这些微格式数据能够动态转换成RDF 数据。我们可以使用RDF 的开放扩展数据模型将来自不同编码的信息汇聚成相同的输出模型。HTML 5 已经舍弃了profile 属性。取而代之的是一种新机制,以用来表明存在可用于GRDDL 的内容。GRDDL 的其余机制仍将继续发挥作用。

然而,问题依旧存在,每种样式单都定义了各自的规范来表述其信息。由于这样和那样的原因,语义网社区为在文档中编码丰富的元数据寻找了一种通用的解决方案,RDFa 应运而生。

HTML 5 包含的微数据( microdata )是一种比微格式更通用的语义标签方法。由于它与 RDFa 的范围并不一致,而且它仍在开发之中,所以我们目前不打算关注它。

RDFa

RDFa 是将资源描述框架(RDF)模型编码到结构化文档中的标准方法。虽然我们在这篇文章中仅关注XHTML,但对于 HTML 5 SVG 、甚至是开放文档格式(ODF)都有大量的建议规范和指导作用。

RDFa 最初是作为 W3C 的注释由 Mark Birbeck 提出的,自诞生以来它已经成为了 W3C 的正式建议,得到快速发展。当然,并非没有批评的声音,但规范的新版本在保持向后兼容性的基础上正在努力尝试解决这些问题。

RDFa 指定了下述属性类型来编码 RDF 内容:

属性 描述 @rel 资源之间的关系 @rev 反向关系 @content 机器可读的内容(文字) @href URI (资源对象) @src URI (嵌入式兑现) @about 主题定义 @property 主题—值的关系 @resource 不可点击的资源的关系 @datatype 数据类型的关系 @typeof RDF 类型 / 实例的关系让我们看看如何着手将一些信息编码到一个 XHTML 示例文件中。在这个例子中,通过一个页面记录了某个会议的信息。它的信息即包含了会议什么时候举办、在哪里举办、也有谁将参加、以及为什么我们要关注它等信息。

这个人类可读的页面(以及它简朴的风格)使我们可以直观的得到我们需要的信息,但如果打算用软件来提取这些信息,我们就需要用某种方式来对它进行编码。作为开始,我们需要定义文档类型以及将在整个文档中使用的所有 XML 命名空间前缀。接下来我们将会看到,其它作用于文档某些部分的命名空间可本地化到文档的某个特定部分。

复制代码
<?xml version="1.0" encoding="UTF-8"?>
"-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd"</strong>>
<html <strong>xmlns</strong>="http://www.w3.org/1999/xhtml" lang="en"
<strong>xmlns:rdf=</strong>"http://www.w3.org/1999/02/22-rdf-syntax-ns#"
<strong>xmlns:rdfs=</strong>"http://www.w3.org/2000/01/rdf-schema#"
<strong>xmlns:dc=</strong>"http://purl.org/dc/terms/"
<strong>xmlns:xsd=</strong>"http://www.w3.org/2001/XMLSchema#"
<strong>xmlns:foaf=</strong>"http://xmlns.com/foaf/0.1/"
<strong>xmlns:cal=</strong>"http://www.w3.org/2002/12/cal/icaltzd#">
<head>
<title>QCon Tokyo 2010</title>
</head>
.
.
.

我们已经介绍了一系列标准的前缀映射(XHTML、RDF 和 RDFS),也介绍了用来描述机器可处理的方法中事件的词汇。除了已定义的词汇(如,都柏林核心),我们也为朋友之友(Friend-of-a-Friend)日历信息定义了词汇。之所以定义前缀,是因为URI 和URL 非常难用。我们不想将又长又累赘的数据返回给客户端,或者强制开发者和设计人员一遍又一遍的输入这些数据。因此,初始的 RDFa 规范选择使用称为 CURIE 的紧凑符号系统来表示 URI。

下一步是指定一个讨论主题。由于文档中可能会描述很多主题,所以对于这些主题的引入位置必须小心谨慎。它们是分级的,而且如果不注意的话,你很可能会干涉某个已存在的主题。为了声明一个新主题,我们将使用 about 属性。

复制代码
<body>
<div <strong>about="http://qcontokyo.com#qcontokyo2010"</strong> <strong>typeof="cal:Vevent"</strong>>
<p>Please join us at
<a <strong>property="cal:summary"</strong> href="http://qcontokyo.com">QCon Tokyo 2010</a> to be held at
<span <strong>property="cal:location">Tokyo Midtown Conference Center</strong></span>
from <span <strong>property="cal:dstart" datatype="xsd:date">2010-04-19</strong></span> to
<span <strong>property="cal:dtend" datatype="xsd:date">2010-04-20</strong></span>.
</p>
</div>
.
.
.

最终,我们获得了一个标准 XHTML 和 RDF 元数据的混合物。我们首先就是把主题的 URL—— http://qcontokyo.com#qcontokyo2010——标识为一个主题。接下来,我们通过使用属性 typeof="cal:Vevent"来表明主题的类型。这等价于下列 RDF:

复制代码
<http://qcontokyo.com#qcontokyo2010> rdf:type cal:Vevent .

换句话说,(该文档的)URL 指向某个 Vevent 的事物。至此,我们已经描述了一个 RDF 事实(fact)——这到底是在做什么呢?我们已经用片段标识符来表示“Qcon 东京 2010 这一概念”。也许来年仍会使用同样的 URL,但用于表述 QCon 东京 2011 的事实(fact)将会与现在的不同。另外,网页本身并不是一个事实,它只是被人们用来描述事件而已。就主题而言,文档的 URL 可能不是一个合适的选择。我们在以后的文章里将会介绍其他处理这种差异的方法。现在,我们将继续使用片段标识符

接下来的事实使用 property 属性来表示已定义的主题标识与值之间的关系。如果我们不得不为了人和机器而复制重复,那将是一个既浪费又愚蠢的办法,因此,我们尽力为这两个消费者仅表示一次数据。RDFa 解析器会从 property 属性所附属的元素的文本节点(text node)中将值取出来。现在,我们得到了第二个事实。

复制代码
<http://qcontokyo.com#qcontokyo2010> cal:summary "QCon Tokyo 2010" .

谓词 cal:location 使用了基本相同的方式来表示事实。现在我们来做点有趣的事——发布包含数据类型的事实。在这个例子里,我们打算表示事件的开始和结束日期。我们不仅要使用关系 cal:dstart 和 cal:dtend,还要指明对象的文本值应该解释为“xsd:date”类型。解析后,RDFa 解析器将产生像这样的结果:

复制代码
<http://qcontokyo.com#qcontokyo2010> <http://www.w3.org/2002/12/cal/icaltzd#dstart>
"2010-04-19"^^<http://www.w3.org/2001/XMLSchema#date> .
<http://qcontokyo.com#qcontokyo2010> <http://www.w3.org/2002/12/cal/icaltzd#dtend>
"2010-04-20"^^<http://www.w3.org/2001/XMLSchema#date> .

我们当然期望能够更多地表示与事件本身相关的信息,但估计我们顶多只能变着花样使用我们所学的知识。如果想要增加其它词汇,你只需简单地设置适当的前缀映射就可以了。再让我们介绍一些新的主题和结构。为了吸引人们参加会议,我们需要激起他们对演讲者的兴趣。假如演讲者有一些吸引人的著作,我们应该突显这些事实。

复制代码
<div>
<p>You will hear from:
<ul>
<li <strong>resource="urn:ISBN:0596517742"</strong>>
<span rel=<strong>"dc:creator"><br></br> <a href="http://qcontokyo.com/speaker_DouglasCrockford.html#doug"</strong>
<strong>typeof="foaf:Person" property="foaf:name">Douglas Crockford</strong></a>
</span>, author of <span <strong>property="dc:title">"JavaScript: The Good<br></br> Parts"</strong>
</span>
</li>
<li <strong>resource="urn:ISBN:0201633612"</strong>>
<span rel=<strong>"dc:creator"><br></br> <a href="http://qcontokyo.com/speaker_ErichGamma.html#erich"</strong>
<strong>typeof="foaf:Person" property="foaf:name">Erich Gamma</strong></a>
</span>, author of <span <strong>property="dc:title">"Design Patterns : <br></br> Elements of Reusable Object-Oriented Software"</strong>
</span>
</li>
<li <strong>resource="urn:ISBN:0978739213"</strong>>
<span rel=<strong>"dc:creator"><br></br> <a href="http://qcontokyo.com/speaker_MichaelNygard.html#mike"</strong>
<strong>typeof="foaf:Person" property="foaf:name">Mike Nygard</strong></a>
</span>, author of <span <strong>property="dc:title">"Release It!"</strong>
</span>
</li>
</ul>
</p>
</div>

我们使用 resource 属性介绍了三个新主题。因为我们选择了它们的 URN 来进行标识,所以对于每一本书都有一个有效的 URI 来唯一地标识它,但又不会被人点击到。另一方法是链接到一个在线图书经销商或者出版商的页面。应该注意到,每个

  • 元素仅使用一个东西界定其范围。这里,我们选择使用书籍,而不是作者来作为主题的目的是让主题应用于它下面的整个层次范围。而后续定义的任何属性将应用新引入的主题,而不是上面的事件。在表示著作权时,我们使用了 dc:creator 关系。

    我们也使用作者的个人会议页面来标识他们。每个演讲者都有一个页面,并且彼此不同。处于相同的原因,即一个页面并不是一个演讲者。所以,对于演讲者,我们仍旧使用片段标识。

    我们最后要讨论的是如何标识文档自身的创作共用许可。我们不再谈论事件或者其声名斐然的作者,而是关注实际的文档问题。这里,我们使用如下的代码块来标识版权由谁维护,与页面关联的许可权,以及当人们要使用页面的某些章节时,需要如何声明其出处。

    复制代码
    <div id="foot">
    <a rel=<strong>"license"</strong> href="http://creativecommons.org/licenses/by-nc/3.0/us/">
    <img alt="Creative Commons License" style="border-width:0"
    src="http://i.creativecommons.org/l/by-nc/3.0/us/88x31.png" />
    </a>
    <br/>
    This document, <span xmlns:dc="http://purl.org/dc/elements/1.1/"
    <strong>property="dc:title">QCon Tokyo 2010<</strong>/span>, by <strong><a <br></br> xmlns:cc="http://creativecommons.org/ns#" href="http://bosatsu.net"<br></br> property="cc:attributionName" rel="cc:attributionURL">Brian Sletten</a</strong>>
    is licensed under a <a rel=<strong>"license"<br></br> href="http://creativecommons.org/licenses/by-nc/3.0/us/"</strong>>Creative Commons
    Attribution-Noncommercial 3.0 United States License</a>.
    </div>
    </body>
    </html>

    注意,可以在任意块中引入新的命名空间前缀,例如这里就是页脚。如果文档的其它地方没有创作共用方面的内容,就没有必要为整个文档添加相应的前缀。RDFa 的目的之一就是让文档的各个部分从元数据的角度看是自包含的。未来的工具将能为拷贝和粘贴的文档部分提取出相应的元数据。

    提取

    我们已经为整个文档做了标记,那么要怎么提取它呢?需要使用 RDFa 解析器。虽然不同语言都有若干可用的解析器,但我们将使用Damian Steer 的 Java RDFa 解析器,因为它非常简单。首先,把该文件保存到本地。然后下载解析器,并使用如下的命令来运行它:

    java -jar java-rdfa-0.4-SNAPSHOT.jar qcon.html

    请使用你实际下载的版本,并将其指向你所命名的文件。在运行之后,你应该看到所有 RDF 事实都打印出来了(每个相关主题也被显示地召集起来了)。

    复制代码
    <http://qcontokyo.com/> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>
    <http://www.w3.org/2002/12/cal/icaltzd#Vevent> .
    <http://qcontokyo.com> <http://www.w3.org/2002/12/cal/icaltzd#summary>
    "QCon Tokyo 2010" .
    <http://qcontokyo.com/> <http://www.w3.org/2002/12/cal/icaltzd#location>
    "Tokyo Midtown Conference Center" .
    <http://qcontokyo.com/> <http://www.w3.org/2002/12/cal/icaltzd#dstart>
    "2010-04-19"^^<http://www.w3.org/2001/XMLSchema#date> .
    <http://qcontokyo.com/> <http://www.w3.org/2002/12/cal/icaltzd#dtend>
    "2010-04-20"^^<http://www.w3.org/2001/XMLSchema#date> .
    <http://qcontokyo.com/speaker_DouglasCrockford.html#doug> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>
    <http://xmlns.com/foaf/0.1/Person> .
    <urn:ISBN:0596517742> <http://purl.org/dc/terms/creator>
    <http://qcontokyo.com/speaker_DouglasCrockford.html#doug> .
    <http://qcontokyo.com/speaker_DouglasCrockford.html#doug> <http://xmlns.com/foaf/0.1/name>
    "Douglas Crockford" .
    <urn:ISBN:0596517742> <http://purl.org/dc/terms/title>
    "\"JavaScript: The Good Parts\"" .
    <http://qcontokyo.com/speaker_ErichGamma.html#erich> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>
    <http://xmlns.com/foaf/0.1/Person> .
    <urn:ISBN:0201633612> <http://purl.org/dc/terms/creator>
    <http://qcontokyo.com/speaker_ErichGamma.html#erich> .
    <http://qcontokyo.com/speaker_ErichGamma.html#erich> <http://xmlns.com/foaf/0.1/name>
    "Erich Gamma" .
    <urn:ISBN:0201633612> <http://purl.org/dc/terms/title>
    "\"Design Patterns : Elements of Reusable Object-Oriented Software\"" .
    <http://qcontokyo.com/speaker_MichaelNygard.html#mike> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>
    <http://xmlns.com/foaf/0.1/Person> .
    <urn:ISBN:0978739213> <http://purl.org/dc/terms/creator>
    <http://qcontokyo.com/speaker_MichaelNygard.html#mike> .
    <http://qcontokyo.com/speaker_MichaelNygard.html#mike> <http://xmlns.com/foaf/0.1/name>
    "Mike Nygard" .
    <urn:ISBN:0978739213> <http://purl.org/dc/terms/title>
    "\"Release It!\"" .
    <file:///Users/brian/Dropbox/Documents/Writing/InfoQ/ROA-3/qcon.html> <http://www.w3.org/1999/xhtml/vocab#license>
    <http://creativecommons.org/licenses/by-nc/3.0/us/> .
    <file:///Users/brian/Documents/Writing/InfoQ/ROA-3/qcon.html> <http://purl.org/dc/elements/1.1/title>
    "QCon Tokyo 2010" .
    <file:///Users/brian/Documents/Writing/InfoQ/ROA-3/qcon.html> <http://creativecommons.org/ns#attributionURL>
    <http://bosatsu.net> .
    <file:///Users/brian/Documents/Writing/InfoQ/ROA-3/qcon.html> <http://creativecommons.org/ns#attributionName>
    "Brian Sletten" .
    <file:///Users/brian/Documents/Writing/InfoQ/ROA-3/qcon.html> <http://www.w3.org/1999/xhtml/vocab#license>
    <http://creativecommons.org/licenses/by-nc/3.0/us/> .

    我们已经很容易地从这个页面得到了许多有用信息。这种事情对于浏览器、代理服务器(proxy)或者其它理解 HTTP 协议的代理(agent)都是相当简单的。然而,我们无需等到这样的支持被加入后才开始设想使用这些信息。我们可以将 RDFa 的扩展代码包装成一个服务。W3C 使用了 RDFa 蒸馏器,它是由 Python 实现的,如果你经常使用,可以把它下载到本地执行。目前,我们用该文档的网络版来调用这个服务:

    http://www.w3.org/2007/08/pyRdfa/extract?uri=http%3A%2F%2Fbosatsu.net%2Fqcon.html&format=pretty-xml&warnings=false&parser=lax&space-preserve=true

    这个 URL 指向一个服务,该服务以一个 URL 为数据源,并将提取到的信息以 RDF 文档的形式返回。因此,可以通过上面的 URL 对这个生成的 RDF 文档进行网络寻址。

    为了理解其重要性,我们必须回想一下从该系列文章所学的知识。在第一篇文章中,我们了解到 REST 的 URL 命名规范和内容协商如何让我们以统一的方式来访问文档、数据和服务。在第二篇文章里,我们学习了 RDF 的术语和概念以及如何查寻 RDF 数据源。将这些合到一起(包括我们用指向服务的 URL 来从文档中提取内容),我们便可以使用 SPARQL 查寻作为数据库的文档,现在就能够将文档纳入我们的工作流了。设想我们要查找页面中提到的每个作者的名字和对他们著作的索引。当使用复合 URL,下面的 SPARQL 将完成这个工作:

    复制代码
    PREFIX foaf: <http://xmlns.com/foaf/0.1/>
    PREFIX dc: <http://purl.org/dc/terms/>
    select ?name ?title where {
    ?book dc:creator ?author ;
    dc:title ?title .
    ?author foaf:name ?name .
    }

    通过 Leigh Dodd 的 SPARQL 工具 Twinkle ,可以看到这个问题的答案:

    要完全理解这个新能力意味着什么可能需要一些时间,但我们鼓励你为此深思熟虑一番。

    多年来,批评者一直嘲笑愿意按这一方式标注内容的人们,但在接下来的部分,我们将会看到,他们完全错了。另外,如果通过程序来生成页面,你会充满希望的发现,发布织入这些属性的 XHTML 来促进机器的可处理能力是多么得简单。

    试想一下,如果一个报告中的科学或财务数据是可以直接提取的。“就这个报告中显示的本季度市场上的顶级制造企业,对于每个公司,你可以在我们的数据库中进行查询,看看他们在过去的表现”。你的组织越是致力于使用 REST, RDF 和 RDFa,这样的查寻就越强大,也会越简单。

    网上

    如果这仅仅是语义网工具箱里的一个花哨的新工具,那么即便它颇具威力,它也不是人们急切需要的。如果看一下 RDFa 是如何被采纳的,以及早期对其好处的分析,我们就会明白这为什么如此重要。

    • 首先,主流的开源软件,如 Drupal MediaWiki ,都已开始对 RDFa 提供直接的支持。
    • 美国英国的政府均采用这种方式发布大量数据。(这方面,英国是赢家)
    • O’Reilly 已经开始用 RDFa标注其所有的目录以及良好关系词汇。
    • 大型零售商,如 Tesco BestBuy ,也将良好关系和 RDFa 用于其产品和商铺的页面上。特别是 BestBuy,他们已经看到采用这些技术后所产生的流量骤然增加。当然,将其仅仅归因于 RDFa 元数据是草率的,但至少 RDFa 元数据是一个贡献因素,而且其他人也开始观察到类似的上升。
    • Google 已开始用微格式和 RDFa 为涉及大众、评论以及视频内容的词汇建立索引
    • Yahoo 在 Search Monkey 上的工作正在为如何扩展对其它元数据类型的支持添砖加瓦。
    • 网络上的歌曲和其它内容正在使用创作共用来标识其版本信息。

    要想理解创作共用在这方面是如何创新的,我们可以回顾一下会议页面,来看看我们是如何在页脚标识版本信息的。如果直接点击当前页面上的版本链接,你会得到一个有关版本定义的通用描述。

    然而,如果你是通过会议页面的网络访问版来点击该链接,那边你会看到一些独特的东西:

    发生了什么?!?

    当你点击链接时,创作共用服务器会得到一个到 HTTP Referrer 的引用。接着,它会从该访问来源(referrer)获取内容、解析、然后提取与版本信息有关的任何东西。如果发现了有关信息,它就会基于这些信息生成特定的响应。在我们的例子里,是我们提供的属性名和 URL。

    事实上,我们在链接里提供元数据,然后其他服务器据此给出响应。这样,链接就不再仅仅是链接了。你获得的响应依赖于你是通过那个“门”过来的。查询参数曾经在某些方面给予了我们这样的能力,但是从基于拉动的观点来看,我们应当可以响应任何输入,而不仅仅是那些我们所要求他们输入的。我们正在接受任意的、可全局解析的元数据。

    展望

    RDFa 1.0 赢得了很多人的热捧,但仍有一些批评意见。一些人非常担心命名空间的分级作用域以及 CURIE 的使用。在一个命名空间中得以解析的元素,由于自身的移动或者其它命名空间的抢先,它可能会被解析(或者是无法解析)。虽然更好地使用工具对此有所帮助,但 RDFa 1.1 也希望借助在属性中使用全限定的术语引用来解决一些问题。

    RDFa 工作组正将 RDFa 1.1 拆分成几个部分,包括了 Core、API 和使用文档。他们为来年制定了一份大胆的进度表,好在是,进展迅速。2010 年 4 月 15 日,工作组同意发布 RDFa Core 1.1 和 XHTML+RDFa 1.1 修改。这其中包含了多种方法以用来表示前缀映射、xmlns 前缀的过期提示、关于 RDFa 概括(RDFa Profiles)的想法和其它更多东西。一些新的属性被用来支持这些功能:

    属性 描述 @vocab 建立缺省的词汇表 @prefix 建立前缀映射 @profile 制定 RDFa 概要(profiles) 无论作为生产者还是消费者,这样的技术都是非常令人兴奋的。链接标识相关性,当你赋予内容更多的关联,它就获得了更多的相关性。我们由搜索排名入手来了解它的好处,但现在,我们也可以着手跨站点聚合信息了。排名信息不再需要由一个站点来维护(这会导致向不当影响收费),而是可以由多个位置收集得出。

    尽管,这里主要的进步不过是文档成为了又一种数据源。但是,网络让我们忘掉了计算机,转而关注文档。而语义网络又使我们关注于信息,而不是信息的容器。同样的 SPARQL 查询所能包含的内容可以来自于关系数据库、REST 服务、本地 RDF 三元组仓库(triplestores)、以及如今的文档。我们共享给他人的编码信息对于软件来说也不再是不可以访问的了。虽然我们需要更好的工具和支持才能充分利用这些新兴技术,但这已经成为一个何时发生的问题,而不是是否会发生的问题了。

    结语

    就在我刚刚把这篇文章提交 InfoQ 发布后不久,F8 会议举办,Facebook 在会议上放出消息,他们正在“基于 RDFa”将类似语义网的元数据编入HTML 。很明显,他们正打算拥有所有这些关系,但总的来说,这将作为这些概念的很好证明。就分布式创新为什么如此牛逼, Ben Adida 给出了一个富有思想的回答。

    另外,W3C 发布了 XHTML 模块化 RDFa 1.1 并正在收集反馈。 Ivan Herman 发起了一个有价值的讨论,来探讨哪些是新的,以及有哪些不同。

    以上这些都强调了本文的主题的流行,并且映衬了我原文中最后一句话所表达的必然性:“这已经成为一个何时发生的问题,而不是是否会发生的问题了。”

    查看英文原文: Resource-Oriented Architecture: Information, Not Containers


    感谢马国耀对本文的审校。

    给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家加入到 InfoQ 中文站用户讨论组中与我们的编辑和其他读者朋友交流。

  • 2010-08-20 00:007899

    评论

    发布
    暂无评论
    发现更多内容

    架构师训练营第四周作业

    韩儿

    架构师系列之5:互联网大数据分析系统架构例子解析

    桃花原记

    架构师训练第4周:作业二

    leo

    极客大学架构师训练营

    性能优化二第八周作业「架构师训练营第 1 期」

    天天向善

    亚新资本开创金融理财新征程

    Wi-Fi+BLE 通断器开发资料全开源!快速打造您的智能家居“改装神器”

    智能物联实验室

    人工智能 物联网 智能家居 通断器

    架构师训练营-week08

    睁眼看世界

    极客大学架构师训练营

    第八周

    Geek_fabd84

    网上如何精确分别百家电投台子真假靠谱方法(LGF微7998)

    InfoQ_ba4217df53b1

    第四周作业

    晴空万里

    深度学习-框架之 pytorch

    Dreamer

    框架

    架构师训练营 -week08-总结

    大刘

    极客大学架构师训练营

    第八周作业一

    天天向上

    极客大学架构师训练营

    第八周作业

    极客大学架构师训练营

    架构师训练营第四周作业

    丁乐洪

    【第八周】性能优化(二)

    云龙

    一个典型的大型互联网应用系统使用了哪些技术方案和手段,主要解决什么问题?请列举描述

    幸福小子

    互联网系统架构

    week4学习小结

    幸福小子

    互联网系统架构

    第四周课后练习作业一

    lithium

    极客大学架构师训练营

    第四周课后练习作业二

    lithium

    为什么说 Pulsar 是云原生的消息平台?

    tison

    云原生 消息队列 Apache Pulsar

    Week 8总结

    黄立

    为什么继承 Python 内置类型会出问题?!

    Python猫

    c Python 编程 程序员

    架构师训练营第八周课后作业

    Gosling

    极客大学架构师训练营

    LeetCode题解:169. 多数元素,排序,JavaScript,详细注释

    Lee Chen

    算法 大前端 LeetCode

    架构师训练营第四周作业2

    韩儿

    架构师训练营第 1 期 -- 第八周学习总结

    发酵的死神

    极客大学架构师训练营

    系统架构总结

    Mars

    系统架构

    架构师训练第4周:作业一

    leo

    极客大学架构师训练营

    GitHub SSH免密登录

    jiangling500

    GitHub SSH 免密登录

    大型互联网系统技术架构模式

    Mars

    架构模式 大型互联网应用系统

    面向资源的架构:信息,而非容器_SOA_Brian Sletten_InfoQ精选文章