Pergunta
Eu tenho um modelo ontologia Jena ( OntModel ) que eu estou modificando programaticamente. Este modelo foi inicialmente criada usando o método ModelFactory padrão para criar um modelo de Ontologia (sem parâmetros) . O problema era, como a RAN programa e o modelo foi alterado, o padrão Jena Reasoner seria executado (e correr e correr e correr). O processo foi inteiramente demasiado lento para o que eu preciso e iria ficar sem memória em grandes conjuntos de dados.
Eu mudei o programa para uso um modelo diferente ontologia método de fábrica para criar um modelo sem reasoner. Este correu extremamente rápido e nenhum exibiu dos problemas de memória que eu vi antes (mesmo para grandes conjuntos de dados). O problema com esta abordagem é que eu só pode acessar os dados usando diretamente é tipo de classe direta (eu não posso ter acesso a objetos usando sua classe pai).
Por exemplo, imagine que eu tinha dois recursos de classe, "flor" e "semente". Estes herdam de um pai comum, "material vegetal". Meu programa tem todas as "sementes", executa um método chamado "crescer", que transforma o objeto de "semente" em um objeto de "flor". O "crescer" método funciona muito lento e ficar sem memória ao usar um Reasoner (mesmo o micro Reasoner). Se eu desligar o Reasoner, então eu não posso acessar todas as "flores" e "sementes" usando a classe "material vegetal".
Existe uma maneira preferida (um meio termo) para fazer isso ... permitindo a capacidade de acessar objetos usando sua superclasse, enquanto também é rápido e não um devorador de memória?
Eu estive procurando uma maneira de "desligar o pensador" enquanto eu executar o meu método de "crescer" e, em seguida, ligá-lo novamente uma vez as concluída método. Isso é possível de alguma forma?
Solução
Eu tenho alguns ajuda e sugestões , então este é como eu resolver este problema.
Basicamente, ganhei acesso a outro modelo sem Reasoner, agrupadas todas as minhas alterações para o modelo básico, em seguida, recuperar o modelo completo com o MI para obter as atualizações.
Aqui está algum código pseudo. Ele não corresponder exatamente meu cenário "real", mas você começa a idéia.
// 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....