SPARQL:查询Wikidata标签中的一种以上语言

Udi*_*Udi 2 sparql wikidata blazegraph

我正在尝试从Wikidata的SPARQL端点获取多种语言的标签。此处给出以下示例:

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.
     }
}
Run Code Online (Sandbox Code Playgroud)

在这里尝试

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

未知错误:任何组中只能有一个“最后运行”联接

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

Udi*_*Udi 5

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")}.
}
Run Code Online (Sandbox Code Playgroud)

在这里试试


Sta*_*lin 5

标签服务优化增加了一个hint:Prior hint:runLast true 提示的标签服务,除非还有另外一个明确的提示:

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);
});
Run Code Online (Sandbox Code Playgroud)

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

您的查询应为:

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.
}
Run Code Online (Sandbox Code Playgroud)

试试吧!

显然,可以使用常规SPARQL提取多种语言的标签,而且不太冗长。但是,标签服务提供了语言回退,包括最后一个到Q-id的回退。

资源: