SPARQL详解

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 查询的数据格式

SPARQL详解
https://zmmmmy.github.io/2026/01/12/SPARQL详解/
作者
ZhiMy
发布于
2026年1月12日
许可协议