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

如何通过SPARQL正确查询Wikidata中专辑的完整曲目列表

Wikidata获取专辑完整曲目列表的正确SPARQL写法

之前查询失效的核心原因

Wikidata对专辑和所属曲目的关联有两种主流建模方式,之前的查询只覆盖了其中一种,自然会出现结果为空、结果不全的问题:

  • 第一种建模:曲目实体直接通过wdt:P1433(发行收录于专辑)属性关联专辑实体
  • 第二种建模:专辑实体先通过wdt:P658(音轨列表)属性关联一个独立的音轨列表序列实体,再由这个序列实体通过wdt:P1752(包含组件)属性关联具体曲目,同时在这个关联上挂载曲目序号等信息

三个测试查询的具体问题:

  • 针对wd:Q200872(《Wish You Were Here》)的查询:该专辑完全采用第二种建模方式,没有曲目直接关联P1433,所以返回空结果
  • 针对wd:Q208227的查询:该专辑只有2首曲目采用第一种建模直接关联P1433,其余曲目都挂在音轨列表实体下,所以仅返回2条结果
  • 基于wdt:P658关联wd:Q151114的查询:只做了专辑到音轨列表的关联,没有继续穿透到具体曲目实体,且写死了特定音轨列表实体ID,不具备通用性

通用可复用查询语句

下面的语句同时兼容两种建模方式,支持返回曲目名称、对应序号,会自动按曲目顺序排序,替换BIND行里的实体ID就能查询任意专辑的完整曲目:

SELECT ?trackNumber ?track ?trackLabel WHERE {
  # 替换下面括号里的实体ID即可查询指定专辑
  BIND(wd:Q200872 AS ?targetAlbum)
  {
    # 匹配直接通过P1433关联专辑的曲目
    ?track wdt:P1433 ?targetAlbum.
    OPTIONAL { 
      ?track p:P1433 ?trackRel. 
      ?trackRel pq:P1545 ?trackNumber. 
    }
  }
  UNION
  {
    # 匹配通过音轨列表关联的曲目
    ?targetAlbum wdt:P658 ?tracklist.
    ?tracklist wdt:P1752 ?track.
    OPTIONAL {
      ?tracklist p:P1752 ?trackRel.
      ?trackRel pq:P1545 ?trackNumber.
    }
  }
  # 标签语言优先返回中文,其次返回英文
  SERVICE wikibase:label { bd:serviceParam wikibase:language "zh-CN,en". }
}
# 将曲目序号转为整数排序,避免字符串排序导致的顺序错乱
ORDER BY xsd:integer(?trackNumber)

补充说明

  • 上述语句查询wd:Q200872可正常返回《Wish You Were Here》全部5首正式曲目,查询wd:Q208227(《The Dark Side of the Moon》)可返回完整10首音轨(包含专辑首尾的背景音效片段)
  • 若查询某专辑返回结果不全,先检查该专辑的Wikidata条目本身是否录入了完整曲目信息,源数据缺失的情况下无法通过查询语句补全
  • 如需批量查询所有专辑的曲目,可将BIND行替换为?targetAlbum wdt:P31 wd:Q482994.(筛选实体类型为专辑),批量查询时建议添加LIMIT限制返回条数,避免查询超时

内容的提问来源于stack exchange,提问作者SuperFrog

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:58:00