我希望取回加拿大的10个公民,而结果应该以最低的wikidata id q ... q ...它匹配(即搜索应在https://www.wikidata.org/wiki/q1(:
SELECT DISTINCT ?item ?itemLabel
WHERE {
?item wdt:P31 wd:Q5 .
?item wdt:P27 wd:Q16 .
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" . }
}
LIMIT 10 OFFSET 0
,但库伦的结果似乎提供了任意发现,例如https://www.wikidata.org/wiki/q116544(=冰球运动员Danny Gare(
我尚未手动检查Wikidata Q ID的加拿大公民的任何条目,而不是Q116544,但我认为有一些/很多。
我必须添加什么才能获得预期结果?
不确定为什么要这个,因为订购很昂贵,但是我们去了:
第一次尝试
只需在?item
上使用ORDER BY
:
SELECT DISTINCT ?item ?itemLabel WHERE {
?item wdt:P31 wd:Q5 .
?item wdt:P27 wd:Q16 .
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" . }
}
ORDER BY ASC(?item)
LIMIT 10 OFFSET 0
缺点,排序是在词典上完成的...
解决方案
使用strafter
函数从实体URI中提取数字:
http://www.wikidata.org/entity/q提取值
strafter(str(?item), "http://www.wikidata.org/entity/Q")
通过使用XPATH构造函数
将转换为整数值xsd:integer()
BIND
到变量
最终查询:
SELECT DISTINCT ?item ?itemLabel WHERE {
?item wdt:P31 wd:Q5 .
?item wdt:P27 wd:Q16 .
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" . }
BIND(xsd:integer(strafter(str(?item), "http://www.wikidata.org/entity/Q")) as ?number)
}
ORDER BY ASC(?number)
LIMIT 10 OFFSET 0