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

如何在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}")

补充说明

  1. 命名空间绑定:确保myd命名空间正确绑定,查询中用myd:p1和myd:p2引用属性,避免IRI拼写错误
  2. 过滤逻辑:STRSTARTS(STR(?s), "http://example.net/")会严格检查主体?s的IRI是否以指定前缀开头,完全匹配需求
  3. 结果验证:针对你给出的测试三元组,这个查询会返回:
    • http://example.net/a http://example.net/p1 http://example.net/b
    • http://example.net/e http://example.net/p1 http://example.net/d
    • http://example.net/x http://example.net/p2 http://example.net/z
      完全符合你的期望结果

内容的提问来源于stack exchange,提问作者Tara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:52:09