SPARQL查询语句
1. 基本语法
SELECT<variables>
WHERE {
<graph pattern>
}
<variables>是所要提取的主语或者宾语
<graph pattern>是所要查询的三元组模式
eg:
SELECT ?ablum
WHERE{
?ablim rdf:type :Ablum .
}
?ablum是一个变量,可以随便起,第一个字符必须是
?
查询条件是?ablum
这个变量是主语,根据rdf:type
这个谓语,可以得到:Ablum
这个宾语,这个宾语也有前缀,表示这是当前数据库定义的
如果要返回所有符合要求的记录,变量可以使用*代替,并且
WHERE
也可以省略,最后一个三元组的结尾句号也可以省略
SELECT * {?ablum a : Ablum}
# a 相当于 rdf:type
如果要返回更多的内容
SELECT ?album ?artist
{
?album a : Album
?album :artist ?artist .
}
2. 使用维基数据进行示例查询
维基数据使用RDF进行存储,因此我们可以利用该资源进行简单的demo学习
在山西省-wiki中,其URL为https://www.wikidata.org/wiki/Q46913
,可以看到该URL结尾是Q46913,这就是山西省这个条目在维基数据中的编号,也就是主语
向下滑动找到contains administrative territorial entity
条目,点击进入,发现该条目的URL为https://www.wikidata.org/wiki/Property:P150
,其最后为P150,这便是谓语动词的编号,意为所包含的行政实体
,通过主语与谓语动词,便可以找到对应的宾语,进而显示在页面中,这就是RDF的查询过程,接下来我们用SPARQL代码进行模拟
wiki数据查询页面提供了使用SPARQL语言进行查询的功能,根据上述分析,我们的主语为Q46913,谓语是P150,同时该部分由维基数据定义,因此我们要使用维基数据命名空间的前缀
wd:标识维基数据条目
wdt:标识维基数据定义的谓语关系
SELECT >area
WHERE {
wd:Q46913 wdt:P150 ?area .
}
运行之后我们可以得到运行结果
可见返回的都是条目编号,这意味着查询到的也是其他的RDF资源,我们可以增加一些内容来让查询结果更清晰
SELECT
?area
?areaLabel
WHERE
{
wd:Q46913 wdt:P150 ?area .
?ared rdfs:label ?areaLabel
FILTER(LANGMATCHES(LANG(?areaLabel)), "zh-CN")
}
该查询语句表示查询area
和areaLabel
两个变量,根据WHERE条件,area
是主语wd:Q46913
在谓语wdt:P150
下所对应的宾语,然后使用area
作为主查询在rdfs:label
谓语下所对应的宾语areaLabel
,同时使用FILTER过滤,只选择中文内容
查询结果如图所示
在添加一个查询人口的变量,其谓语可以通过在维基进入对应页面观察URL得到,然后利用该人口数量进行排序,将排序结果只取一条,即第一条
SELECT
?area
?areaLabel
?popTotal
WHERE
{
wd:Q46913 wdt:P150 ?area .
?area rdfs:label ?areaLabel
FILTER(LANGMATCHES(LANG(?areaLabel)), "zh-CN")
?area wdt:P1802 ?popTotal
}
ORDER BY desc(?popTotal)
limit 1
由此得到了山西省人口最多的城市
SPARQL还有更多的查询方法,更加详细的教程请参考