维基百科有一个姐妹项目,叫做"维基数据"(Wikidata)。你可以从维基百科左侧边栏点进去。
"维基数据"将维基百科的所有数据,整理成一个可以机器处理的数据库,方便查询。比如,山西省人口最多的地区是哪一个?
这种问题在维基百科查询,非常费时,必须人工从一个个条目提取信息。但是,维基数据可以只执行一条命令,就返回答案(详见后文)。因为它提供结构化数据,可以机器查询。
但是,维基数据不是关系型数据库,而是 RDF 数据库;查询语言不是 SQL,而是 SPARQL。我粗浅地学了一点 RDF 和 SPARQL,本文就是学习笔记,演示如何使用维基数据查询信息。
一、RDF 的含义
大家都知道,关系型数据库是目前使用最广泛的数据库,将数据抽象成行和列的表格关系。
但是,现实世界不像表格,更像网络。各种事物通过错综复杂的关系,连接在一起,组成一张网。
网络在数学里面称为图(graph),每样事物就是图的一个节点,节点之间的关系就是将它们连在一起的那条边。如果数据库以图的方式储存数据,就称为图数据库。
RDF 就是图数据库的一种描述方式,或者说是一种使用协议。它以"三元组"( triple)的方式,描述事物与事物之间的直接关系。
"三元组"是 RDF 的核心概念,指的是两个事物和它们之间的关系,在语法上呈现为"主语 + 谓语 + 宾语"。
天空是蓝色的。
上面这句话,就是一个 RDF 三元组。"天空"(主语)和"蓝色"(宾语)是两种事物,它们通过颜色关系(谓语)连接在一起。
RDF 要求,谓语(即事物之间的关系)必须有明确定义。大家这样想,如果谓语是给定的,就可以用主语去查询宾语,或者用宾语去查询主语。比如,颜色关系是给定的,那么就可以向数据库进行下面的查询。
查询一:天空 + 颜色 = ?
查询二:? + 颜色 = 蓝色
任何组织和个人,都可以定义自己的谓语。RDF 要求每套谓语必须有一个明确的 URL,通过 URL 区分不同的谓语。RDF 官方定义了一套常用的谓语,URL 如下。
使用的时候,只要引用这个 URL,别人就知道用的是哪一套谓语。
URL 比较冗长,引用不方便。RDF 允许指定一个前缀,代表 URL 地址,比如上面那个官方谓语的 URL,通常用前缀rdf
表示。
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns>
每个 URL 里面可以包含多种谓语,通过"前缀 : 谓语"的形式来区分。比如,官方定义了一个"type"谓语,说明主语的类型,就可以用rdf:type
表示。
小明是学生。
上面这句话,写成 RDF 三元组,就是下面的形式。
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns> 小明 rdf:type 学生.
由于rdf:type
是一个常用谓语,RDF 允许把它简写成a
,因此"小明是学生"又可以表示成小明 a 学生
。
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns> 小明 a 学生 .
注意,每个 RDF 三元组的结尾是一个英文的句号,用来区分多个三元组。<