SPARQL查询Wikidata法国市镇:无法获取省、大区代码的问题求助
问题分析与修正方案
你的查询返回0条结果的核心原因是对Wikidata的属性陈述结构理解有误:
?adminEntitiesStmt是P131(行政隶属)的陈述对象,它的主属性值(ps:P131)是行政区实体(比如省、大区),而不是INSEE代码。P2586(INSEE代码)是行政区实体自身的属性,不是P131陈述的附加属性,不能直接用ps:P2586从?adminEntitiesStmt取值。
修正后的SPARQL查询
下面的查询会正确获取市镇对应的省、大区等行政区的INSEE代码,还可以区分行政区类型:
SELECT ?inseeCode ?commune ?nom ?dateFinNom ?dateFinCodeInsee ?adminEntity ?adminEntityInseeCode ?adminEntityTypeLabel WHERE { # 市镇的INSEE代码及有效期 ?commune p:P374 ?inseeStmt . ?inseeStmt ps:P374 ?inseeCode . OPTIONAL {?inseeStmt pq:P582 ?dateFinCodeInsee .} # 限定为法国市镇(Q484170) ?commune wdt:P31 wd:Q484170 . # 市镇的名称及有效期 ?commune p:P1448 ?nomStmt . ?nomStmt ps:P1448 ?nom . OPTIONAL {?nomStmt pq:P582 ?dateFinNom .} # 关联行政区实体,并获取其INSEE代码 ?commune wdt:P131 ?adminEntity . ?adminEntity wdt:P2586 ?adminEntityInseeCode . # 可选:获取行政区的类型(比如省、大区),方便区分层级 ?adminEntity wdt:P31 ?adminEntityType . SERVICE wikibase:label { bd:serviceParam wikibase:language "fr" . } } LIMIT 100
额外优化说明
- 如果只想获取省的代码,可以加上过滤条件:
?adminEntity wdt:P31 wd:Q6465(Q6465是法国省的Wikidata ID) - 如果只想获取大区的代码,加上:
?adminEntity wdt:P31 wd:Q36744(Q36744是法国大区的Wikidata ID) - 用
wdt:P131代替p:P131是因为我们不需要处理行政隶属的历史变更,直接取当前有效的隶属关系;如果需要历史数据,再改用陈述结构p:P131并附加时间属性。
内容的提问来源于stack exchange,提问作者fabien-michel
相关产品推荐
相关产品推荐

