Search code examples
sparqlwikidata

How to get Wikidata labels in more than one language?


I'm traying to get the regions of Italy in both Italian and English. I can get then in one laguage with this query...

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

... but adding another language using the standard SPARQL syntax doesn't work.


Solution

  • ... but adding another language using the standard SPARQL syntax doesn't work.

    How are you doing that? This works:

    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
    

    Link to try query

    To limit to just Italian and English filter on the lang:

    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
    

    Link to try query

    Obviously that multiplies the number of results, one for each language. If that's an issue you can do:

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

    which is effectively what the language service does.