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
额外优化说明
- 修正了SPARQL查询中
OPTIONAL子句的冗余双层大括号,SPARQL语法仅需单层大括号。 - 将
bif:contains "St"改为bif:contains 'St',避免Python三重引号中的双引号转义问题,代码更简洁。
修正后运行代码,即可获取到所有符合条件的20+条结果。
内容的提问来源于stack exchange,提问作者Mohammed Esam
相关产品推荐
相关产品推荐

