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 描述资源 资源描述

最佳实践:

  1. 选择合适的查询模式
  2. 使用FILTER优化查询
  3. 合理使用OPTIONAL
  4. 避免过于复杂的模式
  5. 使用LIMIT限制结果

下一步,让我们学习更新操作!

最后更新:2026-03-27