我希望找到10个加拿大公民,而结果集应该从最低的wikidata ID 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
但是,result似乎提供了任意的结果,例如https://www.wikidata.org/wiki/Q116544(=冰球运动员Danny Gare)
我没有手动检查任何加拿大公民的条目,其中WIKIDATA Q id低于Q116544,但我认为有一些/很多。
我需要添加什么才能获得预期效果?
答案 0 :(得分:1)
不确定为什么要这样,因为订购费用很高,但我们走了:
只需在ORDER BY
上使用?item
:
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")
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