Jena:Как сделать вывод о проблемах с данными/производительностью

Я хотел бы использовать возможности вывода 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 . Так что еще я могу сделать?

6
задан Community 23 May 2017 в 12:06
поделиться