SPARQL 基础

RDF 里的三元组存好了,怎么查?SPARQL(SPARQL Protocol and RDF Query Language)是 W3C 为 RDF 制定的标准查询语言:用图模式(Graph Pattern)描述「你要找什么样的子图」,引擎在数据图上做模式匹配,返回绑定了变量的结果。本章介绍 SPARQL 概述、四种查询形式(SELECT、CONSTRUCT、ASK、DESCRIBE)、基本图模式(BGP)FILTER、OPTIONAL,以及 FROM命名图

一、SPARQL 查询语言概述

SPARQL 查询由三部分构成:前缀声明(PREFIX)——将 URI 缩写为短前缀,便于书写;查询形式(Query Form)——决定返回的是结果集、RDF 图、布尔值还是描述;查询体——主要是 WHERE 子句中的图模式,描述要匹配的图结构。

图模式由三元组模式(Triple Pattern)组成:每个模式形如 (s, p, o),其中 s、p、o 可以是 URI、字面量或变量(以 ? 或 $ 开头,如 ?x、?name)。变量在模式匹配时被绑定到图中的节点或边;多个三元组模式写在一起形成基本图模式(BGP),表示这些模式在同一个匹配中同时成立(相当于连接)。

SPARQL 查询结构:前缀、查询形式、WHERE 中的图模式

二、四种查询形式:SELECT、CONSTRUCT、ASK、DESCRIBE

SELECT:返回与图模式匹配的变量绑定(结果表),可指定要返回的变量列表(* 表示全部)。最常用于「查实体、查属性、查关系」。

CONSTRUCT:用匹配到的绑定构造新的 RDF 图。WHERE 提供匹配,CONSTRUCT 中写模板三元组(变量会被替换),输出为 RDF。常用于转换、视图、或生成子图。

ASK:只回答「是否存在至少一个匹配」,返回布尔值 true/false。用于存在性检查、约束校验。

DESCRIBE:返回对指定资源(或变量绑定到的资源)的描述,具体形式由实现定义,通常包含以该资源为主语或宾语的三元组。用于「给我关于这个 URI 的所有已知信息」。

SELECT

Return variable bindings (result table). Use for querying entities and relations.

CONSTRUCT

Build a new RDF graph from bindings. Use for transformation or views.

ASK

Return true/false if any solution exists. Use for existence checks.

DESCRIBE

Return description of resource(s). Implementation-defined shape.

示例(前缀略):

SELECT ?person ?name
WHERE {
  ?person ex:name ?name .
  ?person ex:type ex:Person .
}
CONSTRUCT { ?x ex:label ?name } WHERE { ?x ex:name ?name . }
ASK { ex:Alice ex:knows ex:Bob . }

三、基本图模式(BGP)与 FILTER、OPTIONAL

基本图模式(Basic Graph Pattern, BGP)是若干三元组模式的并列,用空格或换行分隔,结尾用点 .。匹配时,所有三元组模式必须在同一匹配中同时满足,共享的变量表示「同一个节点」。例如 ?a ex:p ?b . ?b ex:q ?c 表示找一条 p 边再沿 q 边,?b 是中间节点。

FILTER 对绑定施加约束表达式,只保留使表达式为 true 的解。常用 =!=<>regex()lang()bound(?x) 等。FILTER 在 BGP 匹配后应用,可过滤掉不需要的绑定。

OPTIONAL 表示「可选的」子模式:若子模式有匹配则扩展绑定,若无匹配则保留当前绑定、未匹配到的变量为 unbound。语义等价于左外连接。例如「查所有人,若有出生日期则一并返回」:主 BGP 匹配 ?person,OPTIONAL { ?person ex:birthDate ?d } 则在不破坏主匹配的前提下尽量绑定 ?d。

BGP 为必匹配;OPTIONAL 为可选子模式(左外连接);FILTER 为后过滤条件
SELECT ?person ?name ?d
WHERE {
  ?person ex:name ?name .
  ?person ex:type ex:Person .
  OPTIONAL { ?person ex:birthDate ?d } .
  FILTER (regex(?name, "^A"))
}

四、FROM 与命名图

默认情况下,SPARQL 查询针对存储的默认图(Default Graph)进行匹配。通过 FROM 可指定要查询的图的 URI,即从该命名图(Named Graph)或默认图中读取数据。FROM NAMED 则声明「还有这些命名图可供使用」,在模式中通过 GRAPH ?g { ... } 对指定命名图进行匹配。

语义上:FROM <u> 把 <u> 的内容加入默认图(或作为查询的默认数据集);FROM NAMED <u> 把 <u> 作为命名图,其名字为 <u>;在 WHERE 里写 GRAPH ?g { ... } 表示在命名图 ?g 上匹配内部模式。这样可区分不同来源、版本或语境的 RDF 数据。

FROM 与 GRAPH 小结

FROM <uri>:指定默认数据集;FROM NAMED <uri>:注册命名图;GRAPH ?g { pattern }:在命名图 ?g 上匹配 pattern。用于多图、溯源、版本。

默认图与命名图:FROM 指定默认数据集,FROM NAMED 与 GRAPH 处理命名图
SELECT ?s ?p ?o
FROM <http://example.org/default>
FROM NAMED <http://example.org/g1>
WHERE {
  GRAPH ?g { ?s ?p ?o } .
  FILTER (?g = <http://example.org/g1>)
}

一句话: SPARQL 用图模式在 RDF 上做匹配,返回绑定或构造图。四种形式:SELECT(结果表)、CONSTRUCT(生成 RDF)、ASK(布尔)、DESCRIBE(资源描述)。BGP 是三元组模式的合取;FILTER 过滤绑定;OPTIONAL 为左外连接。FROM 指定默认图,FROM NAMEDGRAPH 处理命名图。

实践: 在 DBpedia 或 Wikidata 的 SPARQL 端点运行一条 SELECT:查「类型为 Person 且有名 name 的实体」前 10 条;再写一条带 OPTIONAL 的查询,例如可选地取 abstract,体会 OPTIONAL 对结果行数的影响。

五、小结

SPARQL 是 RDF 的标准查询语言,由 PREFIX、查询形式与 WHERE 图模式组成。SELECT/CONSTRUCT/ASK/DESCRIBE 四种形式分别返回结果表、RDF 图、布尔与描述。BGP 为基本图模式(三元组模式合取),FILTEROPTIONAL 扩展表达能力。FROMFROM NAMEDGRAPH 用于默认图与命名图。下一章讲SPARQL 进阶与联邦查询:聚合、子查询、属性路径、SERVICE 联邦、更新与优化。