持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情
导语
SPARQL是一种用于资源描述框架上的查询语言,它的名字是一个递归缩写,代表“SPARQL Protocol and RDF Query Language”。SPARQL由于其语言结构的灵活性,常用来进行知识图谱上的查询。本篇博客将简要介绍SPARQL的基本语法内容。
RDF规范
真实世界中的数据在多数情况下并不像关系型数据库那样规范,而是更像是一种图结构,没有固定的连边和关系。在图(graph)中,每样事物就是图的一个节点,节点之间的关系就是图中的连边。如果数据库以图的方式储存数据,就称为图数据库。
RDF 是图数据库的一种描述方式,或者说是一种使用协议。它以"三元组"( triple)的方式,描述事物与事物之间的直接关系。
"三元组"是 RDF 的核心概念,指的是两个事物和它们之间的关系,其组成规范为:
<主语,谓语,宾语>
例如,小明是学生,即
<小明,是,学生>
RDF的关系必须有明确定义,通常会使用一个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 三元组的结尾是一个英文的句号,用来区分多个三元组。
RDF示例
注:以下示例来自于www.ruanyifeng.com/blog/2020/0…
假设有这样一段自然语言描述:
甲壳虫是一个乐队,成员有 John Lennon、Paul McCartney、Ringo Starr 和George Harrison。他们都是艺术家,1963年出版过一张专辑《Please Please Me》,里面包含《Love Me Do》这首单曲,长度125秒。
他们的知识图谱长这样:
然后,转成 RDF 三元组。首先,给出谓语的 URL,及其对应的前缀。
上面例子中,有两个 URL,表示使用两套谓语。其中一套是官方谓语,使用前缀rdf表示;另一套是自己定义的,前缀为空,表示这是默认的前缀。
"甲壳虫是一个乐队,成员有 John Lennon、Paul McCartney、Ringo Starr 和George Harrison。"这句话对应的三元组如下。
甲壳虫 rdf:type Band .
甲壳虫 :name "甲壳虫" .
甲壳虫 :member John_Lennon .
甲壳虫 :member Paul_McCartney .
甲壳虫 :member Ringo_Starr .
甲壳虫 :member George_Harrison .
上面例子中,rdf:type、:name、:member都是谓语。由于这些三元组的主语相同,在RDF规范中,允许将它们进行合并。
甲壳虫 a 乐队 ;
:name "甲壳虫" ;
:member John_Lennon, Paul_McCartney, George_Harrison, Ringo_Starr .
上面的代码中,主语相同的三元组采用合并写法时,每个三元组之间使用分号隔开,最后一个三元组采用句号结尾。
其余部分对应的 RDF 三元组如下。
John_Lennon a 艺术家 .
Paul_McCartney a 艺术家 .
Ringo_Starr a 艺术家 .
George_Harrison a 艺术家 .
Please_Please_Me a 专辑 ;
:name "Please Please Me" ;
:date "1963" ;
:artist "甲壳虫" ;
:track Love_Me_Do .
Love_Me_Do a Song ;
:name "Love Me Do" ;
:length 125 .