如何用Python读取DBpedia标签JSON文件并通过SPARQL批量提取摘要
批量提取DBpedia标签对应的英文摘要(Python实现)
问题分析
你的代码存在几个关键问题:
- 直接拼接
file[1:-1]到SPARQL查询中是错误的,JSON读取的标签列表需要转换成DBpedia的标准资源URI格式,才能被SPARQL识别。 - 函数名拼写错误:
abstarctExtract应为abstractExtract。 - 变量赋值错误:
lang, value = result['abstract']['xml:lang'],result['label']['xml:lang'], result['label']['value'], result['abstract']['value']左边仅两个变量,右边有四个值,会触发赋值数量不匹配的错误。 - 未处理标签到DBpedia URI的转换,且批量查询时使用
VALUES子句比拼接多个三元组更高效、规范。
修正后的代码
from SPARQLWrapper import SPARQLWrapper, JSON import json # 读取JSON文件中的标签列表 with open('/content/drive/MyDrive/dbpedia_lables.json', 'r') as f: dbpedia_labels = json.load(f) def abstractExtract(labels): # 将标签转换为DBpedia资源URI(空格替换为下划线是DBpedia的标准格式) resource_uris = [f"<http://dbpedia.org/resource/{label.replace(' ', '_')}>" for label in labels] # 构造SPARQL查询,用VALUES子句批量传入资源 sparql_query = f''' SELECT ?label ?abstract WHERE {{ VALUES ?resource {{ {' '.join(resource_uris)} }} ?resource rdfs:label ?label ; dbo:abstract ?abstract . # 直接在查询中过滤英文的标签和摘要,减少返回数据量 FILTER(LANG(?label) = "en" && LANG(?abstract) = "en") }} ''' sparql = SPARQLWrapper('http://dbpedia.org/sparql') sparql.setQuery(sparql_query) sparql.setReturnFormat(JSON) try: qres = sparql.query().convert() # 遍历结果并输出 for result in qres['results']['bindings']: label_value = result['label']['value'] abstract_value = result['abstract']['value'] print(f"标签: {label_value}") print(f"摘要: {abstract_value}\n") except Exception as e: print(f"查询出错: {str(e)}") # 调用函数执行查询 abstractExtract(dbpedia_labels)
代码说明
- URI转换:将标签中的空格替换为下划线,包装成DBpedia资源的标准URI格式,确保SPARQL能正确识别目标资源。
- VALUES子句:批量传入所有资源URI,避免拼接大量重复的三元组语句,既提升查询效率,也符合SPARQL的规范写法。
- 前置过滤:在SPARQL查询中直接过滤英文内容,减少返回的数据量,无需在Python中二次处理。
- 异常捕获:添加
try-except块处理查询过程中可能出现的网络问题、无效URI等异常情况。
内容的提问来源于stack exchange,提问作者A.gul
相关产品推荐
相关产品推荐

