SPARQL查询模式 #
一、SELECT查询 #
1.1 基本SELECT #
sparql
# 查询所有三元组
SELECT ?s ?p ?o
WHERE {
?s ?p ?o .
}
# 查询特定属性
SELECT ?name ?age
WHERE {
?person foaf:name ?name .
?person ex:age ?age .
}
# 使用DISTINCT去重
SELECT DISTINCT ?name
WHERE {
?person foaf:name ?name .
}
# 使用REDUCED(允许重复)
SELECT REDUCED ?name
WHERE {
?person foaf:name ?name .
}
1.2 投影表达式 #
sparql
# 使用表达式
SELECT ?name (UCASE(?name) AS ?upperName)
WHERE {
?person foaf:name ?name .
}
# 多个表达式
SELECT ?name
(?age AS ?personAge)
(?age * 2 AS ?doubleAge)
WHERE {
?person foaf:name ?name .
?person ex:age ?age .
}
# 使用聚合函数
SELECT (COUNT(?person) AS ?count)
(AVG(?age) AS ?avgAge)
(MAX(?age) AS ?maxAge)
WHERE {
?person a ex:Person .
?person ex:age ?age .
}
1.3 变量选择 #
sparql
# 选择特定变量
SELECT ?name ?email
WHERE {
?person foaf:name ?name .
?person foaf:mbox ?email .
?person ex:age ?age .
}
# 选择所有变量
SELECT *
WHERE {
?person foaf:name ?name .
?person ex:age ?age .
}
二、ASK查询 #
2.1 基本ASK #
sparql
# 检查是否存在
ASK {
ex:Tom foaf:name "Tom" .
}
# 检查关系
ASK {
ex:Tom ex:knows ex:Jerry .
}
# 带条件
ASK {
?person a ex:Person .
?person ex:age ?age .
FILTER (?age > 100)
}
2.2 ASK应用场景 #
text
应用场景:
├── 检查数据是否存在
├── 验证约束条件
├── 权限检查
└── 条件判断
示例:
sparql
# 检查用户是否存在
ASK {
?user ex:userId "user_001" .
}
# 检查是否有权限
ASK {
ex:Tom ex:hasPermission ex:readPermission .
}
# 检查数据完整性
ASK {
?person a ex:Person .
FILTER NOT EXISTS { ?person foaf:name ?name }
}
三、CONSTRUCT查询 #
3.1 基本CONSTRUCT #
sparql
# 构建新图
CONSTRUCT {
?person ex:friend ?friend .
}
WHERE {
?person ex:knows ?friend .
?friend ex:knows ?person .
}
# 转换数据格式
CONSTRUCT {
?person foaf:name ?fullName .
}
WHERE {
?person foaf:firstName ?firstName .
?person foaf:lastName ?lastName .
BIND (CONCAT(?firstName, " ", ?lastName) AS ?fullName)
}
3.2 数据转换 #
sparql
# 属性重命名
CONSTRUCT {
?person ex:fullName ?name .
?person ex:ageYears ?age .
}
WHERE {
?person foaf:name ?name .
?person ex:age ?age .
}
# 类型转换
CONSTRUCT {
?product ex:priceWithTax ?priceWithTax .
}
WHERE {
?product ex:price ?price .
BIND (?price * 1.1 AS ?priceWithTax)
}
3.3 数据整合 #
sparql
# 合并多个来源
CONSTRUCT {
?person ex:contact ?contact .
}
WHERE {
{
?person foaf:mbox ?contact .
}
UNION
{
?person ex:phone ?contact .
}
}
# 构建关系图
CONSTRUCT {
?person1 ex:mutualFriend ?person2 .
}
WHERE {
?person1 ex:knows ?mutual .
?person2 ex:knows ?mutual .
FILTER (?person1 != ?person2)
}
四、DESCRIBE查询 #
4.1 基本DESCRIBE #
sparql
# 描述单个资源
DESCRIBE ex:Tom
# 描述多个资源
DESCRIBE ex:Tom ex:Jerry
# 带条件的DESCRIBE
DESCRIBE ?person
WHERE {
?person ex:status "active" .
}
4.2 DESCRIBE应用 #
sparql
# 获取用户及其相关信息
DESCRIBE ?person
WHERE {
?person ex:userId "user_001" .
}
# 获取相关资源
DESCRIBE ?related
WHERE {
ex:Tom (ex:knows|ex:follows) ?related .
}
五、复杂查询模式 #
5.1 多模式组合 #
sparql
# 组合SELECT和OPTIONAL
SELECT ?name ?email ?phone
WHERE {
?person foaf:name ?name .
OPTIONAL { ?person foaf:mbox ?email }
OPTIONAL { ?person ex:phone ?phone }
}
# 组合UNION和FILTER
SELECT ?name
WHERE {
{
?person foaf:name ?name .
?person ex:status "active" .
}
UNION
{
?person foaf:name ?name .
?person ex:status "pending" .
?person ex:createdAt ?date .
FILTER (?date > "2024-01-01"^^xsd:date)
}
}
5.2 嵌套模式 #
sparql
# 嵌套OPTIONAL
SELECT ?name ?friendName ?friendEmail
WHERE {
?person foaf:name ?name .
OPTIONAL {
?person ex:knows ?friend .
?friend foaf:name ?friendName .
OPTIONAL { ?friend foaf:mbox ?friendEmail }
}
}
# 嵌套UNION
SELECT ?name ?contact
WHERE {
?person foaf:name ?name .
{
OPTIONAL {
?person foaf:mbox ?email .
BIND (?email AS ?contact)
}
}
UNION
{
OPTIONAL {
?person ex:phone ?phone .
BIND (?phone AS ?contact)
}
}
}
5.3 路径查询模式 #
sparql
# 路径查询
SELECT ?friend ?distance
WHERE {
ex:Tom (foaf:knows{1,3}) ?friend .
BIND (STRLEN(STR(?path)) AS ?distance)
}
# 反向路径
SELECT ?follower
WHERE {
?follower ^foaf:knows ex:Tom .
}
# 复杂路径
SELECT ?related
WHERE {
ex:Tom (foaf:knows/ex:worksAt/^ex:worksAt) ?related .
}
六、图模式匹配 #
6.1 基本图模式 #
sparql
# 简单模式
SELECT ?name
WHERE {
?person a ex:Person .
?person foaf:name ?name .
}
# 多约束模式
SELECT ?name
WHERE {
?person a ex:Person .
?person foaf:name ?name .
?person ex:age ?age .
?person ex:status ?status .
FILTER (?age > 25 && ?status = "active")
}
6.2 可选图模式 #
sparql
# OPTIONAL模式
SELECT ?name ?email ?phone
WHERE {
?person foaf:name ?name .
OPTIONAL { ?person foaf:mbox ?email }
OPTIONAL { ?person ex:phone ?phone }
}
# 条件OPTIONAL
SELECT ?name ?friendName
WHERE {
?person foaf:name ?name .
OPTIONAL {
?person ex:knows ?friend .
?friend foaf:name ?friendName .
?friend ex:status "active" .
}
}
6.3 否定图模式 #
sparql
# FILTER NOT EXISTS
SELECT ?name
WHERE {
?person foaf:name ?name .
FILTER NOT EXISTS { ?person foaf:mbox ?email }
}
# MINUS
SELECT ?name
WHERE {
?person foaf:name ?name .
MINUS {
?person ex:status "inactive" .
}
}
七、属性路径模式 #
7.1 路径表达式 #
sparql
# 序列路径
SELECT ?friend
WHERE {
ex:Tom foaf:knows/foaf:knows ?friend .
}
# 选择路径
SELECT ?related
WHERE {
ex:Tom (foaf:knows|foaf:follows) ?related .
}
# 重复路径
SELECT ?ancestor
WHERE {
ex:Tom ex:parent* ?ancestor .
}
7.2 路径属性 #
sparql
# 获取路径
SELECT ?path
WHERE {
ex:Tom foaf:knows{1,3} ?friend .
BIND (STR(?path) AS ?path)
}
# 路径长度
SELECT ?friend (COUNT(?step) AS ?distance)
WHERE {
ex:Tom (foaf:knows{1,3}) ?friend .
}
GROUP BY ?friend
八、分组与聚合模式 #
8.1 GROUP BY #
sparql
# 简单分组
SELECT ?status (COUNT(?person) AS ?count)
WHERE {
?person a ex:Person .
?person ex:status ?status .
}
GROUP BY ?status
# 多字段分组
SELECT ?status ?department (COUNT(?person) AS ?count)
WHERE {
?person a ex:Person .
?person ex:status ?status .
?person ex:department ?department .
}
GROUP BY ?status ?department
8.2 HAVING #
sparql
# 分组过滤
SELECT ?department (AVG(?age) AS ?avgAge)
WHERE {
?person ex:department ?department .
?person ex:age ?age .
}
GROUP BY ?department
HAVING (AVG(?age) > 30)
# 复杂HAVING
SELECT ?department (COUNT(?person) AS ?count)
WHERE {
?person ex:department ?department .
?person ex:age ?age .
}
GROUP BY ?department
HAVING (COUNT(?person) > 5 && AVG(?age) < 40)
8.3 聚合函数 #
sparql
# 多种聚合
SELECT ?department
(COUNT(?person) AS ?count)
(AVG(?age) AS ?avgAge)
(MAX(?age) AS ?maxAge)
(MIN(?age) AS ?minAge)
(SUM(?salary) AS ?totalSalary)
WHERE {
?person ex:department ?department .
?person ex:age ?age .
?person ex:salary ?salary .
}
GROUP BY ?department
九、子查询模式 #
9.1 基本子查询 #
sparql
# 子查询
SELECT ?name ?avgAge
WHERE {
?person foaf:name ?name .
?person ex:department ?dept .
{
SELECT ?dept (AVG(?age) AS ?avgAge)
WHERE {
?person ex:department ?dept .
?person ex:age ?age .
}
GROUP BY ?dept
}
}
9.2 相关子查询 #
sparql
# 相关子查询
SELECT ?name ?deptAvgAge
WHERE {
?person foaf:name ?name .
?person ex:department ?dept .
{
SELECT ?dept (AVG(?age) AS ?deptAvgAge)
WHERE {
?person ex:department ?dept .
?person ex:age ?age .
}
GROUP BY ?dept
}
FILTER (?dept = ?dept)
}
十、实际应用示例 #
10.1 知识图谱查询 #
sparql
# 查询概念层级
SELECT ?concept ?parent
WHERE {
?concept rdfs:subClassOf* ex:Database .
OPTIONAL { ?concept rdfs:subClassOf ?parent }
}
# 查询实例属性
SELECT ?instance ?property ?value
WHERE {
?instance a ex:Person .
?instance ?property ?value .
FILTER (isLiteral(?value))
}
10.2 社交网络查询 #
sparql
# 查找共同好友
SELECT ?mutualFriend
WHERE {
ex:Tom foaf:knows ?mutualFriend .
ex:Jerry foaf:knows ?mutualFriend .
}
# 查找N度关系
SELECT ?person (COUNT(?step) AS ?distance)
WHERE {
ex:Tom (foaf:knows{1,3}) ?person .
}
GROUP BY ?person
10.3 推荐查询 #
sparql
# 基于好友推荐
SELECT ?recommendedPerson (COUNT(?mutualFriend) AS ?score)
WHERE {
ex:Tom foaf:knows ?mutualFriend .
?mutualFriend foaf:knows ?recommendedPerson .
FILTER NOT EXISTS {
ex:Tom foaf:knows ?recommendedPerson .
}
FILTER (?recommendedPerson != ex:Tom)
}
GROUP BY ?recommendedPerson
ORDER BY DESC(?score)
LIMIT 10
十一、总结 #
查询模式要点:
| 模式 | 说明 | 用途 |
|---|---|---|
| SELECT | 返回变量绑定 | 数据查询 |
| ASK | 返回布尔值 | 存在性检查 |
| CONSTRUCT | 构建新图 | 数据转换 |
| DESCRIBE | 描述资源 | 资源描述 |
最佳实践:
- 选择合适的查询模式
- 使用FILTER优化查询
- 合理使用OPTIONAL
- 避免过于复杂的模式
- 使用LIMIT限制结果
下一步,让我们学习更新操作!
最后更新:2026-03-27