使用SPARQLWrapper查询GraphDB时SELECT请求返回HTTP 406/415错误的求助
问题原因与解决方案
嘿,我一眼就发现问题出在哪了——你用错GraphDB的SPARQL端点啦!
核心问题:端点URL不匹配
GraphDB对查询操作和更新操作的端点是分开设计的:
/repositories/repo1/statements是更新端点,专门用来处理INSERT、DELETE这类修改数据的操作,这也是你的INSERT能正常执行的原因;- 而SELECT这类查询操作,必须用查询端点:
http://localhost:7200/repositories/repo1(去掉末尾的/statements)。
为什么会出现那些错误?
- 用GET请求访问更新端点:GraphDB的更新端点不支持处理SELECT查询,所以返回406错误(服务器无法返回请求的格式);
- 用POST请求访问更新端点:更新端点期望的是SPARQL Update格式的请求,而你发的是SELECT查询,格式不匹配导致415错误;
- 切换到RDF/N3格式时不报错,但返回所有三元组:这是因为
/statements端点本身的功能就是返回仓库中所有的三元组数据,根本没执行你的SELECT查询,自然不会过滤结果。
修正后的代码
把SPARQLWrapper的URL换成查询端点就好了:
from SPARQLWrapper import SPARQLWrapper, JSON # 注意去掉末尾的/statements sparql = SPARQLWrapper("http://localhost:7200/repositories/repo1") sparql.setQuery(""" PREFIX : <http://www.ontology.ca/ontology-1.0#> SELECT ?s WHERE { ?s a :User; :hasUserName "username1". } """) sparql.method = 'GET' # GET/POST都可以,这里用GET没问题 sparql.setReturnFormat(JSON) results = sparql.query().convert() # 打印结果验证 for result in results["results"]["bindings"]: print(result["s"]["value"])
额外小提示
- 如果之后要执行更新操作(INSERT/DELETE),再切换回带
/statements的更新端点; - GraphDB的查询端点支持GET和POST两种方法,GET适合短查询,POST适合复杂或较长的查询;
- 验证查询是否正确的话,也可以直接在GraphDB的Web控制台(
http://localhost:7200)里执行你的SELECT查询,确认能得到预期结果后再用代码调用。
内容的提问来源于stack exchange,提问作者Eli
相关产品推荐
相关产品推荐

