针对WIKIDATA的SPARQL查询的结果集忽略偏移量

时间:2017-06-26 07:02:44

标签: select sparql wikidata

我希望找到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,但我认为有一些/很多。

我需要添加什么才能获得预期效果?

1 个答案:

答案 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中提取数字:

  1. 使用

    提取http://www.wikidata.org/entity/Q之后的值

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

  2. 使用XPath构造函数xsd:integer()
  3. 转换为整数值
  4. BIND变量
  5. 最终查询:

    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