如何在Wikidata SPARQL查询中关联p[s[n]]与w[d[t]]属性并获取单位
获取维基数据指定条目的量化值及单位详情
需求:获取指定维基数据条目(如wd:Q1726)的所有量化值及其声明详情,重点是单位(数值无单位则失去意义)。
原查询说明
第一个查询用于获取所有量化值及属性基本信息:
SELECT ?p ?property ?propertyLabel ?propertyDescription ?v WHERE { wd:Q1726 ?p ?v. ?property wikibase:propertyType wikibase:Quantity; wikibase:directClaim ?p. SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". } } ORDER BY ?v
该查询能返回类似310 km²的数值及属性的标签、描述,但缺少单位的结构化信息。
第二个查询针对单个属性(如wdt:P2046)获取最优声明的数值与单位:
SELECT ?statement ?value ?valueLabel ?unit ?unitLabel WHERE { wd:Q1726 p:P2046 ?statement. ?statement psn:P2046 ?valuenode. ?valuenode wikibase:quantityAmount ?value. ?valuenode wikibase:quantityUnit ?unit. ?statement a wikibase:BestRank. SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } }
但无法批量关联所有量化属性的数值与单位。
合并后的解决方案
通过属性的元数据关联直接声明、声明节点与标准化数值,实现批量获取所有量化值的单位信息:
SELECT ?p ?property ?propertyLabel ?propertyDescription ?v ?quantityValue ?unit ?unitLabel WHERE { # 获取条目所有量化属性的直接显示值 wd:Q1726 ?p ?v. # 筛选量化类型属性,并关联对应的声明属性、标准化值属性 ?property wikibase:propertyType wikibase:Quantity; wikibase:directClaim ?p; wikibase:claim ?claimProperty; wikibase:statementValueNormalized ?psnProperty. # 获取该属性的最优声明节点 wd:Q1726 ?claimProperty ?statement. ?statement a wikibase:BestRank. # 提取标准化数值与单位(OPTIONAL处理无单位的情况) ?statement ?psnProperty ?valuenode. ?valuenode wikibase:quantityAmount ?quantityValue. OPTIONAL { ?valuenode wikibase:quantityUnit ?unit. } SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". } } ORDER BY ?v
关键逻辑说明
- 关联直接值与声明节点:通过属性
?property作为中间桥梁,利用wikibase:directClaim关联直接声明(wdt:Pxxx),wikibase:claim关联声明节点属性(p:Pxxx),从而把条目上的直接值?v和对应的声明?statement绑定。 - 标准化数值与单位:使用
wikibase:statementValueNormalized获取标准化值属性(psn:Pxxx),提取的?quantityValue是统一格式的数值,?unit是标准化的单位实体;用OPTIONAL包裹单位部分,避免因部分量化值无单位导致数据丢失。 - 属性过滤:通过
?property wikibase:propertyType wikibase:Quantity确保只处理量化类型的属性,排除非数值类属性。
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

