假设我想获得每个国家(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". }
}
我知道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有何不同?当我在维基数据上查看每个国家/地区的人口数据时,我看到列出了多个人口点,但查询只返回了一个。
答案 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处理。