SPARQL 详解
ℹ️ 信息: 衍生来源 本笔记衍生自 三元组详解
概述 SPARQL(SPARQL Protocol and RDF Query Language) 是 W3C 标准的 RDF 查询语言,类似于关系数据库的 SQL,用于查询和操作 RDF 数据。
查询类型
类型
用途
SELECT
返回匹配的变量绑定
CONSTRUCT
构造新的 RDF 图
ASK
返回布尔值(是否存在匹配)
DESCRIBE
返回资源的描述信息
基本语法结构 1 2 3 4 5 6 7 8 PREFIX ex: <http://example.org/> PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name ?age WHERE { ?person foaf:name ?name . ?person ex:年龄 ?age . }
语法要素
要素
说明
PREFIX
定义命名空间前缀
SELECT
指定返回的变量
WHERE
定义图模式(匹配条件)
?var
变量,以 ? 或 $ 开头
.
三元组模式分隔符
基础查询示例 简单查询 1 2 3 4 5 6 # 查询所有人的名字 SELECT ?name WHERE { ?person a ex:Person . ?person foaf:name ?name . }
可选匹配(OPTIONAL) 1 2 3 4 5 6 # 查询人名,年龄可选 SELECT ?name ?age WHERE { ?person foaf:name ?name . OPTIONAL { ?person ex:年龄 ?age } }
过滤条件(FILTER) 1 2 3 4 5 6 7 # 查询年龄大于 20 的人 SELECT ?name ?age WHERE { ?person foaf:name ?name . ?person ex:年龄 ?age . FILTER (?age > 20) }
常用过滤函数
函数
说明
示例
FILTER
条件过滤
FILTER (?age > 20)
REGEX
正则匹配
FILTER REGEX(?name, "^张")
BOUND
检查变量是否绑定
FILTER BOUND(?age)
LANG
获取语言标签
FILTER (LANG(?name) = "zh")
STR
转换为字符串
STR(?uri)
聚合函数 1 2 3 4 5 6 7 8 9 # 统计每个城市的人数 SELECT ?city (COUNT(?person) AS ?count) WHERE { ?person ex:居住于 ?city . } GROUP BY ?city HAVING (COUNT(?person) > 10) ORDER BY DESC(?count) LIMIT 10
聚合函数列表
函数
说明
COUNT
计数
SUM
求和
AVG
平均值
MIN / MAX
最小/最大值
GROUP_CONCAT
字符串连接
SAMPLE
随机取样
高级查询 UNION(联合查询) 1 2 3 4 5 6 7 # 查询认识或喜欢李四的人 SELECT ?person WHERE { { ?person ex:认识 ex:李四 } UNION { ?person ex:喜欢 ex:李四 } }
MINUS(差集) 1 2 3 4 5 6 # 查询没有年龄信息的人 SELECT ?person WHERE { ?person a ex:Person . MINUS { ?person ex:年龄 ?age } }
子查询 1 2 3 4 5 6 7 8 9 10 11 12 13 # 查询好友数最多的人 SELECT ?person ?friendCount WHERE { { SELECT ?person (COUNT(?friend) AS ?friendCount) WHERE { ?person ex:认识 ?friend . } GROUP BY ?person } } ORDER BY DESC(?friendCount) LIMIT 1
属性路径 SPARQL 1.1 支持属性路径表达式:
语法
含义
ex:a/ex:b
路径连接(a 然后 b)
ex:a|ex:b
路径选择(a 或 b)
ex:a*
零或多次
ex:a+
一或多次
ex:a?
零或一次
^ex:a
反向路径
属性路径示例 1 2 3 4 5 6 7 8 9 10 11 12 # 查询张三直接或间接认识的人(传递闭包) SELECT ?person WHERE { ex:张三 ex:认识+ ?person . } # 查询张三的朋友的朋友 SELECT ?fof WHERE { ex:张三 ex:认识/ex:认识 ?fof . FILTER (?fof != ex:张三) }
CONSTRUCT 构造查询 1 2 3 4 5 6 7 8 # 构造新的 RDF 图 CONSTRUCT { ?person ex:is_adult true . } WHERE { ?person ex:年龄 ?age . FILTER (?age >= 18) }
更新操作(SPARQL Update) INSERT DATA 1 2 3 4 5 INSERT DATA { ex:王五 a ex:Person ; foaf:name "王五" ; ex:年龄 30 . }
DELETE DATA 1 2 3 DELETE DATA { ex:张三 ex:年龄 25 . }
DELETE/INSERT 1 2 3 4 5 6 DELETE { ?person ex:年龄 ?oldAge } INSERT { ?person ex:年龄 ?newAge } WHERE { ?person ex:年龄 ?oldAge . BIND (?oldAge + 1 AS ?newAge) }
常用 SPARQL 端点
端点
URL
DBpedia
https://dbpedia.org/sparql
Wikidata
https://query.wikidata.org/sparql
UniProt
https://sparql.uniprot.org/sparql
查询示例:Wikidata 1 2 3 4 5 6 7 8 9 10 # 查询所有中国城市 SELECT ?city ?cityLabel ?population WHERE { ?city wdt:P31 wd:Q515 . # 实例类型:城市 ?city wdt:P17 wd:Q148 . # 所属国家:中国 OPTIONAL { ?city wdt:P1082 ?population } SERVICE wikibase:label { bd:serviceParam wikibase:language "zh,en" } } ORDER BY DESC(?population) LIMIT 20
相关链接
三元组详解 - 衍生来源
RDF规范 - SPARQL 查询的数据格式