如何通过SPARQL在Wikidata中一次性查询多个城市的面积等信息?
Wikidata 批量城市信息SPARQL查询解决方案
首先修正你原有查询的小问题:你之前单城市查询里写的?label是变量,正确写法应该是用固定属性rdfs:label匹配城市名称。
完整可运行批量查询代码
SELECT ?town ?townName ?area ?areaUnit ?population ?coordinate ?countryName WHERE { # 批量填入你的475个城市名,语言标签和城市名语言保持一致即可,示例用英文@en VALUES ?cityName { "Paris"@en "London"@en "Beijing"@en "Shanghai"@en } ?town rdfs:label ?cityName; wdt:P2046 ?area; wdt:P625 ?coordinate; wdt:P1082 ?population; wdt:P17 ?country. # 获取城市可读名称,可自行调整过滤语言,要中文就保留LANG(?townName) = "zh" ?town rdfs:label ?townName. FILTER(LANG(?townName) = "zh" || LANG(?townName) = "en") # 获取可读国家名称,无需手动映射Qid ?country rdfs:label ?countryName. FILTER(LANG(?countryName) = "zh" || LANG(?countryName) = "en") # 可选:获取面积单位标注,不需要可以删除以下三行 ?area wikibase:quantityUnit ?areaUnitEntity. ?areaUnitEntity rdfs:label ?areaUnit. FILTER(LANG(?areaUnit) = "zh" || LANG(?areaUnit) = "en") }
对应问题解答
- 是否可以单次查询完成475座城市信息检索:可以,使用SPARQL的
VALUES关键字定义所有要查询的城市名集合即可,不需要重复写SELECT语句。你可以用任意文本工具把CSV里的城市名批量处理为"城市名"@en的格式,空格分隔后填入VALUES的大括号中,单次运行即可返回所有结果,直接导出合并好的CSV。如果遇到重名城市,可通过返回的国家字段筛选你需要的目标城市即可。 - 国家字段转可读名称:上述查询中已经加入了国家名称获取逻辑,通过
rdfs:label属性和语言过滤,直接返回中文或英文的国家名称,不会再出现wd:Q30这类标识符。 - 面积单位处理:Wikidata的面积属性P2046默认返回单位为平方公里,上述查询中加入了可选的单位返回逻辑,结果中会明确标注面积单位,你如果不需要可以删除对应代码行。
- 是否可以直接引用CSV作为查询条件:query.wikidata.org暂不支持直接上传本地CSV作为查询条件,你可以用Excel的公式功能批量给城市名添加引号和@en后缀,475条数据只需要1分钟就能处理完成,粘贴到VALUES部分即可使用。
额外可选方案
你提到的城市列表来自联合国《World Urbanization Prospects》的30万以上人口城市集合,Wikidata已经收录了该数据集的关联条目,你也可以直接用该数据集的标识作为查询过滤条件,不需要手动输入所有城市名,进一步降低出错概率。
内容的提问来源于stack exchange,提问作者Vonvorv
相关产品推荐
相关产品推荐

