Как получить метки Викиданных на нескольких языках?

Я хочу получить регионы Италии на итальянском и английском языках. Я могу получить тогда в одном языке с этим запросом ...

PREFIX wikibase: <http://wikiba.se/ontology#>
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>

SELECT DISTINCT ?RegionIT ?RegionITLabel ?ISO_code ?Geo
{
?RegionIT wdt:P31 wd:Q16110;
wdt:P300 ?ISO_code; 
wdt:P625 ?Geo 
           SERVICE wikibase:label { bd:serviceParam wikibase:language "it"  }
}

ORDER BY ?regionITLabel

... но добавление другого языка с использованием стандартного синтаксиса SPARQL не работает.


person Ivo Velitchkov    schedule 06.04.2017    source источник
comment
Несколько меток с использованием службы меток: stackoverflow.com/questions/49118702/   -  person Stanislav Kralin    schedule 06.03.2018


Ответы (2)


... но добавление другого языка с использованием стандартного синтаксиса SPARQL не работает.

Как ты это делаешь? Это работает:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX wikibase: <http://wikiba.se/ontology#>
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>

SELECT DISTINCT ?RegionIT ?label (lang(?label) as ?label_lang)  ?ISO_code ?Geo
{
    ?RegionIT wdt:P31 wd:Q16110;
              wdt:P300 ?ISO_code; 
              wdt:P625 ?Geo ;
              rdfs:label ?label
}
order by ?RegionIT

Ссылка для проверки запроса

Чтобы ограничить только итальянский и английский фильтр по языку:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX wikibase: <http://wikiba.se/ontology#>
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>

SELECT DISTINCT ?RegionIT ?label ?ISO_code ?Geo
{
    ?RegionIT wdt:P31 wd:Q16110;
              wdt:P300 ?ISO_code; 
              wdt:P625 ?Geo ;
              rdfs:label ?label
    filter(lang(?label) = 'it' || lang(?label) = 'en')
}
order by ?RegionIT

Ссылка, чтобы попробовать запрос

Очевидно, это умножает количество результатов, по одному для каждого языка. Если это проблема, вы можете сделать:

...
rdfs:label ?label_it , ?label_en
filter(lang(?label_it) = 'it' && lang(?label_en) = 'en')
...

что, по сути, и делает языковая служба.

person user205512    schedule 06.04.2017
comment
Спасибо. Это действительно ответ на вопрос. Мое намерение состояло в том, чтобы узнать, как достичь этого с помощью SERVICE wikibase:label, но это не было ясно из вопроса. Тем не менее, я был бы признателен за любые идеи по этому поводу. - person Ivo Velitchkov; 06.04.2017
comment
вы можете запросить несколько языков с помощью SERVICE wikibase:label, например: SERVICE wikibase:label { bd:serviceParam wikibase:language "it,en" }, но это всего лишь резервный механизм, вы получите только первую определенную метку из запрошенных языков, а не одну метку для каждого языка. - person maxlath; 07.04.2017

Перечислим все страны на английском и русском языках.

#List of countries in English and Russian
SELECT ?country ?label_en ?label_ru
WHERE
{
    ?country wdt:P31 wd:Q6256.
    ?country rdfs:label ?label_en filter (lang(?label_en) = "en").
    ?country rdfs:label ?label_ru filter (lang(?label_ru) = "ru").
}

SPARQL-запрос

Этот пример был взят из учебника Исследования в области программирования Викиданных, раздел «Страны».

person Community    schedule 31.07.2017
comment
Именно этого я и хотел. Спасибо за быструю демонстрацию. - person Ranjith Siji; 29.08.2018