如何克隆或复制Jena-Ontology-Model(OntModel)以应用临时更改?

时间:2014-03-28 13:12:44

标签: validation sparql jena ontology protege

我现在一直在寻找解决方案,因为Apache Jena没有论坛,我不得不在stackoverflow创建一个帐户来询问。
我的问题是我需要一个已经加载的本体的临时(深层)副本,即OntModelImpl的对象(有一些导入,但没有任何附加的推理机器)。其目的是在模型上应用一些验证步骤,这些步骤需要一些SPARQL UPDATE查询才能首先添加一些自动生成的三元组。这些额外的三元组仅用于验证,不应该进入原始模型!
对象本身没有复制或克隆方法,通过我的许多搜索,我无法在其他任何地方找到任何静态(?)方法来实现此目的。相反,OntModelImpl上有某种“复制构造函数”(并未真正标记为此类),它采用规范(OntModelSpec)和Model。我试着这样使用它:

workingModel = new OntModelImpl(ontModel.getSpecification(), ontModel);

其中ontModelOntModelImpl,之前是通过调用JenaOWLModel.getOntModel()创建的。 JenaOWLModel本身是Protégé-3-API的一部分,是通过调用OwlProjectFromReaderCreator.getOwlModel()创建的。此创建者(连同必要的存储库)用于加载原始本体及其导入。 workingModel表示我正在尝试制作的工作副本 显示的代码行的初始问题是它会抛出多个DoesNotExistException,下面会有十几个或更多的调用级别。这些表示无法找到导入本体?正如我之前提到的,原始模型已经加载,包括所有导入。 (我在这里略过一些细节来缩短故事。)
后来我发现我可以通过设置

来抑制异常
ontModel.getSpecification().getDocumentManager().setProcessImports(false);
在构造函数调用之前

。从这一点来看,一切都很好,没有例外,我在不同的图中得到了两个不同的模型对象,它们具有相同的三重计数(我快速比较了{{{{}的两个实例的所有第一和第二级属性的对象ID。 1}}以确保它是一个深拷贝)。但今天我发现了一些奇怪的事情:第一次添加验证三元组时没有问题 - 我在SPARQL-UPDATE-INSERT请求之前和之后将三重计数写入stdout。但是当我第二次调用验证时,原始模型已经包含了额外的三元组! 这意味着要么两个模型以某种方式链接我看不到或Jena使用某种全局链接 - 也许缓存机制我不知道哪个尝试保持所有模型具有相同的URI彼此一致或完全的东西不同的。

所以我真的需要帮助!如何获得OntModelImplOntModel)的副本以应用我想要随后丢弃的临时更改?

问候和感谢你的时间

2 个答案:

答案 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;