2017-06-20 102 views
1

我从wikidata中查询城市的人口。随着语言服务我得到他用给定的语言标签。Wikidata查询所有语种的城市名称

但我想获得所有语言的城市名或至少以多种语言一次。我试图通过*作为语言,但我没有得到所有城市名称返回。

我必须为每种语言查询一次吗?

这是我的查询

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

但它返回

Unknown error: Expected a variable in the object position to which to bind the language.

+0

在单行或每种语言有多行? – AKSW

+0

并不重要,只是希望他们检查一些翻译。但现在对于哪个字符串属于哪种语言来说很重要。 –

+0

根据https://www.mediawiki.org/wiki/Wikidata_query_service/User_Manual#Label_service,它应该可以工作 – AKSW

回答

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:标签您的问题:

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') 
} 
+2

或者更加紧凑的SPARQL 1.1:'filter(lang(?label)in('de','en'))'' – AKSW

相关问题