Wikidata SPARQL查询如何获取前置语句的P642谓词关联值
问题原因
你的SPARQL查询写法不符合Wikidata限定属性的查询规则,核心问题出在P642(of)属性的关联对象上:P642是属性声明的限定词,不是直接挂载在类型实体wd:Q21507383(加拿大省/地区首府类型)上的属性,而是挂载在每个城市「属于该类型」这条属性声明的节点上的。
你原来的写法wd:Q21507383 pq:P642 ?provinceOrTerritory是尝试从类型实体本身取P642值,自然取不到对应数据。
正确查询语句
如果要同时获取首府城市、对应省/地区名称,可用如下查询:
SELECT ?item ?itemLabel ?provinceOrTerritoryLabel WHERE { # 先匹配首府城市的类型声明,并取该声明的P642限定值作为所属省/地区 ?item p:P31 [ ps:P31 wd:Q21507383 ; # 实例为加拿大省/地区首府 pq:P642 ?provinceOrTerritory ] . # 过滤省/地区的类型,这里保留了原来的省筛选,如果需要包含地区可添加对应类型 { ?provinceOrTerritory wdt:P31 wd:Q11828004 . } # 加拿大的省 UNION { ?provinceOrTerritory wdt:P31 wd:Q107370042 . } # 加拿大的地区 SERVICE wikibase:label { bd:serviceParam wikibase:language "zh,en". } }
如果你只需要查询省对应的首府,去掉UNION和加拿大地区的过滤条件即可。
P642属性批量查询通用规则
要批量获取Wikidata中通过P642关联的实体,统一使用如下查询范式:
- 当你需要查询「某类实体的P属性声明附带的P642关联值」时,需要先拿到该属性的声明节点,再从声明节点取pq:P642的值:
?实体 p:属性ID [ ps:属性ID 目标属性值 ; pq:P642 ?关联实体 ]
以你举的多伦多为例,对应的查询片段就是:
wd:Q172 p:P31 [ ps:P31 wd:Q21507383 ; pq:P642 ?province ]
执行后?province就会返回安大略省的实体。
内容的提问来源于stack exchange,提问作者Ludovic Bocken
相关产品推荐
相关产品推荐

