如何从Wikidata语句中检索获取常规排名的首位属性值
Wikidata常规排名(Normal Rank)属性值查询方法
Wikidata的语句分三个优先级:首选(Preferred Rank)> 常规(Normal Rank)> 过时(Deprecated Rank),要实现「有首选取首选、无首选取最早提交的高相关性常规值」的需求,直接通过SPARQL在Wikidata查询服务中编写查询即可,具体逻辑如下:
- 第一步:过滤掉所有标记为过时排名的无效语句
- 第二步:先统计当前查询的实体-属性组合下,是否存在首选排名的语句
- 第三步:按优先级筛选结果:存在首选语句时仅返回首选值,不存在首选时仅返回常规排名值
- 第四步:对常规排名的结果,按语句首次提交时间升序排列,取第一条就是最早提交、相关性最高的目标值
查询示例(以查询史蒂夫·乔布斯的职业属性为例)
以下是可直接运行的SPARQL代码:
SELECT ?value ?valueLabel WHERE { # 替换下方的实体ID、属性ID即可适配其他查询场景 # 示例为查询实体:史蒂夫·乔布斯(Q19837)的属性:职业(P106) wd:Q19837 p:P106 ?statement. ?statement ps:P106 ?value. # 读取语句的排名标记 ?statement wikibase:rank ?rank. FILTER(?rank != wikibase:DeprecatedRank) # 读取语句创建时间,用于常规值排序 OPTIONAL { ?statement schema:dateCreated ?createTime. } # 统计当前属性下是否存在首选语句 { SELECT (COUNT(?preferredStmt) AS ?preferredNum) WHERE { wd:Q19837 p:P106 ?preferredStmt. ?preferredStmt wikibase:rank wikibase:PreferredRank. } } # 按优先级过滤结果 FILTER( (?preferredNum > 0 && ?rank = wikibase:PreferredRank) || (?preferredNum = 0 && ?rank = wikibase:NormalRank) ) # 加载中文标签 SERVICE wikibase:label { bd:serviceParam wikibase:language "zh-CN". } } # 排序规则:优先排高优先级值,同优先级下按创建时间从早到晚排 ORDER BY DESC(?rank) ASC(?createTime) LIMIT 1
调整说明
- 如果你需要查询其他实体或属性,只需要替换代码里的实体Q号、属性P号即可
- 如果你不需要取最早提交的单条值,想要获取所有符合规则的常规值,删掉最后一行的
LIMIT 1,同时移除和?createTime相关的排序、字段读取逻辑即可
验证结果:上述示例查询因为史蒂夫·乔布斯的职业属性下未设置首选语句,会直接返回最早提交的常规值「企业家」,和属性列表首位的排序结果完全匹配。
内容的提问来源于stack exchange,提问作者Luuk Harleman
相关产品推荐
相关产品推荐

