You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 18:33:26