我正在尝试列出包含英文简称的国家/地区:
# get a list countries with the corresponding ISO code
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX wikibase: <http://wikiba.se/ontology#>
SELECT ?country ?countryLabel ?shortName (MAX(?pop) as ?population) ?coord ?isocode
WHERE
{
# instance of country
?country wdt:P31 wd:Q3624078.
OPTIONAL {
?country rdfs:label ?countryLabel filter (lang(?countryLabel) = "en").
}
OPTIONAL {
# https://www.wikidata.org/wiki/Property:P1813
?country wdt:P1813 ?shortName.
}
OPTIONAL {
# get the population
# https://www.wikidata.org/wiki/Property:P1082
?country wdt:P1082 ?pop.
}
# get the iso countryCode
{ ?country wdt:P297 ?isocode }.
# get the coordinate
OPTIONAL { ?country wdt:P625 ?coord }.
}
GROUP BY ?country ?countryLabel ?shortName ?population ?coord ?isocode
ORDER BY ?countryLabel
不幸的是,还会返回标志和“ shortName”的非英语版本。我尝试使用子查询,但是超时。我想避免使用Wikibase标签服务,因为我需要在my local wikidata copy which uses Apache Jena
上运行查询我如何获取国家/地区的英文缩写?例如。 People's republic of china的中国和United States of America的美国?
答案 0 :(得分:1)
这里有两个问题:
filter (lang(?shortName) = "en")
模式内使用OPTIONAL
子句因此,总的来说,我们取代
OPTIONAL {
# https://www.wikidata.org/wiki/Property:P1813
?country wdt:P1813 ?shortName.
}
作者
OPTIONAL {
?country p:P1813 ?shortNameStmt. # get the short name statement
?shortNameStmt ps:P1813 ?shortName # the the short name value from the statement
filter (lang(?shortName) = "en") # filter for English short names only
filter not exists {?shortNameStmt pq:P31 wd:Q28840786} # ignore flags (aka emojis)
}
不过,由于多个缩写,某些国家/地区会有多个条目。解决此问题的一种方法是使用一些汇总函数,例如sample
或min/max
并在每个国家/地区仅选择一个短名称。