切换耶拿推理员

时间:2009-03-17 13:14:05

标签: semantics jena

我有一个Jena本体模型(OntModel),我正在以编程方式修改它。最初使用default ModelFactory method to create an Ontology model (with no parameters)创建此模型。问题是,随着程序运行并且模型被更改,默认的Jena Reasoner将运行(并运行并运行并运行)。这个过程对于我需要的东西来说太慢了,并且在大型数据集上会耗尽内存。

我将程序更改为使用a different ontology model factory method来创建没有推理器的模型。这非常快,并且没有出现我之前看到的内存问题(即使是非常大的数据集)。这种方法的问题在于我只能通过直接使用它的直接类类型来访问数据(我无法使用它的父类访问对象)。

例如,假设我有两个类资源,“花”和“种子”。这些继承自共同的父母“植物材料”。我的程序获取所有“种子”,运行一个名为“grow”的方法,将“种子”对象转换为“花”对象。使用Reasoner(甚至是微型推理器)时,“grow”方法运行速度太慢并且内存不足。如果我关闭推理器,那么我无法使用“植物材料”类访问所有“花”和“种子”。

有没有一种首选方式(一种快乐的媒介)这样做...允许使用超类访问对象的能力,同时又快速而不是记忆猪?

我一直在寻找一种方法来“关闭推理器”,同时运行我的“增长”方法,然后在方法完成后将其关闭一个。这有可能吗?

1 个答案:

答案 0 :(得分:4)

我得到了一些help and suggestions,这就是我解决这个问题的方法。

基本上,我在没有Reasoner的情况下获得了对另一个模型的访问权限,将我对基本模型的所有更改批量处理,然后使用推理器反弹整个模型以获取更新。

这是一些伪代码。它并不完全符合我的“真实”情景,但你明白了。

// Create a model with a reasoner and load the full model from owl files or
// whatever
OntModel fullModel = ModelFactory.createOntologyModel();
fullModel.read(...);

// create a model without a reasoner and load it from the full model with
// reified statements
OntModel basicModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
basicModel.add(fullModel);

// batch modifications to the basic model programatically
//(**** RUNS REALLY QUICK *****)

// rebind the full model
fullModel.rebind();

// continue on....