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
相关产品推荐
相关产品推荐

