如何通过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
相关产品推荐
相关产品推荐

