Следующий SPARQL запрашивает Wikidata для всех европейских стран (суверенные государства, Q3624078) и загружает для каждой страны последние несколько известных чисел населения (P: 1082 населения):
SELECT DISTINCT ?item $itemLabel ?population ?popDate
WHERE {
?item wdt:P31 wd:Q3624078. #select only sovereign states
?item wdt:P706/wdt:P361*|wdt:P361*|wdt:P30 wd:Q46. #select items which are geographically in Europe
?item p:P31 ?statement.
?statement ps:P31 wd:Q3624078.
FILTER NOT EXISTS { ?statement pq:P582 ?end. } #filter out items which are not sovereign states anymore
FILTER NOT EXISTS { ?item wdt:P31 wd:Q3024240. } #filter out historical countries
OPTIONAL {
?item p:P1082 ?popStatement.
?popStatement ps:P1082 ?population;
pq:P585 ?popDate.
FILTER ( YEAR(?popDate) >= 2014 )
}
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
ORDER BY ASC($itemLabel)
Вы можете проверить это здесь .
Как я могу ограничить данные о населении самым последним числом населения?
Я пытался ограничить его определенным годом (FILTER (YEAR(?popDate) = 2018
), но это не работает, потому что в некоторых странах нет оценки численности населения на 2018 год.
Это похоже на запрос SQL, такой как SELECT * FROM country c INNER JOIN population p ON p.CountryId = c.Id
. В SQL вам потребуется создать подзапрос с оператором MAX, чтобы найти самые последние данные о населении по странам. Как я могу добиться того же в SPARQL?