使用rdflib执行SPARQL查询时触发pyparsing.ParseException异常求助
解决SPARQL查询解析失败的问题
从你给出的报错信息来看,pyparsing.ParseException提示SPARQL解析器无法识别你的查询语句结构,问题出在URI的格式化方式上。
问题出在哪?
你当前的代码里,SPARQL查询用: {0}来插入目标节点的URI,但你传入的node是完整的URL(http://cccc.com#LaptopHighPerformance)。在SPARQL语法里,完整URI必须用尖括号<>包裹,而冒号:是用来指代已定义的命名空间前缀的,直接把完整URL放在冒号后面会导致语法错误。
生成后的错误查询语句是这样的:
select ?superclass where { :http://cccc.com#LaptopHighPerformance rdfs:subClassOf* ?superclass }
解析器根本认不出这个畸形的URI,自然会抛出解析异常。
怎么修复?
把SPARQL字符串里的: {0}改成<{0}>,用尖括号包裹完整URI即可:
def get_parents_of_node(node): # 用尖括号包裹传入的完整URI sparql = """select ?superclass where {{ <{0}> rdfs:subClassOf* ?superclass }}""".format(node) q = g.query(sparql) for row in q: print row get_parents_of_node('http://cccc.com#LaptopHighPerformance')
修改后生成的正确查询语句是:
select ?superclass where { <http://cccc.com#LaptopHighPerformance> rdfs:subClassOf* ?superclass }
额外小技巧
如果你的RDF图里经常用到http://cccc.com#这个命名空间,还可以先给它绑定一个前缀,让代码更简洁:
# 提前绑定命名空间前缀 g.bind("cc", "http://cccc.com#") def get_parents_of_node(node_suffix): # 直接用前缀加节点名即可 sparql = """select ?superclass where {{ cc:{0} rdfs:subClassOf* ?superclass }}""".format(node_suffix) q = g.query(sparql) for row in q: print row # 只需要传入节点后缀部分 get_parents_of_node('LaptopHighPerformance')
这种方式不仅更清爽,还能避免后续再出现URI格式错误的问题。
内容的提问来源于stack exchange,提问作者Vinay Joseph
相关产品推荐
相关产品推荐

