最好走的路越走越难,最难走的路越走越容易

Follow guwendong on Web
  • Subscribe to Beyond Search via RSS
  • Follow @clickstone on SinaWeibo
  • Join Resys Google Group
  • Follow @clickstone on Douban
  • Follow @clickstone on Twitter

Category Archives: 语义网

Digg+RDFa

5月初,Digg 宣布在其新闻页面里,加入对 semantic markup [1] 的支持。目前支持 3 种:XFNhCard,以及最重要的 RDFa [1]

想看实际用法的,可以在 Digg 新闻页面的源代码里,搜索“property”。比如在这个页面里
http://digg.com/tech_news/In_Google_we_trust_but_should_we,你可以找到类似于这样的内容,
“<a href="http://www.guardian.co.uk/technology/2008/may/22/internet.google" rel="dc:source" property="dc:title">
In Google we trust – but should we?</a>”。
如果安装了 RDFa bookmarklets 的话,可以看到更形象的效果,类似下面。

  1. 使用 RDFa Highlight 标亮页面上的 N3 Triples。
  2. 使用 GetN3 extractor 抽取出来的 N3 Tripes 文本。
  3. <http://digg.com/tech_news/In_Google_we_trust_but_should_we>
      <http://purl.org/dc/elements/1.1/source>
        <http://www.guardian.co.uk/technology/2008/may/22/internet.google>
    <http://digg.com/tech_news/In_Google_we_trust_but_should_we>
      <http://purl.org/dc/elements/1.1/title>
        "In Google we trust – but should we?" <http://digg.com/tech_news/In_Google_we_trust_but_should_we>
      <http://purl.org/dc/terms/abstract>
        "Google is more vulnerable to competitors than people think." .
    <http://digg.com/tech_news/In_Google_we_trust_but_should_we>
      <http://purl.org/dc/elements/1.1/creator>
        <http://digg.com/users/dagorret> .
    <http://digg.com/tech_news/In_Google_we_trust_but_should_we>
      <http://purl.org/dc/elements/1.1/date>
        "2008-05-22 11:45:13" .

最早的 RDF [1] [2],由于其比较难于理解,并且操作复杂,导致其始终没有推广起来。W3C 组织受到轻量级规范如 Microformats 的启发,推出了新的经过简化的 RDFa [1] 规范。从其官方描述“Embedding Structured Data in Web Pages”,就可以看出来,它是一种嵌入到 HTML/XHTML 中的数据。要说 RDFa 的实现比 Microformats 还是要复杂一些,不过它的适用性更广,对于可以通过 RDF 表达的任何内容, 都能够使用 RDFa 添加到 XHTML 文档中,而且不再需要使用繁琐的 XML 语言进行描述。这使得基于现有 Web 内容实现 Semantic Web,成本低了不少,也更靠谱了。

希望可以有更多的 Applicaitons 向 Digg 看齐,让 RDFa 的队伍壮大起来。
这里需要谴责一下 Powerset,号称 Semantic Web 的 Killer App,居然都不支持 RDFa。

推荐阅读:

  1. Writing Semantic Markup
  2. Introducing RDFa
 

Semantic Web: SPARQL——RDF查询语言

SPARQL,和“sparkle”的发音一样,它是一种 RDF 查询语言,可以从 RDF 图中查询信息。在 W3C Technical Reports and Publications 页面上,我们可以看到,现在和 SPARQL 相关的共有三项内容:其中两个是 Candidate Recommendations(候选推荐),SPARQL Protocol for RDFSPARQL Query Results XML Format;另外一个是 Word Drafts(工作草案),SPARQL Query Language for RDF。上了这个页面,基本上就已经说明这个要成为 W3C 的推荐标准了,就像 RDF 和 OWL 一样。而且,在 WWW2006 发言时,TimBL 也已经表示,随着 SPARQL 查询语言即将完成标准化语义网已经具备了成功所需要的所有标准和技术,Web开发人员和内容创作人员可以开始使用这些语义语言了。

在 SPARQL 之前,已经有不少研究人员致力于开发针对 RDF 的查询语言,在这个网页 http://www.w3.org/2001/11/13-RDF-Query-Rules/ 上有一个比较完整的列表。SPARQL 是基于以前的 RDF 查询语言(如rdfDB、RDQL 和 SeRQL)发展而来的,拥有一些有价值的新特性,并且受到 Jena 开发团队的鼎立支持。Jena 是 HP 公司语义网研究小组开发的一套 Java 工具包,用来支持人们进行语义网的相关研究和应用开发。SPARQL 的语法细节这里就不一一列举了,直接给出一个例子。总体来说,SPARQL 的语法和传统 SQL 的语法还是有几分相似的,大家应该不会陌生。

BASE <http://my.donews.com/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
# 这是一个以 BASE 为根的相对 IRI

PREFIX user: <users#>

SELECT ?person ?name ?age
FROM <users.rdf>
WHERE {
?person a foaf:Person ;
foaf:name ?name .
OPTIONAL { ?person user:age ?age } .
FILTER (REGEX(?name, “clickstone”))
}
ORDER BY ASC(?name)
LIMIT 10
OFFSET 10

简要的说明一下例子中出现的语法。

  1. BASE,根 IRI,其他以此为根的 IRI 就可以写成相对形式了,见例子里面的注释。一旦定义了 BASE,就可以在 SPARQL 的任何地方进行使用了,例子中共用到了 2 处。
  2. 使用 # 进行注释。
  3. PREFIX,IRI 前缀的缩写。
  4. SELECT,查询关键字,和 SQL 中的一个意思。
  5. ?person ?name ?age,要查询的变量,使用 ? 标识变量,也可以使用 $。变量间使用空白分隔(现在正在征集意见,正式标准中使用空白还是逗号分隔尚未最终确定)。
  6. FROM,从何处查询数据。可以一次查询多个 RDF 数据集,只需要使用 FROM 逐一列出即可。
  7. WHERE,过滤条件集合,和 SQL 的 WHERE 一个意思。
  8. ?person a foaf:Person,具体的过滤条件,使用 Turtle 语法。还记得“a”是什么意思吗?具体的介绍可以参看《RDF 实战》。
  9. 例子中两个过滤条件的主语都是“?person”,因此,使用了简写的形式。如果主语不同,逐一列出检索条件即可。
  10. OPTIONAL,可选过滤条件。比如有些 ?person 可能没有填写 age 属性,如果不使用 OPTIONAL,那么查询结果将不包含这些 ?person;使用了 OPTIONAL 关键字,没有填写 age 属性的 ?person,同样可以被查询到。
  11. FILTER (REGEX(?name, “clickstone”)),明确化的过滤条件,类似于 SQL 中的 LIKE、=、> 等的左右。例子中的意思是说,返回的 ?name 变量中,必须包含“clickstone”。
  12. ORDER BY,排序,可以指定多个排序,比如例子可以改为,ORDER BY ASC(?name) DESC(?age)。默认排序是 ASC。
  13. LIMIT 10,将返回结果限定在 10 条,类似于 SQL 中的 SELECT TOP 10。
  14. OFFSET 10,掠过前边的 10 条,从 第 11 条开始返回。这个功能比 SQL 强大,SQL 要自己写翻页。

其他的还有 UNION、DISTINCT 等的使用,大家就自己看文档吧。但必须强调一点,SPARQL 的使用中和 SQL 一个非常大的区别,需要大家注意:SELECT 子句中出现的变量,比如例子中的 ?person ?name ?age,在 WHERE 子句中必须全部出现。为什么会这样呢?因为对于一个 SPARQL 查询处理器来讲,它不具备类似于关系数据库中数据字典的东西以供参考,所以每一个 SELECT 的变量,在 WHERE 中必须指定一个用来匹配的triple。

这篇文章只是抛砖引玉,更详细的内容,还需要大家深入研究。推荐阅读:Introducing SPARQL: Querying the Semantic Web。欢迎互动交流。

 

Semantic Web: RDF实战

前面的几篇文章里,对 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

 
猛戳这里

简网指阅 联合创始人 & CTO
ResysChina 发起人
1. 持续关注 个性化推荐 技术;
2. 持续关注 Semantic Web 技术;
3. 评论与上两项相关的互联网业务与产品;

我相信技术的力量!
wendell.gu@GMail.com

Archives