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
相关产品推荐
相关产品推荐

