Toggle Jena Reasoner - PullRequest
       6

Toggle Jena Reasoner

4 голосов
/ 17 марта 2009

У меня есть модель онтологии Jena ( OntModel ), которую я изменяю программно. Эта модель была изначально создана с использованием метода ModelFactory по умолчанию для создания модели онтологии (без параметров) . Проблема заключалась в том, что, поскольку программа работала и модель изменялась, по умолчанию запускалась Jena Reasoner (и запускалась, и запускалась, и запускалась). Процесс был слишком медленным для того, что мне нужно, и на больших наборах данных не хватало бы памяти.

Я изменил программу, чтобы использовать другой метод фабрики моделей онтологий , чтобы создать модель без аргумента. Это работало очень быстро и не показывало никаких проблем с памятью, которые я видел ранее (даже для очень больших наборов данных). Проблема этого подхода заключается в том, что я могу получить доступ к данным только напрямую, используя прямой тип класса (я не могу получить доступ к объектам, используя его родительский класс).

Например, представьте, что у меня есть два класса ресурсов: "цветок" и "семя". Они наследуются от общего родителя, «растительного материала». Моя программа берет все «семена», запускает метод «расти», который превращает объект «семена» в объект «цветок». Метод grow работает слишком медленно и не хватает памяти при использовании Reasoner (даже микро Reasoner). Если я отключу Reasoner, то не смогу получить доступ ко всем "цветам" и "семенам", используя класс "растительный материал".

Есть ли предпочтительный способ (удачный способ) сделать это ... позволяющий получать доступ к объектам, используя их суперкласс, при этом будучи быстрым и не занимая память?

Я искал способ "отключить рассуждение", пока я запускаю свой метод "grow", а затем снова включаю его один раз после завершения метода. Возможно ли это как-то?

1 Ответ

4 голосов
/ 18 марта 2009

Я получил некоторую помощь и предложения , тогда я решил эту проблему.

По сути, я получил доступ к другой модели без 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....
...