使用rdflib对接AnzoGraph社区版时Graph Store Protocol请求报错排查
解决AnzoGraph社区版与rdflib SPARQLStore的406错误问题
问题根源
- HTTP 406错误本质是客户端请求的响应格式服务器不支持,rdflib默认的Accept头与AnzoGraph的兼容存在问题。
- 你错误地将Graph Store Protocol端点
/rdf-graph-store传给了SPARQLStore:这个端点仅用于读写RDF图数据,并非执行SPARQL查询的端点,AnzoGraph的SPARQL查询/更新端点是/sparql。
修正方案
方案1:针对SPARQL查询场景
明确指定SPARQL查询端点,并设置AnzoGraph支持的响应格式,修改代码如下:
import rdflib from rdflib.plugins.stores.sparqlstore import SPARQLStore # 初始化SPARQLStore,指定AnzoGraph的SPARQL端点 store = SPARQLStore( query_endpoint="http://192.168.1.104:7070/sparql", update_endpoint="http://192.168.1.104:7070/sparql" ) # 设置服务器支持的响应格式,避免406错误 store.setAcceptHeader("application/sparql-results+json") graph = rdflib.ConjunctiveGraph(store=store) result = graph.query("select (count(*) as ?c) {?s ?p ?o}") for row in result: print(row.c)
方案2:针对Graph Store Protocol操作场景
如果你的需求是通过Graph Store Protocol读写图数据(而非执行SPARQL查询),则不应使用graph.query(),而是改用rdflib对应的图操作方法,示例如下:
import rdflib from rdflib.plugins.stores.sparqlstore import SPARQLStore # 使用Graph Store端点 store = SPARQLStore("http://192.168.1.104:7070/rdf-graph-store") graph = rdflib.ConjunctiveGraph(store=store) # 示例:从端点加载数据 graph.parse() # 示例:序列化输出数据 print(graph.serialize(format="turtle").decode())
额外注意事项
- 确认Docker端口映射
7070:7070正确,该端口是AnzoGraph的SPARQL服务端口。 - 如果AnzoGraph开启了认证,需在SPARQLStore中添加凭据:
store.setCredentials("你的用户名", "你的密码")
内容的提问来源于stack exchange,提问作者user2302244
相关产品推荐
相关产品推荐

