如何在Python RDFLib中编写含Union与Regex过滤的SPARQL查询
解决RDFLib中SPARQL查询的问题
问题分析
你的查询报错主要有两个原因:
- SPARQL标准中
UNION关键字需要大写(部分SPARQL实现兼容小写,但为了兼容性和规范建议用大写) - 多余的嵌套大括号,
UNION的语法不需要额外嵌套双层大括号
另外,用STRSTARTS函数替代REGEX来检查IRI前缀会更高效,因为它专门用于字符串前缀匹配,性能比正则表达式更好。
修正后的代码
from rdflib import Graph, Namespace myd = Namespace("http://example.net/") g = Graph() # 请确保已将RDF数据加载到g中 g.bind("myd", myd) records = g.query(''' SELECT DISTINCT ?s ?o WHERE { {?s myd:p1 ?o} UNION {?s myd:p2 ?o} FILTER(STRSTARTS(STR(?s), "http://example.net/")) } ''') # 遍历输出结果 for s, o in records: # 判断当前三元组使用的属性 pred = myd.p1 if (s, myd.p1, o) in g else myd.p2 print(f"{s} {pred} {o}")
补充说明
- 命名空间绑定:确保
myd命名空间正确绑定,查询中用myd:p1和myd:p2引用属性,避免IRI拼写错误 - 过滤逻辑:
STRSTARTS(STR(?s), "http://example.net/")会严格检查主体?s的IRI是否以指定前缀开头,完全匹配需求 - 结果验证:针对你给出的测试三元组,这个查询会返回:
http://example.net/a http://example.net/p1 http://example.net/bhttp://example.net/e http://example.net/p1 http://example.net/dhttp://example.net/x http://example.net/p2 http://example.net/z
完全符合你的期望结果
内容的提问来源于stack exchange,提问作者Tara
相关产品推荐
相关产品推荐

