Йена: Как вывести данные / проблемы с производительностью
Я хотел бы использовать возможности вывода Jena, но у меня возникают некоторые проблемы с производительностью, когда я использую InfModel.
Вот упрощенный обзор моей онтологии:
Свойства:
hasX (Ranges(intersection): X, inverse properties: isXOf)
|-- hasSpecialX (Ranges(intersection): X, inverse properties: isSpecialXOf)
isXOf (Domains(intersection): X, inverse properties: hasX)
|--isSpecialXOf (Domains(intersection): X, inverse properties: hasSpecialX)
Кроме того, есть класс "Объект":
Object hasSpecialX some X
Явно хранятся следующие данные:
SomeObject a Object
SomeX a X
SomeObject hasSpecialX SomeX
Используя следующий запрос, я бы хотел определить, к какому классу относится экземпляр. Согласно сделанным предположениям, должен быть возвращен только SomeObject.
SELECT ?x WHERE { ?x :hasX :SomeX . }
Тем не менее, запрос против ds.getDefaultModel()
не работает, потому что данные не хранятся явно. Когда я использую infModel
с другой стороны, запрос никогда не заканчивается. Самое большее, я ждал 25 минут, прежде чем прерывать. (Тройной магазин имеет размер около 180 МБ)
Это мой код:
OntModel ont = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM_MICRO_RULE_INF, null);
ont.read("file:..." , "RDF/XML");
Reasoner reasoner = ReasonerRegistry.getOWLMicroReasoner();
reasoner = reasoner.bindSchema(ont);
Dataset dataset = TDBFactory.createDataset(...);
Model model = dataset.getDefaultModel();
InfModel infModel = ModelFactory.createInfModel(reasoner, model);
QueryExecution qe = null;
ResultSet rs;
try {
String qry = "SELECT ?x WHERE { ?x :hasX :SomeX . }";
qe = QueryExecutionFactory.create(qry, infModel);
rs = qe.execSelect();
while(rs.hasNext()) {
QuerySolution sol = rs.nextSolution();
System.out.println(sol.get("x"));
}
} finally {
qe.close();
infModel.close();
model.close();
dataset.close();
}
Что-то не так с приведенным выше кодом, или что еще может быть причиной того, что он не работает?
Кроме того, я хотел бы знать, смогу ли я повысить производительность, если я сделаю "Экспортировать выведенные аксиомы как онтологию" (как предоставлено Protege)?
РЕДАКТИРОВАТЬ: Тем временем я пытался использовать Pellet, но все же я не могу получить предполагаемую модель, как я описал в моем другом вопросе: OutOfMemoryError с использованием Pellet в качестве Reasoner. Так что еще я могу сделать?
1 ответ
Что касается производительности, лучше сделать вывод перед подтверждением данных, а не делать SPARQL с отключенным механизмом вывода Jena. Вы уже используете TDB, который является подходящим компонентом Jena для больших наборов данных.
Если при непосредственном использовании выведенных данных вы не получите ожидаемую производительность, я рекомендую перейти в более масштабируемый тройной магазин ( 4store или Virtuoso).