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

使用多行f-string构建SPARQL查询时出现KeyError问题求助

解决Python中SPARQL查询格式化的KeyError问题

错误原因

你同时混用了f-string和str.format()方法,导致语法冲突:

  • f-string会把字符串内的双大括号{{}}转义为单个大括号{},最终生成的查询字符串里WHERE {{会变成WHERE {
  • 调用format()时,它会把所有{}都视为占位符,包括SPARQL语句里的{ wd:...,误以为wd是需要替换的键,因此抛出KeyError。

解决办法(无需拆分语句)

方案1:仅使用str.format()

把SPARQL里的大括号用双大括号转义,直接用format()替换占位符:

query = '''SELECT ?age
WHERE {{
  wd:{0} wdt:{1} ?birthdate.
  BIND(now() - ?birthdate AS ?age)
}}'''
print(query.format('Q84','P1082'))

方案2:仅使用f-string

直接用变量代替{0}、{1}占位符,双大括号依然用于转义SPARQL的大括号:

wd_id = 'Q84'
wdt_id = 'P1082'
query = f'''SELECT ?age
WHERE {{
  wd:{wd_id} wdt:{wdt_id} ?birthdate.
  BIND(now() - ?birthdate AS ?age)
}}'''
print(query)

方案3:使用string.Template

通过$符号作为占位符,完全避免大括号冲突:

from string import Template

query = Template('''SELECT ?age
WHERE {
  wd:$wd_id wdt:$wdt_id ?birthdate.
  BIND(now() - ?birthdate AS ?age)
}''')
print(query.substitute(wd_id='Q84', wdt_id='P1082'))

内容的提问来源于stack exchange,提问作者m.rp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 08:07:46