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

合并多本体后用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:38:39