Я хотел бы использовать возможности вывода Jena, но у меня возникают проблемы с производительностью при использовании ИнфМодель.
Вот упрощенный обзор моей онтологии:
Свойства:
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 минут, прежде чем прервать. (Triplestore имеет размер около 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 as Reasoner . Так что еще я могу сделать?