概述
当网络上的信息被表示为RDF后,可以利用SPARQL查询语言来存取其中的相关部分,以达到推理和应用的需求。SPARQL是专门为RDF设计的。
执行SPARQL的软件基础
以RDF描述的资源被存储在一个名为三元组存储库(triple store)的地方,每个三元组存储库都提供一个端点(endpoint)来提交SPARQL查询。端点本质上是一个地址,客户端通过HTTP协议来向端点发送查询。三元组存储库实际上是一个RDF数据库,也称作图存储库。
匹配模式
图模式
在SPARQL中,变量表示为首字符的?
的字符串,将RDF三元组中的任何一个元素替换为变量,称之为图模式(graph pattern)。三元组存储库通过匹配这个模式来返回结果。在SPARQL查询语句中:
- PREFIX关键词:指明各URL的缩写
- SELECT关键词:指明我们在查询中感兴趣的变量
- WHERE关键词:指明需要被匹配的图模式
比如:
PREFIX swp: <a URL>.
PREFIX dbpedia-owl: <a URL>.
SELECT ?location
WHERE
{
swp:BaronWayBuilding dbpedia-owl:location ?location.
}
返回的查询结果称之为绑定(binding)的映射。查询的目的就是尝试着找到一个匹配指定图模式的三元组集合。在SPARQL查询中,变量可以在三元组的任何位置,变量也可以有多个。当返回的三元组数量巨大时,我们可以使用LIMIT关键词来指定返回的三元组个数。比如:
PREFIX swp: <a URL>.
SELECT ?p ?o
WHERE
{
swp:BaronWayBuilding ?p ?o.
}
属性路径
SPARQL提供了一种精确匹配单个模式或者由多个三元组模式构成的链的机制,称之为属性路径(property path)。比如:
PREFIX swp: <a URL>.
...
SELECT ?apartment
WHERE
{
?apartment swp:isPartOf ?building.
?building depedia-owl:location dbpedia:Amsterdam.
//上述两个语句可以表述为链的形式
?apartment swp:isPartOf/depedia-owl:location dbpedia Amsterdam.
}
过滤器
使用FILTER关键词来定义过滤器,regex和str是两个常用函数。regex函数用于匹配字符串,而str函数用于将资源和文字转换为可以在正则表达式中使用的字符串表示。在过滤字符串时,SPARQL支持正则表达式。
SELECT ?apartment
WHERE
{
?apartment swp:hasNumberOfBedrooms ?bedrooms.
FILTER(?bedrooms>2).
}
SELECT ?apartment
WHERE
{
?apartment swp:address ?address.
FILTER regex(?address,"^4 Baron Way").
}
构造子
在网络上,不同的资源将有不同的描述模式(schema),比如dbpedia-owl:location
和dbpedia-owl:locationCity
这两个不同的属性描述,但在语义上它们是等价的。在查询时,SPARQL提供了构造子来处理这种资源描述不一致的情形。
- UNION关键词用于告诉三元组存储库返回那些仅匹配一个图模式或两个图模式都匹配的结果;
- OPTIONAL关键词告诉三元组存储库为特定的图模式返回结果,如果能找到的话
SELECT ?apartment
WHERE
{
{?apartment dbpedia-owl:location dbpedia:Amsterdam.}
UNION
{?apartment dbpedia-owl:locationCity dbpedia:Amsterdam.}
OPTIONAL
{?apartment rdfs:label ?label.}
//使用|运算符可以简化上面的语句
{?apartment dbpedia-owl:location|dbpedia-owl:locationCity dbpedia:Amsterdam.}
OPTIONAL
{?apartment rdfs:label ?label.}
}
组织结果集
对查询的返回结果进行处理,比如分组、计数或者排序等。
- DISTINCT关键词:消除结果集中的重复值。
SELECT DISTINCT ?name WHERE
- ORDER BY关键词:对返回结果集排序,其中DESC表示降序排列,ASC表示升序。
SELECT ?age WHERE{} ORDER BY DESC (?age)
- 聚集函数:COUNT用于计数,SUM用于求和,MIN用于求最小值,MAX用于求最大值,AVG用于求平均值。
SELECT (AVG(?age) AS ?avgAge) WHERE
。AS关键词用于指定结果集中的变量。 - GROUP BY关键词:用于对结果集进行分组。
其他形式的SPARQL查询
除了SELECT查询之外,常用的还有ASK和CONSTRUCT查询。
- ASK查询:用以判断一个数据集中是否存在一个指定的图模式,返回值为
true
或者false
。 - CONSTRUCT查询:用来检索RDF图,而非一组变量绑定。CONSTRUCT查询经常用于在模式(schema)之间转换——通过查询特定的模式,并用目标模式中的属性替换。如下表示创建一个图,将拥有卧室数量大于2的公寓标记为大公寓:
CONSTRUCT
{
?apartment swp:hasNumberOfBedrooms ?bedrooms.
?apartment swp:isBigApartment true.
}
WHERE
{
?apartment swp:hasNumberOfBedrooms ?bedrooms.
}
FILTER (?bedrooms>2)
SPARQL插入和删除
SPARQL提供了一系列关键词进行三元组的插入、加载和删除。
- INSERT DATA:用于插入指定三元组。
INSERT DATA {swp:LuxuryApartment rdfs:subClassOf swp:Apartment}
- LOAD关键词:用于将一个RDF文件加载进一个三元组存储库
- DELETE DATA:删除一个指定的三元组,这个三元组必须被完整地指定,不能包含任何变量。
DELETE DATA {swp:LuxuryApartment rdfs:subClassOf swp:Apartment}
- DELETE WHERE:删除匹配给定图模式的三元组。
- CLEAR ALL:删除三元组存储库的全部内容。