Я хотел бы генерировать выводы по онтологии с помощью OWL API или напрямую с помощью чего-то вроде резонатора отшельника. Это легко (код показан ниже). Тем не менее, я хотел бы кэшировать/хранить/сохранять эти результаты, чтобы мне не приходилось каждый раз перезапускать резонер. Это то, что происходит в ВМ. В первый раз я называю это:
Set<OWLClass> classes = reasoner.getSubClasses(parent, false).getFlattened();
это занимает около 20 секунд (в этом примере). Во второй раз генерация тех же результатов не занимает много времени, потому что они кэшируются. Это отлично. Однако, если я отбрасываю свою виртуальную машину, мне приходится повторно запускать резонер (у меня есть несколько довольно длинных запросов) или сохранять вывод в базе данных, чтобы сразу отобразить их.
Reasoner нельзя сериализовать (ни из Hermit, ни через OWL API), и мне кажется, что у меня нет очевидного способа воссоздать Reasoner и загрузить в него любые предыдущие результаты. Каждый раз их приходится пересчитывать.
Сериализировать онтологию несложно, но я не вижу способа перезагрузить результаты в средство рассуждений, чтобы избавить вас от повторных вызовов.
Есть что-то, что мне не хватает? Будет ли Джена лучшим выбором для этого?
OWLOntologyManager owlOntologyManager = OWLManager.createOWLOntologyManager();
File file = new File("resource/RDFData/release", "NEMOv2.85_GAFLP1_diffwave_data.rdf");
IRI iri = IRI.create(file);
OWLDataFactory factory = owlOntologyManager.getOWLDataFactory();
OWLOntology owlOntology = owlOntologyManager.loadOntologyFromOntologyDocument(iri);
Reasoner reasoner = new Reasoner(owlOntology);
OWLClass parent = factory.getOWLClass(IRI.create(DataSet.NS + "#NEMO_0877000"));
Set<OWLClass> classes = reasoner.getSubClasses(parent, false).getFlattened();
FileOutputStream fos = null;
ObjectOutputStream out = null;
try {
fos = new FileOutputStream("reasoner.ser");
out = new ObjectOutputStream(fos);
out.writeObject(reasoner);
out.close();
} catch (IOException ex) {
ex.printStackTrace();
}