针对Wikidata的SPARQL查询的结果集忽略了偏移



我希望取回加拿大的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中提取数字:

  1. http://www.wikidata.org/entity/q提取值

    strafter(str(?item), "http://www.wikidata.org/entity/Q")

  2. 通过使用XPATH构造函数xsd:integer()

    将转换为整数值
  3. 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

最新更新