SPARQL: Querying Wikidata labels for more than one language

后端 未结 2 858
孤街浪徒
孤街浪徒 2021-01-20 17:29

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_         


        
相关标签:
2条回答
  • 2021-01-20 17:35

    rdfs:label can be used directly without the wikibase:label service:

    SELECT ?country ?country_en ?country_de ?country_fr
       WHERE {
         ?country wdt:P31 wd:Q185441. # member state of the European Union
         OPTIONAL {?country rdfs:label ?country_en filter (lang(?country_en) = "en")}.
         OPTIONAL {?country rdfs:label ?country_de filter (lang(?country_de) = "de")}.
         OPTIONAL {?country rdfs:label ?country_fr filter (lang(?country_fr) = "fr")}.
    }
    

    Try it here

    0 讨论(0)
  • 2021-01-20 17:51

    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
    0 讨论(0)
提交回复
热议问题