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

Wikidata SPARQL如何查询大英帝国所有前殖民地国家

问题根因

你写的SPARQL有两个核心逻辑错误,所以查不到历史上的殖民地:

  • wdt:P31前缀只会返回当前生效的实例分类关系,你直接关联wd:Q133156(殖民地),只能匹配到现在仍然被归类为殖民地的实体,所有独立后取消殖民地分类的国家都不会被命中
  • 没有加宗主国限定,就算能查到殖民地,也不是专属于大英帝国的结果
修改方案

Wikidata存储历史属性不会直接用wdt:前缀的简化属性,要查带时间/状态变化的关系,必须用p:前缀访问完整陈述节点,拿到对应的限定条件,只要历史上存在过对应关系就会被匹配,不需要手动判断关系是否已终止。
修改后可直接运行的代码如下:

SELECT DISTINCT ?country ?countryLabel WHERE {
  # 匹配所有曾属于殖民地类别的实体,不限当前状态
  ?country p:P31 ?instanceRecord .
  ?instanceRecord ps:P31 wd:Q133156 ; # 分类为殖民地
                  pq:P17 wd:Q174193 . # 该殖民阶段的宗主国为大英帝国
  # 限定结果为国家实体(含历史政权、当前主权国家)
  ?country wdt:P31 wd:Q6256 .
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],zh,en". }
}
可选调整
  • 仅查询已独立的前殖民地:如果要排除当前仍为英国海外领地的实体,在查询块内加一行过滤规则即可:FILTER NOT EXISTS { ?country wdt:P31 wd:Q133156 }
  • 限定特定历史时期范围:如果要查某段时间内属于英国殖民地的实体,给殖民记录加时间过滤即可,比如匹配1900-1945年间的英国殖民地,补充以下代码:
?instanceRecord pq:P580 ?startDate ;
                pq:P582 ?endDate .
FILTER (?startDate <= "1945-12-31"^^xsd:date && ?endDate >= "1900-01-01"^^xsd:date)

内容的提问来源于stack exchange,提问作者Trinker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 09:42:29