Cpt*_*emo 5 sparql wikidata linked-data
如果查询返回的Wikidata资源没有以我过滤的语言提供的可用标签,则获得一个空单元格。
SELECT *
WHERE
{
?country wdt:P31 wd:Q6256.
?country rdfs:label ?country_name
FILTER(LANG(?country_name) = 'jbo').
}
Run Code Online (Sandbox Code Playgroud)
如果第一种语言失败,如何请求以任何一种可用语言返回标签?
首先,更喜欢langMatches来检查语言标签。这在您的情况下尤其重要,因为例如您可能想要一个英文标签,而langMatches(lang(?label), "en")将找到带有标签“en”或“en-GB”的标签"、"en-US" 等。这些是语言的区域变体,langMatches可以帮助您找到它们。
@svick 在评论中注意到,原始解决方案以英文名称与非英文名称的笛卡尔积中的每个元素对应一行结束。您可以通过使用select distinct来避免这种情况。但确实有更好的方法:只需在两个可选的s 中使用相同的变量;第一个检查英文标签,第二个检查非英文标签。如果第一个成功,那么第二个永远不会被调用。也就是说,只需执行以下操作:
select ?country ?label {
?country wdt:P31 wd:Q6256
optional {
?country rdfs:label ?label
filter langMatches(lang(?label), "en")
}
optional {
?country rdfs:label ?label
}
}
Run Code Online (Sandbox Code Playgroud)
不过,在那之后,coalesce会做你想做的事。它接受多个参数,并返回第一个有值的参数。因此,您可以匹配可选块中的首选语言和另一种语言中的任何语言,并合并值:
select distinct ?country (coalesce(?enLabel, ?anyLabel) as ?label) {
?country wdt:P31 wd:Q6256
optional {
?country rdfs:label ?enLabel
filter langMatches(lang(?enLabel), "en")
}
optional {
?country rdfs:label ?anyLabel
}
}
Run Code Online (Sandbox Code Playgroud)