维基数据查询所有语言的城市名称

时间:2017-06-20 14:40:49

标签: sparql wikidata

我用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" .
  }

但它返回

  

未知错误:预期对象位置中的变量   绑定语言。

1 个答案:

答案 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')
}