Wikidata SPARQL:UNION丢值、OPTIONAL变量及单列查询问题
问题原因
第一次UNION查询丢失官方语言标签,是因为Wikidata中单个国家可能关联多个官方语言,UNION分支内直接用单变量匹配语言码时,会出现变量绑定的匹配偏差,导致非英语标签无法正确关联到所有官方语言对应的语言码。
第二次OPTIONAL查询中用||做语言判断的逻辑本身是正确的,问题仅在于没有将rdfs:label和skos:altLabel的取值绑定到同一个变量做聚合,才会返回两列结果。
正确查询语句
直接通过SPARQL属性路径语法同时匹配标签和别名属性,将所有结果绑定到同一个变量后聚合,即可得到单列返回的所有英文、官方语言对应的标签和别名:
SELECT ?country_iso (GROUP_CONCAT(DISTINCT(?all_name); separator = ", ") AS ?all_names) WHERE { VALUES ?country { wd:Q878 } # 测试用,问题解决后可移除或替换为目标国家列表 VALUES ?any_kind_of_country { wd:Q6256 wd:Q3624078 wd:Q783733 } ?country wdt:P31 ?any_kind_of_country . hint:Prior hint:runFirst true . ?country wdt:P297 ?country_iso ; wdt:P37 ?official_lang . ?official_lang wdt:P424 ?wm_lang_code . # 同时匹配正式标签、别名,统一绑定到同一变量 ?country (rdfs:label|skos:altLabel) ?all_name . # 过滤仅保留英语、所有官方语言对应的内容 FILTER(LANG(?all_name) = "en" || LANG(?all_name) = ?wm_lang_code) } GROUP BY ?country_iso ORDER BY ?country_iso
语法说明
(rdfs:label|skos:altLabel)是SPARQL标准的交替属性路径写法,会同时返回两个属性的所有取值,不需要拆分多个OPTIONAL或UNION块- 过滤条件中的
||逻辑完全符合SPARQL规范,会自动匹配英语以及当前国家关联的所有官方语言的内容,不会出现漏匹配 DISTINCT用于去重,避免同一个名称同时作为标签和别名存在时重复出现在结果中
内容的提问来源于stack exchange,提问作者Marc Carré
相关产品推荐
相关产品推荐

