Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SPARQL: Querying Wikidata labels for more than one language

I am trying to get labels in multiple languages from Wikidata's SPARQL endpoint. The following example is given here:

SELECT ?country ?country_EN ?country_DE ?country_FR
   WHERE {
     ?country wdt:P31 wd:Q185441. # member state of the European Union
     SERVICE wikibase:label { bd:serviceParam wikibase:language "en".
            ?country rdfs:label ?country_EN.
     }
     SERVICE wikibase:label { bd:serviceParam wikibase:language "de".
            ?country rdfs:label ?country_DE.
     }
     SERVICE wikibase:label { bd:serviceParam wikibase:language "fr".
            ?country rdfs:label ?country_FR.
     }
}

Try it here

However, this returns the following error:

Unknown error: there can be only one "run last" join in any group

Is there a solution to get labels in more than one language?

like image 568
Udi Avatar asked Sep 12 '25 01:09

Udi


1 Answers

The label service optimizer adds a hint:Prior hint:runLast true hint to the label service unless there’s another explicit hint:

LabelServiceUtils.getLabelServiceNodes(op).forEach(service -> {
    if (service.getProperty(QueryHints.RUN_LAST)  != null ||
        service.getProperty(QueryHints.RUN_FIRST) != null) {
        return;
    }
    service.setProperty(QueryHints.RUN_LAST, TRUE);
});

One should just add hint:Prior hint:runLast false to all the label service invocations after the first one.

Your query should be:

SELECT ?country ?country_EN ?country_DE ?country_FR
   WHERE {
     ?country wdt:P463 wd:Q458. # member state of the European Union
     SERVICE wikibase:label { bd:serviceParam wikibase:language "en".
            ?country rdfs:label ?country_EN.
     }
     SERVICE wikibase:label { bd:serviceParam wikibase:language "de".
            ?country rdfs:label ?country_DE.
     } hint:Prior hint:runLast false.
     SERVICE wikibase:label { bd:serviceParam wikibase:language "fr".
            ?country rdfs:label ?country_FR.
     } hint:Prior hint:runLast false.
}

Try it!

Obviously, it is possible to fetch labels in multiple languages using regular SPARQL, and this is less verbose. However the label service provides language fallbacks, including the final one to Q-id's.

Source:

  • https://phabricator.wikimedia.org/T175840
like image 121
Stanislav Kralin Avatar answered Sep 14 '25 17:09

Stanislav Kralin