合并多本体后用SPARQL提取指定本体谓词遇pyparsing错误求助
解决SPARQL查询中命名空间变量的语法错误
首先,你的问题出在SPARQL查询的语法上——sudo:?v这种写法不符合SPARQL的规范,这才导致了pyparsing解析错误。SPARQL里不能把命名空间前缀直接和变量名连在一起写,变量就是独立的?v,如果要筛选属于特定命名空间的属性,得用FILTER或者直接匹配命名空间的URI模式。
修正后的查询代码
这里给你两种可行的写法:
方法1:使用FILTER筛选命名空间
from rdflib import Graph g = rdflib.Graph() result = g.parse("without-bfo.owl") qres = g.query( """ PREFIX sudo: <http://purl.url/sudo/ontology#> SELECT ?v WHERE { ?s ?v ?o. FILTER(strstarts(str(?v), str(sudo:))) }""") # 遍历输出结果 for row in qres: print(row.v)
方法2:直接匹配属性的URI前缀
如果你更习惯直接写URI模式,也可以这样写:
qres = g.query( """ SELECT ?v WHERE { ?s ?v ?o. FILTER(strstarts(str(?v), "http://purl.url/sudo/ontology#")) }""")
为什么原来的写法不行?
SPARQL的语法规则里,prefix:name这种形式只能用来表示确定的URI资源,比如sudo:hasPart这种具体的属性,而不能把变量?v嵌在里面。当你写sudo:?v时,解析器会把它当成一个非法的语法结构,自然就抛出pyparsing错误了。
而当你去掉前缀只写?v时,查询没有语法问题,所以能返回所有三元组里的属性变量,但这不是你想要的筛选结果。
内容的提问来源于stack exchange,提问作者mac389
相关产品推荐
相关产品推荐

