我用wikidata的人口查询citiy。通过语言服务,我可以使用给定的语言进行标记。
但我希望一次性使用所有语言或至少以多种语言获取城市名称。我试图通过*作为语言,但我没有让所有的城市名都归还。
我是否必须对每种语言进行一次查询?
这是我的查询
SELECT DISTINCT ?city ?cityLabel ?population
WHERE
{
?city wdt:P31/wdt:P279* wd:Q515 .
?city wdt:P1566 "2950157" .
?city wdt:P1082 ?population .
SERVICE wikibase:label {
bd:serviceParam wikibase:language "en" .
}
}
我也尝试过设置像这样的语言
SERVICE wikibase:label {
bd:serviceParam wikibase:language "en" .
bd:serviceparam wikibase:language "de" .
}
但它返回
未知错误:预期对象位置中的变量 绑定语言。
答案 0 :(得分:2)
错误告诉您必须在选择过程中将德语标记绑定到变量(?cityGe)。
SELECT DISTINCT ?city ?cityLabel ?cityGe ?population
WHERE
{
?city wdt:P31/wdt:P279* wd:Q515 .
?city wdt:P1566 "2950157" .
?city wdt:P1082 ?population .
SERVICE wikibase:label {
bd:serviceParam wikibase:language "en" .
bd:serviceParam wikibase:language "de" .
}
}
但是,这并不能解决您的问题,因为这只是一种回退机制。如果它找不到英文,那么它会给你德语标签。有一些例子here。
只需一个变量就可以简化如下:
SERVICE wikibase:label { bd:serviceParam wikibase:language "en,de" }
但是,正如AKSW指出的那样,你可以使用rdfs:label来解决你的问题:
SELECT DISTINCT ?city ?label ?population
WHERE
{
?city wdt:P31/wdt:P279* wd:Q515 .
?city wdt:P1566 "2950157" .
?city wdt:P1082 ?population .
?city rdfs:label ?label
filter(lang(?label) = 'de' || lang(?label) = 'en')
}