如何从Wikidata属性中仅获取最新值?

时间:2018-03-02 09:36:43

标签: sparql wikidata

假设我想获得每个国家(Q6256)及其最近记录的人类发展指数(P1081)值的清单。该国的人类发展指数属性包含在不同时间点采集的数据点列表,但我只关心最新数据。此查询不起作用,因为它为每个国家/地区(每个人类发展指数数据点一个)获得多个结果:

SELECT
?country 
?countryLabel 
?hdi_value
?hdi_date
WHERE {
  ?country wdt:P31 wd:Q6256.
  OPTIONAL { ?country p:P1081 ?hdi_statement. 
         ?hdi_statement ps:P1081 ?hdi_value.
         ?hdi_statement pq:P585 ?hdi_date.
       }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}

Link to Query Console

我知道GROUP BY / GROUP CONCAT,但是当我更喜欢拥有一个结果时,它仍会给我所有结果。 GROUP BY / SAMPLE也不起作用,因为不保证SAMPLE会获取最新的结果。

感谢任何有关示例查询的帮助或链接!

P.S。我感到困惑的另一件事是为什么此查询中的人口P1082每个国家只返回一个人口结果

SELECT
?country 
?countryLabel 
?population
WHERE {
  ?country wdt:P31 wd:Q6256.
  OPTIONAL { ?country wdt:P1082 ?population. }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}

虽然相同的查询但HDI会为每个国家/地区返回多个结果:

SELECT
?country 
?countryLabel 
?hdi
WHERE {
 ?country wdt:P31 wd:Q6256.
  OPTIONAL { ?country wdt:P1081 ?hdi. }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}

导致行为不同的人口和HDI有何不同?当我在维基数据上查看每个国家/地区的人口数据时,我看到列出了多个人口点,但查询只返回了一个。

1 个答案:

答案 0 :(得分:1)

您的问题都是重复的,但我会尝试在现有答案中添加有趣的事实。

问题1 SPARQL query to get only results with the most recent date重复。

这种技巧可以解决问题:

FILTER NOT EXISTS {
    ?country p:P1081/pq:P585 ?hdi_date_ .
    FILTER (?hdi_date_ > ?hdi_date)
}

但是,您应该在OPTIONAL的之外添加此子句,它在OPTIONAL内部不起作用(我不确定这不是错误)。

问题2 Some cities aren't instances of city or big city?

的副本

您不能使用wdt-predicates,因为缺少的语句不是 truthy
  它们是正常级别的陈述,但有一个首选等级陈述。

  

Truthy语句表示对给定属性具有最佳非弃用等级的语句。也就是说,如果存在属性P2的首选语句,那么只有P2的首选语句才会被认为是真实的。否则,所有正常等级的陈述都被认为是真实的。

P1081始终具有首选语句的原因是此属性由PreferentialBot处理。