Linked Data, RDF, MIME types and Apache 设置

Linked data 可以说是新一代语义互联网的基础,具有非常广泛的应用前景。不久前W3C宣布,SKOS将全面 Linked Data化. (Needle, 2009)这对于图书馆界来说意义深远。SKOS的linked data化应该是得益于图书馆界,美国国会图书馆将国会标题表(Library of Congress Subject Headings)全部Linked Data化,成为Linked Data应用的成功范例,推动了Linked Data走向实用。这又可以说是图书馆界对互联网的发展做出贡献的实例。

Linked Data的基础是RDF和http协议,换言之,Linked Data是通过Http来传递RDF数据,而这个RDF数据是一个遵循特殊规则的语义数据,这个规则就是任何资源都用URI 来表征。所以URI\RDF\HHTP构成了Linked Data 的三个基石。任何Linked Data 的应用都围绕着这三个方面展开的。如:

  • 如何构建资源的 URI?
  • 如何建立RDF 资源?
  • 如何利用http 来传递RDF?
  • 如何接受并解析RDF数据资源? 等等。

Linked Data 的应用有两种基本模式:一种模式是浏览器/服务器模式,即人们通过浏览器来访问Linked Data; 另一种模式是客户端/服务器模式,这里的客户端主要是指应用系统,这个模式其实就是系统和系统之间的数据传递。无论何种模式,Linked Data都是通过Http来传递的。

Http 协议其实定义了两个过程,一个是请求,另一个是响应。以这两个过程为蓝图,我们可以模拟一个 Linked Data 传递过程。

  • 户端或浏览器发送一个RDF 文件请求给服务器,要求服务器返回一个 RDF 文件。发送这个请求很简单,你可以直接输入一个rdf文件后缀,如http://www.cloudlibrary.info/rainzenfoaf.rdf 就是一个简单的rdf 请求。当然,这个请求是很弱的,文件用rdf 作后缀不一定就是RDF 格式的文件,反过来,RDF格式的文件的后缀也有可能不是 rdf。所以用文件后缀来传递RDF请求不很可靠。我们需要的是一种强制性的非常明确的RDF 请求方式,这个请求只能通过系统(如浏览器)而不是人工来发出。现在通用的浏览器无法发出这样的请求,为了应用Linked Data我们需要能够发出RDF 请求的浏览器。
  • 服务器接收到一个RDF请求后,需要返回一个 RDF文件,并告知客户端这是一个RDF文件。这个过程被称之为content negotiation。 为了实现这个基于RDF 的content negotiation,这就要设定MIMEType, 定义一个RDF类型。2004年一个关于RDF的content type: Application/RDF+XML被注册。 对Linked Data 而言,content negotiation是非常重要的,如果要发布Linked Data,需要服务器能够很好地实现content negotiation。
  • 务器送交一个响应个客户端,尤其是浏览器,那么如何来解析这个 RDF 文件?特别是在浏览器模式下,由于RDF 不是给人看的,而是给机器看的,如何将机器语言翻译成人能够读懂的表达方式?这又需要一种特别的浏览器来解析RDF。

这个过程看,应用linked data需要:

  • 个能够发送 RDF 请求,并能够解析 RDF的浏览器,我们称之为RDF浏览器。 Keven 在其博客中介绍了很多RDF 浏览器或插件。 (Wei, 2009)
  • 个服务器能够返回RDF类型的服务器。幸运的是,我们常用的Apache开源http服务器:就是为数不多的能够很好实现content negotiation的服务器。

利用Apache 发布Linked Data时,需要对Apache进行简单设置,需要增加一个关于RDF的content-type,方法是在 Apache的设置中,或在.htaccess中增加一个类型说明: AddType application/rdf+xml rdf 。这样Apache接收到RDF的请求时,就可以回送RDF类型消息。

是,由于application/rdf+xml是新注册的,有些浏览器还不兼容,我发现一个现象,访问http://www.cloudlibrary.info/rdf/rainzenfoaf.rdf时,通过检查文件头的软件得知,服务器返回了一个application/rdf+xml的文件,但通过Firefox看文件信息,却被解释成text/html。看来firefox的默认content-type是text/html,而不认可application/rdf+xml类型,当接收到这个类型时,起用了默认值。

一个有趣的现象是,Apache 的默认类型是text/plain,如果不设 RDF类型时,服务器无法确认RDF文件,从而启动默认值,把 RDF文件当成text/plain。返还的是文本文件信息,这时在浏览器上显示文本文件。那么,是不是必须增加application/rdf+xml这个类型呢?其实也是不一定的,上面已经说过,FireFox把application/rdf+xml解释成text/html, 那么我们添加一个类型: AddType text/html rdf 也行,或者直接将Apache的默认值设为text/html就行了。那么如何解释回送过来的是text/html信息,而浏览器却能解析成RDF呢?看来浏览器这端还需要一个判断,通过分析标记语言来判断是否是RDF文件。不过在系统与系统之间的通讯,我以为还是应该启用application/rdf+xml,这样更加可靠明确。

文是和Keven讨论过程中形成的,感谢Keven对本文的贡献。

参考文献:

Needle, David. 2009. W3C’s New SKOS Standard Advances Linked Data. [联机] 2009年August月18日. [引用日期: 2009年August月27日.] http://www.internetnews.com/dev-news/article.php/3835176.

Wei, Liu keven. 2009. 关联数据浏览器. 数图研究笔记. [联机] 2009年August月26日. [引用日期: 2009年August月27日.] http://www.kevenlw.name/archives/1844.

背景链接

http://www.w3.org/Protocols/

http://www.iana.org/assignments/media-types/application/

Bookmark and Share

Leave a Reply