SPARQL:查询多种语言的Wikidata标签

时间:2018-03-05 20:15:03

标签: sparql wikidata blazegraph

我正在尝试从维基数据的SPARQL端点获取多种语言的标签。以下示例为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

但是,这会返回以下错误:

  

未知错误:只有一个"最后运行"加入任何小组

是否有解决方案可以使用多种语言获取标签?

2 个答案:

答案 0 :(得分:4)

标签服务优化工具adds与标签服务hint:Prior hint:runLast true 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);
});

应该在第一个之后向所有标签服务调用添加hint:Prior hint:runLast false

您的查询应该是:

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

显然,可以使用常规SPARQL来获取多种语言的标签,这样就不那么冗长了。然而,标签服务提供语言回退,包括Q-id的最后一个。

来源:

答案 1 :(得分:2)

rdfs:label可以在没有wikibase:label服务的情况下直接使用:

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