2013-09-06 1 views
1

Недавно я переключился с OWL API на Jena в надежде, что производительность в отношении вставки и запроса данных увеличится.Как вставить/обновить/удалить людей с Jena SDB, сохраняя максимальную производительность?

Итак, я начал с загрузки своей онтологии OWL в тройной магазин на основе MySQL с использованием Jena SDB. Поэтому я использовал

model.read("owl-concepts.turtle") 

Jena создает около 1500 узлов в тройном магазине (в таблице Mysql). Первоначально я был немного удивлен большим количеством узлов. Но это кажется разумным, поскольку онтология OWL содержит приблизительно 80 классов OWL с несколькими свойствами данных и объектов.

Для чтения данных (отдельных лиц) из онтологии я использовал интерфейс Jena SDB. Я получил модель и на основе модели ontModel. Я использовал это ontModel изменить индивидуумов, например:

ontModel.createIndividual(...); 
ontModel.getIndividual(....); 
individual.remove(); 

Для ontModel я использовал OWL_MEM; в соответствии с документацией это должно означать, что не применяется никаких рассуждений.

Я понял, что на основе описанного подхода изменение индивидуальных данных не так быстро, как я ожидал. В среднем вставка простого человека занимает от 2 до 30 секунд.

Итак, я начал спрашивать: использует ли интерфейс модели в Йене рекомендованный способ изменения данных или этот подход имеет низкую производительность, и вместо этого SPARQL следует использовать для модификации данных? Мой первоначальный план состоял в том, чтобы использовать SPARQL только для запрашивающей части ...

Был бы благодарен за любое мнение экспертов или ваш опыт работы с Йеной.

+0

Jena TDB быстрее, чем Jena SDB. – AndyS

ответ

0

Использование постоянного хранилища втройне - особенно SDB - с разумным основанием - не очень хорошая идея. Разумщики часто выполняют большое количество случайных доступов в базе данных, каждый из которых имеет небольшие накладные расходы. Когда вы добавляете их, все становится медленным.

Аналогичным образом используйте SPARQL, а не API-интерфейс модели или онтологии, так как вы снова создаете много мелких обращений.

Учитывая размер ваших данных, это, вероятно, удобно вписывается в память, поэтому сделайте это. Вы можете всегда перемещать данные из массива, а также хранить SDB-хранилище, чтобы сохранить его.

+0

Тем не менее, @ user1690752 сказал, что он не использует аргументатор. –

0

Для загрузки просто,

 store.getLoader().startBulkUpdate(); 
     ... 
     store.getLoader().flushTriples(); 

(где store является хранилище объектов SBD) но если вы добавляете и удаление, это трудно ускорить.

Один подход - считывать все данные в память, работать там и возвращать все. Вы можете сделать это с данными, разделенными Fuseki, и с использованием протокола протокола хранения протокола SPARQL. Вы можете использовать любой сервер хранения.