2012-04-16 27 views
6

Me gustaría usar las capacidades de inferencia de Jena, pero estoy teniendo algunos problemas de rendimiento cuando estoy usando InfModel.Jena: cómo inferir problemas de datos/rendimiento

Aquí está una descripción simplificada de mi ontología:

Propiedades:

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) 

Además hay un 'objeto' clase:

Object hasSpecialX some X 

almacenado explícitamente se los siguientes datos:

SomeObject a Object 
SomeX a X 
SomeObject hasSpecialX SomeX 

Usando la siguiente consulta, me gustaría determinar a qué clase pertenece una instancia. De acuerdo con las suposiciones hechas, solo 'SomeObject' debería ser devuelto.

SELECT ?x WHERE { ?x :hasX :SomeX . } 

Sin embargo, la consulta contra ds.getDefaultModel() no funciona, ya que los datos no se almacenan de forma explícita. Cuando estoy usando infModel por otro lado, la consulta nunca termina. Por más tiempo he estado esperando durante 25 minutos antes de abortar. (El triplestore tiene un tamaño de aproximadamente 180 MB)

Este es mi código:

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(); 
} 

¿Hay algo malo en el código anterior, o qué otra cosa podría ser la razón por la que no funciona?

Además de eso, me gustaría saber si puedo aumentar el rendimiento si lo hago 'Exportar axiomas inferidos como ontología' (proporcionado por Protege)?

EDIT: que mientras tanto he tratado de utilizar pellets, pero todavía no puedo conseguir un modelo inferido, como he descrito en mi otra pregunta: OutOfMemoryError using Pellet as Reasoner. Entonces, ¿qué más puedo hacer?

Respuesta

3

En cuanto al rendimiento, es mejor hacer la inferencia antes de afirmar los datos y no hacer los SPARQL con el mecanismo de inferencia de Jena desactivado. Ya está utilizando TDB, que es el componente correcto de Jena para grandes conjuntos de datos.

Si al utilizar los datos inferidos directamente no obtiene el rendimiento esperado, le recomiendo que se mude a una tienda triple más escalable (4store o Virtuoso).

+0

Gracias por su respuesta! Sin embargo, no estoy seguro de cómo 'hacer la inferencia antes de afirmar los datos'. ¿Podría explicarme cómo hacer esto? – Pedro

+0

Para eso puedes usar cualquier razonador, Pellet por ejemplo. –

+0

Supongo que puedo acceder al modelo inferido usando 'infModel.getDeductionsModel()', pero lleva un tiempo calcularlo y el problema de rendimiento causado por mi código anterior probablemente se deba a que internamente la inferencia se aplica a toda la base de datos. Pero como mi ontología todavía está cambiando, no quiero almacenar físicamente los datos inferidos en la misma TDB. Entonces, ¿cuál es la mejor práctica en ese caso? ¿Los datos inferidos generalmente se almacenan en una triple tienda diferente? – Pedro

Cuestiones relacionadas