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

owlready2查询Drug类实例报sqlite3.OperationalError如何解决

报错原因

该sqlite3.OperationalError: circular reference: prelim1_objs报错为Owlready2的常见事务处理问题:Owlready2底层依赖SQLite实现三元组存储,with onto:语句为本体操作的事务上下文块,你当前将实例创建代码写在了上下文块之外,相关实例写入操作没有被自动提交到底层存储队列,调用instances()方法查询实例时,SQLite无法识别未完成的实例引用,就会触发循环引用报错。

解决方法

有两种可行修复方案:

  • 方案一:将实例创建逻辑全部移入with onto:上下文块内,依靠上下文自动提交事务,修复后的代码如下:
from owlready2 import *
onto = get_ontology("https://test.org/onto.owl")
with onto:
    class Drug(Thing):
        pass
    # 实例创建逻辑移到上下文块内
    my_drug1 = Drug("my_drug1")
    my_drug2 = Drug("my_drug2")
    my_drug3 = Drug("my_drug3")
    my_drug4 = Drug("my_drug4")
    
for i in Drug.instances(): 
    print(i)
  • 方案二:如果业务逻辑需要在上下文块外创建实例,在创建完成后手动调用onto.commit()提交事务后再做查询,修复后的代码如下:
from owlready2 import *
onto = get_ontology("https://test.org/onto.owl")
with onto:
    class Drug(Thing):
        pass

my_drug1 = Drug("my_drug1")
my_drug2 = Drug("my_drug2")
my_drug3 = Drug("my_drug3")
my_drug4 = Drug("my_drug4")
# 手动提交本体事务
onto.commit()

for i in Drug.instances(): 
    print(i)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 22:06:03