Сериализация результатов Ontology Reasoner с помощью OWL API для веб-сайта

Я хотел бы генерировать выводы по онтологии с помощью 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(); 
} 

person user695555    schedule 08.08.2012    source источник
comment
Ответ заключается в том, чтобы экспортировать ваши онтологии OWL вместе с предполагаемой онтологией. После прочтения новой выведенной онтологии и создания с ее помощью рассудка, рассудок не чувствует необходимости в повторном выводе. Выполните описанный здесь экспорт: owlapi.svn.sourceforge.net/viewvc/owlapi/owl1_1/trunk/examples/, а затем повторно импортировать: OWLOntology readOntology = owlOntologyManager.loadOntology(iriOut); Reasoner r2 = новый Reasoner (readOntology); классы = r2.getSubClasses(родительский, ложный).getFlattened();   -  person user695555    schedule 08.08.2012


Ответы (1)


Сохранение выведенной онтологии (которую вы получили из генератора InferredOntologyGenerator) кажется лучшим методом.

Насколько я понимаю, модуль рассуждений по-прежнему будет проверять непротиворечивость и классифицировать онтологию, когда вы создаете новый модуль рассуждений, но это происходит быстрее, потому что вы сделали все выводы явными.

person papercutexit    schedule 15.08.2012