You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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é

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 11:54:20