如何反转Wikidata的SPARQL查询中拼接的行政层级值顺序
加拿大城市行政层级标签倒序拼接解决方案
核心修改思路:在原有可运行查询的基础上,新增行政层级排序逻辑,无需调整实体遍历方向,即可实现从国家到城市的正序拼接效果。
修正后可直接运行的SPARQL代码
SELECT (GROUP_CONCAT(?locationLabel; separator = ' > ' ORDER BY ?level ASC) as ?locationLabels) ?city ?cityLabel WHERE { ?city wdt:P17 wd:Q16. # 筛选属于加拿大的城市 ?city wdt:P31 wd:Q21507383. # 筛选加拿大的省/地区首府 ?city wdt:P131* ?location. # 遍历城市所属的所有上级行政实体 # 计算行政层级:数值越小代表层级越高,国家层级为0,省/地区为1,区县为2,城市为3 BIND( IF(?location = wd:Q16, 0, IF(EXISTS {?location wdt:P131 wd:Q16}, 1, IF(EXISTS {?location wdt:P131/wdt:P131 wd:Q16}, 2, 3) ) ) AS ?level ) # 可选过滤:移除已撤销的历史行政实体,避免出现"纽芬兰自治领"这类历史层级 FILTER NOT EXISTS { ?location wdt:P576 ?abolishDate } SERVICE wikibase:label { bd:serviceParam wikibase:language "en". ?city rdfs:label ?cityLabel. ?location rdfs:label ?locationLabel . } } GROUP BY ?city ?cityLabel
修改说明
- 新增了
level字段标识每个行政实体的层级,按从高到低(国家→城市)的顺序赋值0-3 - 调整
GROUP_CONCAT逻辑,新增ORDER BY ?level ASC参数,让拼接顺序从国家层级开始,同时将分隔符替换为> - 新增可选过滤规则,可移除已撤销的历史行政实体,解决部分城市结果中出现历史行政区的问题
- 无需调整原有实体遍历逻辑,避免了使用
P150反向属性出现的匹配错误问题
效果示例
原输出:Edmonton < Alberta < Canada
修正后输出:Canada > Alberta > Edmonton
内容的提问来源于stack exchange,提问作者Ludovic Bocken
相关产品推荐
相关产品推荐

