2、SPARQL 查询语言
一、语法结构及关键字
1、SELECT 查询
语法:
SELECT [DISTINCT] <VAR> [<VAR> ...]
[FROM ...]
WHERE
{
triple pattern 1.
[triple pattern 2.]
...
[附加条件...]
}
[OFFSET 数字]
[LIMIT 数字]
[ORDER BY | GROUP BY <VAR>]
说明:
triple pattern 是一个三元组,它的结构跟 RDF 三元组要求基本相同,唯一不同的就是他的主谓宾可以是变量。比如 ?s ?p ?o 这个会匹配 RDF 图数据中所有的三元组。
DISTINCT 的使用跟它在 SQL 中一样,用于去掉重复数据值。
FROM 用于指定在哪个数据图中检索。因为一个数据终端可以检索多个 RDF 数据图的内容,比如 FROM <http://dbpedia.org> 就是从这个 URI <http://dbpedia.org> 指定的数据图中检索。
OFFSET n 用于指定跳过前 n 个检索结果。
LIMIT m 用于指定返回结果的数量 m。
ORDER BY VAR 根据变量VAR的值对返回的结果排序。对比 SQL。
GROUP BY VAR 根据变量VAR的值对返回结果进行分组。对比 SQL。
2、CONSTRUCT 查询
语法:
CONSTRUCT
{
triple pattern .
...
}
WHERE
{
triple pattern .
...
[附加条件...]
}
说明:
跟 SELECT 查询同样用于查询数据,但是前者返回的是列表,这个返回的是 RDF 图数据。CONSTRUCT 中的
3、ASK 查询
语法:
ASK
{
triple pattern .
...
[附加条件...]
}
说明:
用于验证结果真假,判断 RDF 数据中是否包含指定的结果。
4、DESCRIBE 查询
语法:
DESCRIBE <VAR>|<URI> [<VAR>|<URI> ...]
WHERE
{
triple pattern .
...
[附加条件...]
}
说明:
用于返回关于某个 URI 或者 变量 的 RDF 数据。
5、关键字:
select:用于确定查询中返回哪些变量
where:定义匹配的RDF库中的图模型,每一行都是一个完整的三元组,除了最后一行其他都需要句号结尾
distinct:消除重复的记录项
* 返回所有已知变量的绑定
optional:即允许向结果集中增加额外的绑定,有不会在没有可选绑定时删除查询结果
FILTER:对布尔表达式进行计算,从结果集中去除结果为假的查询结果,查询中国的大学数大于30000的
二、基于DBpedia知识库的SparQL查询练习
查询操作在线平台地址:https://dbpedia.org/sparql
案例1:查询所有以 foaf:name 为谓词(属性)的三元组的宾语(属性值)。
代码:
PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?name WHERE { ?person foaf:name ?name }
查询结果:
案例2:查询拥有 foaf:homepage 属性的所有主语。
代码:
PREFIX foaf: <http://xmlns.com/foaf/0.1/> SELECT ?s ?homepage where { ?s foaf:homepage ?homepage . }
查询结果:
案例3:列出所有的大学即对应的国家
代码:
select distinct ?name ?country where { ?name a <http://dbpedia.org/ontology/University>. optional { ?name <http://dbpedia.org/ontology/country> ?country. } }
查询效果:
案例4:查询中国大学列表
代码:
select distinct ?name where { ?name a <http://dbpedia.org/ontology/University>. ?name <http://dbpedia.org/ontology/country><http://dbpedia.org/resource/China>. }
查询效果:
案例5:查询中国大学人数>30000的大学列表
代码:
select distinct ?name ?number where { ?name a <http://dbpedia.org/ontology/University>. ?name <http://dbpedia.org/ontology/country><http://dbpedia.org/resource/China>. ?name <http://dbpedia.org/ontology/numberOfStudents>?number. FILTER(?number>30000) }
查询效果: