前面的几篇文章里,对 Sementic Web 的整体情况做了一些介绍。都是一些非常概念化的东西,刚开始接触 Semantic Web 的人可能不太容易理解。不过其实总结一下,核心概念主要是这么几个:RDF、OWL和Ontology。今天围绕 RDF 动手作一些练习。
先看一个简单的例子:http://my.donews.com/clickstone/index.html 这个网页的作者是 clickstone。这是我们使用自然语言的表达方法。使用 RDF,我们需要首先提取出这句话的主干意思。被描述的事物是 “http://my.donews.com/clickstone/index.html”;他有一个“作者”属性;属性的值是 “clickstone”。
RDF 正是基于这一思想:被描述的事物具有一些属性,这些属性各自有不同类型的值;对资源的描述可以通过对它作出指定了上述属性及值的陈述来进行(就像上面例子中的那样)。RDF 用一套特定的术语来表达陈述中的各个部分,简单地讲:被陈述的事物称为 “主体” (例如上例中的“http://my.donews.com/clickstone/index.html”);主题的属性称为“谓词”(例如上例中的 “作者”);属性的值成为“客体”(例如上例中的“clickstone”);主体、谓词和客体,构成一个“RDF 陈述”。
上一篇里,我们提到可以使用三种方法来表示这种陈述:图形、Notation3(N3)和XML。图形是最为形象直观的一种方法。RDF 可以将关于资源的陈述表示为一个由结点和弧组成的图,其中的弧的起始节点是主体资源;弧本身代表资源的属性;弧的结束节点是属性值,可以是原生值,也可以另外一个资源。还以“http://my.donews.com/clickstone/index.html”为主体,可以给出一组复杂一些的陈述:有一个网页他使用
http://my.donews.com/clickstone/index.html 作为标识,他的作者作者是clickstone,他的名称是 Beyond Search,他的主题是 Semantic Web。这组陈述可以使用图1表示。
RDF sample图1 RDF示例图
使用 RDF 的语言来描述图1:
1、主体为网页,他的URI标识为“http://my.donews.com/clickstone/index.html” 。
2、谓词为creator、title、subject 等,表示属性,属性也有URI标识,图上省略了。完整的属性URI标识图上给了一个例子,“http://www.w3.org/1999/02/22- rdf-syntax-ns#type”,其中属性名为 type,URI标识为 http://www.w3.org/1999/02/22-rdf-syntax-ns。
3、客体为clickstone、“Beyond Search”和“Semantic Web”,其类型不同。clickstone 表示一个实体属性,他是Person类的一个实例。“Beyond Search”通常被称为“原生值”,字符串、数字等都可以看作原生值。“Semantic Web”也可以看作一个“原生值”属性,所不同的是他给出了一个参考(refrences)资源。
计算机无法理解 RDF 的图形表示。为了用一种计算机可处理的方式来表示 RDF 陈述,RDF 定义了一种基于 XML 的描述语法,称为 RDF/XML。在RDF/XML 语言里,有一些已经定义好的元语可以使用。通常情况下,主体节点对应于一个 rdf:Description 节点,我们称之为“主体节点”,主体的 URI 作为主体节点的 rdf:about 属性的值。谓词的 URI 写为 XML QNames,以主体节点的子节点的形式编写,称之为“属性节点”。客体不作为独立的节点,根据类型不同,其 XML 表示形式也有所区别:一般的原生值,通常记做属性节点的内容;如果是一个资源值,通常在谓词节点中加入 rdf:resource 属性表示客体,其值为客体的 URI。例如,将图1使用RDF/XML可以表示为,
<rdf:RDF xmlns:rdf=”http://www.w3.org/1999/02/22-rdf-syntax-ns#”
xmlns:rdfs=”http://www.w3.org/2000/01/rdf-schema#”
xmlns:dc=”http://purl.org/dc/elements/1.1/”
xmlns:contact=”http://www.w3.org/2000/10/swap/pim/contact#”>
<rdf:Description rdf:about=”http://my.donews.com/clickstone/index.html”>
<dc:creator rdf:resource=”http://my.donews.com/users/clickstone”/>
<dc:title>Beyond Search</dc:title>
<dc:subject rdf:resource=”Semantic Web” />
</rdf:Description>
<rdf:Description rdf:about=”Semantic Web”>
<rdf:seeAlso rdf:resource=”http://www.w3.org/2001/sw/” />
</rdf:Description>
<contact:Person rdf:about=”http://my.donews.com/users/clickstone”/>
</rdf:RDF>
RDF/XML 有一个最大的问题,他不具备约束其结构的 XML Schema。RDF Schema 的名字让人很容易误以为是干这个用的,其实不是,他被称为“
RDF 词汇描述语言”,和 XML Schema 的作用相去甚远。缺乏约束导致 RDF/XML 的写法没有标准,人们使用起来效果不是很好。
Notation 3,N3,是另外一种 RDF 表示方法,他相比 RDF/XML 大为简洁。他将 RDF 陈述写成一个依次为主体,谓词,客体的三元组形式。每一个三元组均对应于 RDF 图中的一条弧,且这个弧的起始节点和终止节点分别是陈述中的主体和客体。和图形表示法不同,三元组表示法要求一个节点在它出现的每个陈述中都要有标识。例如,“http://my.donews.com/clickstone/index.html 的作者是 clickstone”这个陈述,使用 N3 表示为,“ .”。注意,N3 写法中,末尾需要有一个“.”。上面这个例子看起来一点儿也不简洁,这主要是因为 URI 标识的原因。和 XML 的 Namespace 概念类似的,N3 中可以定义“前缀”,用“@prefix”来表示,例如,“@prefix dc: .”。将图1使用 N3 可以表示为,
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <xmlns:rdfs=”http://www.w3.org/2000/01/rdf-schema#> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix contact: <http://www.w3.org/2000/10/swap/pim/contact#> .
@prefix user: <http://my.donews.com/users/> .
@prefix cs: <http://my.donews.com/clickstone/> .
<cs:index.html> dc:creator user:clickstone .
user:clickstone rdf:type contact:Person .
<cs:index.html> dc:title “Beyond Search” .
<cs:index.html> dc:subject <Semantic Web> .
<Semantic Web> rdfs:seeAlso <http://www.w3.org/2001/sw/> .
在 N3 中,当对一个相同的主体你进行若干个陈述时,可以使用简化表示:用一个分号 “;” 引入相同主体的其他属性;用一个逗号引入相同主体及谓词的其他客体。另外,rdf:type 在 N3 中可以简写为“a”。
那么上面的 N3 表示可以简化为,
<cs:index.html> dc:creator user:clickstone ;
dc:title “Beyond Search” ;
dc:subject <Semantic Web> .
<Semantic Web> rdfs:seeAlso <http://www.w3.org/2001/sw/> .
user:clickstone a contact:Person .
Tim BL 写了一篇非常经典的 N3 教学文章,在这里“
Primer: Getting into RDF & Semantic Web using N3”。另外,他还写了一个 Python 工具,可以进行 RDF/XML 与 N3 之间的转换,在这里“CWM”,但早先我把下载包解压后,cwm.py 文件是 0 字节,导致无法使用,我从 CVS 里面弄出来一个 win32 的安装程序,是 1.19 版的,可以使用。
Update:推荐阅读,
The Bottoms Up RDF Tutorial 。