SPARQL:如果第一个选项不可用,如何以可用语言获取标签

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)

链接

如果第一种语言失败,如何请求以任何一种可用语言返回标签?

Jos*_*lor 5

首先,更喜欢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 的原始解决方案

不过,在那之后,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)