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

Bri*_*ian 6 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". }
}
Run Code Online (Sandbox Code Playgroud)

链接到查询控制台

我知道 GROUP BY/GROUP CONCAT 但是当我更喜欢只有一个结果时,它仍然会给我每一个结果。GROUP BY/SAMPLE 也将不起作用,因为 SAMPLE 不能保证采用最新的结果。

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

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

SELECT
?country 
?countryLabel 
?population
WHERE {
  ?country wdt:P31 wd:Q6256.
  OPTIONAL { ?country wdt:P1082 ?population. }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
Run Code Online (Sandbox Code Playgroud)

而相同的查询但对于 HDI 会返回每个国家/地区的多个结果:

SELECT
?country 
?countryLabel 
?hdi
WHERE {
 ?country wdt:P31 wd:Q6256.
  OPTIONAL { ?country wdt:P1081 ?hdi. }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
Run Code Online (Sandbox Code Playgroud)

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

Sta*_*lin 4

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

问题 1是 SPARQL 查询的重复 ,用于仅获取最新日期的结果

这种技术可以解决问题:

FILTER NOT EXISTS {
    ?country p:P1081/pq:P585 ?hdi_date_ .
    FILTER (?hdi_date_ > ?hdi_date)
}
Run Code Online (Sandbox Code Playgroud)

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


问题 2与某些城市不是城市或大城市的实例重复?

您不能使用 wdt-predicates,因为缺少的语句不是true
它们是普通等级语句,但有一个首选等级语句。

真实的语句表示对于给定的属性具有最佳的未弃用排名的语句。即,如果属性 P2 存在首选陈述,则只有 P2 的首选陈述才会被认为是真实的。否则,所有正常等级的陈述都被认为是真实的。

之所以P1081总是有 Preferred 语句是因为该属性是由PreferentialBot处理的。