我现在一直在寻找解决方案,因为Apache Jena没有论坛,我不得不在stackoverflow创建一个帐户来询问。
我的问题是我需要一个已经加载的本体的临时(深层)副本,即OntModelImpl
的对象(有一些导入,但没有任何附加的推理机器)。其目的是在模型上应用一些验证步骤,这些步骤需要一些SPARQL UPDATE查询才能首先添加一些自动生成的三元组。这些额外的三元组仅用于验证,不应该进入原始模型!
对象本身没有复制或克隆方法,通过我的许多搜索,我无法在其他任何地方找到任何静态(?)方法来实现此目的。相反,OntModelImpl
上有某种“复制构造函数”(并未真正标记为此类),它采用规范(OntModelSpec
)和Model
。我试着这样使用它:
workingModel = new OntModelImpl(ontModel.getSpecification(), ontModel);
其中ontModel
是OntModelImpl
,之前是通过调用JenaOWLModel.getOntModel()
创建的。 JenaOWLModel
本身是Protégé-3-API的一部分,是通过调用OwlProjectFromReaderCreator.getOwlModel()
创建的。此创建者(连同必要的存储库)用于加载原始本体及其导入。 workingModel
表示我正在尝试制作的工作副本
显示的代码行的初始问题是它会抛出多个DoesNotExistException
,下面会有十几个或更多的调用级别。这些表示无法找到导入本体?正如我之前提到的,原始模型已经加载,包括所有导入。 (我在这里略过一些细节来缩短故事。)
后来我发现我可以通过设置
ontModel.getSpecification().getDocumentManager().setProcessImports(false);
在构造函数调用之前。从这一点来看,一切都很好,没有例外,我在不同的图中得到了两个不同的模型对象,它们具有相同的三重计数(我快速比较了{{{{}的两个实例的所有第一和第二级属性的对象ID。 1}}以确保它是一个深拷贝)。但今天我发现了一些奇怪的事情:第一次添加验证三元组时没有问题 - 我在SPARQL-UPDATE-INSERT请求之前和之后将三重计数写入stdout。但是当我第二次调用验证时,原始模型已经包含了额外的三元组!
这意味着要么两个模型以某种方式链接我看不到或Jena使用某种全局链接 - 也许缓存机制我不知道哪个尝试保持所有模型具有相同的URI彼此一致或完全的东西不同的。
所以我真的需要帮助!如何获得OntModelImpl
(OntModel
)的副本以应用我想要随后丢弃的临时更改?
问候和感谢你的时间
答案 0 :(得分:0)
如何制作Model
的深层副本:
Model copyOfOntModel = ModelFactory.createModelForGraph(ontModel.getGraph());
然后使用它来实例化您的新OntModelImpl
:
workingModel = new OntModelImpl(ontModel.getSpecification(),copyOfOntModel);
答案 1 :(得分:0)
@ dr0i的回答对我不起作用。
这有效:
Model copy = ModelFactory.createDefaultModel().add(originalModel);
ModelFactory
也会创建Model
个子类:createInfModel()
,createOntologyModel()
。
我测试了以下逻辑。
int size = originalModel.size();
Model copy = ModelFactory.createDefaultModel().add(originalModel);
copy.removeAll();
assert originalModel.size() == size;