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

SPARQL查询结果异常:Python代码仅返回2条结果但实际应有20+

问题排查与解决方案

核心错误:循环逻辑错误

你的Python代码循环部分存在关键问题:

for i in range(len(qres)):

qres是SPARQL返回的完整JSON对象,包含head和results两个顶级键,因此len(qres)的值为2,导致循环仅执行2次,只取了前2条结果,而非全部符合条件的记录。

修正后的完整代码

def get_author_books():
    sparql = SPARQLWrapper('https://dbpedia.org/sparql')
    sparql.setQuery("""
    SELECT distinct ?s ?author
    WHERE{ ?s rdf:type dbo:Book .
    ?s rdfs:label ?bookLabel . 
      FILTER(LANGMATCHES(LANG(?bookLabel), 'en')) 

    ?s dbo:author ?author . 
    ?author rdfs:label ?authorLabel . 
      FILTER(LANGMATCHES(LANG(?authorLabel), 'en')) 
    ?authorLabel bif:contains 'St' 
    OPTIONAL { ?s dbp:country ?country .
              ?country rdfs:label ?countryLabel .
                 FILTER(LANGMATCHES(LANG(?countryLabel), 'en')) }
    OPTIONAL { ?s dbo:literaryGenre ?genre .
              ?genre rdfs:label ?genreLabel .
                 FILTER(LANGMATCHES(LANG(?genreLabel), 'en')) }
    OPTIONAL { ?s dbp:language ?language .
              ?language rdfs:label ?languageLabel .
                 FILTER(LANGMATCHES(LANG(?languageLabel), 'en')) }
    } """)

    sparql.setReturnFormat(JSON)
    qres = sparql.query().convert()
    info = []
    # 直接遍历结果绑定列表,而非整个响应对象
    for result in qres['results']['bindings']:
        author, book = (result['author']['value']).split('/')[-1], (result['s']['value']).split('/')[-1]
        info.append((author, book))
    print(info)
    # 正确计算结果数量
    print(len(qres['results']['bindings']))
    return info

额外优化说明

  1. 修正了SPARQL查询中OPTIONAL子句的冗余双层大括号,SPARQL语法仅需单层大括号。
  2. 将bif:contains "St"改为bif:contains 'St',避免Python三重引号中的双引号转义问题,代码更简洁。

修正后运行代码,即可获取到所有符合条件的20+条结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:40:40