NIHVIVO-1827 cache application metadata graph in memory
This commit is contained in:
parent
c0074b0ce8
commit
1bfaecdefa
1 changed files with 72 additions and 9 deletions
|
@ -17,6 +17,11 @@ import org.apache.commons.logging.LogFactory;
|
||||||
import com.hp.hpl.jena.ontology.Individual;
|
import com.hp.hpl.jena.ontology.Individual;
|
||||||
import com.hp.hpl.jena.ontology.OntModel;
|
import com.hp.hpl.jena.ontology.OntModel;
|
||||||
import com.hp.hpl.jena.ontology.OntModelSpec;
|
import com.hp.hpl.jena.ontology.OntModelSpec;
|
||||||
|
import com.hp.hpl.jena.query.Query;
|
||||||
|
import com.hp.hpl.jena.query.QueryExecution;
|
||||||
|
import com.hp.hpl.jena.query.QueryExecutionFactory;
|
||||||
|
import com.hp.hpl.jena.query.QueryFactory;
|
||||||
|
import com.hp.hpl.jena.query.Syntax;
|
||||||
import com.hp.hpl.jena.rdf.model.Literal;
|
import com.hp.hpl.jena.rdf.model.Literal;
|
||||||
import com.hp.hpl.jena.rdf.model.Model;
|
import com.hp.hpl.jena.rdf.model.Model;
|
||||||
import com.hp.hpl.jena.rdf.model.ModelFactory;
|
import com.hp.hpl.jena.rdf.model.ModelFactory;
|
||||||
|
@ -172,6 +177,34 @@ public class JenaDataSourceSetupSDB extends JenaDataSourceSetupBase implements j
|
||||||
OntModel unionTBoxModel = ModelFactory.createOntologyModel(MEM_ONT_MODEL_SPEC,ModelFactory.createUnion(baseOms.getTBoxModel(), inferenceOms.getTBoxModel()));
|
OntModel unionTBoxModel = ModelFactory.createOntologyModel(MEM_ONT_MODEL_SPEC,ModelFactory.createUnion(baseOms.getTBoxModel(), inferenceOms.getTBoxModel()));
|
||||||
unionOms.setTBoxModel(unionTBoxModel);
|
unionOms.setTBoxModel(unionTBoxModel);
|
||||||
|
|
||||||
|
|
||||||
|
// Application metadata model is cached in memory.
|
||||||
|
try {
|
||||||
|
Model applicationMetadataModelDB = makeDBModel(bds, JENA_APPLICATION_METADATA_MODEL, DB_ONT_MODEL_SPEC, TripleStoreType.SDB);
|
||||||
|
|
||||||
|
if (applicationMetadataModelDB == null || applicationMetadataModelDB.size() == 0) {
|
||||||
|
repairAppMetadataModel(store, aboxAssertions, aboxInferences);
|
||||||
|
}
|
||||||
|
|
||||||
|
OntModel applicationMetadataModel = ModelFactory.createOntologyModel(MEM_ONT_MODEL_SPEC);
|
||||||
|
|
||||||
|
if (applicationMetadataModelDB != null && applicationMetadataModelDB.size() > 0) {
|
||||||
|
long startTime = System.currentTimeMillis();
|
||||||
|
System.out.println("Copying cached application metadata model into memory");
|
||||||
|
applicationMetadataModel.add(applicationMetadataModelDB);
|
||||||
|
System.out.println((System.currentTimeMillis()-startTime)/1000+" seconds to load application metadata model assertions of size " + applicationMetadataModel.size());
|
||||||
|
applicationMetadataModel.getBaseModel().register(new ModelSynchronizer(applicationMetadataModelDB));
|
||||||
|
baseOms.setApplicationMetadataModel(applicationMetadataModel);
|
||||||
|
inferenceOms.setApplicationMetadataModel(baseOms.getApplicationMetadataModel());
|
||||||
|
unionOms.setApplicationMetadataModel(baseOms.getApplicationMetadataModel());
|
||||||
|
} else {
|
||||||
|
log.error("The application metadata model was not found");
|
||||||
|
}
|
||||||
|
} catch (Throwable e) {
|
||||||
|
log.error("Unable to load application metadata model cache from DB", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// add the vitro ontologies to the tbox models
|
// add the vitro ontologies to the tbox models
|
||||||
OntModel vitroTBoxModel = (new JenaBaseDaoCon()).getConstModel();
|
OntModel vitroTBoxModel = (new JenaBaseDaoCon()).getConstModel();
|
||||||
baseOms.getTBoxModel().addSubModel(vitroTBoxModel);
|
baseOms.getTBoxModel().addSubModel(vitroTBoxModel);
|
||||||
|
@ -219,11 +252,6 @@ public class JenaDataSourceSetupSDB extends JenaDataSourceSetupBase implements j
|
||||||
sce.getServletContext().setAttribute("baseOntModelSelector", baseOms); //assertions
|
sce.getServletContext().setAttribute("baseOntModelSelector", baseOms); //assertions
|
||||||
sce.getServletContext().setAttribute("inferenceOntModelSelector", inferenceOms); //inferences
|
sce.getServletContext().setAttribute("inferenceOntModelSelector", inferenceOms); //inferences
|
||||||
|
|
||||||
// use "full" models as the legacy application metadata models
|
|
||||||
baseOms.setApplicationMetadataModel(baseOms.getFullModel());
|
|
||||||
inferenceOms.setApplicationMetadataModel(inferenceOms.getFullModel());
|
|
||||||
unionOms.setApplicationMetadataModel(unionOms.getFullModel());
|
|
||||||
|
|
||||||
ApplicationBean appBean = getApplicationBeanFromOntModel(unionOms.getFullModel(),wadf);
|
ApplicationBean appBean = getApplicationBeanFromOntModel(unionOms.getFullModel(),wadf);
|
||||||
if (appBean != null) {
|
if (appBean != null) {
|
||||||
sce.getServletContext().setAttribute("applicationBean", appBean);
|
sce.getServletContext().setAttribute("applicationBean", appBean);
|
||||||
|
@ -448,6 +476,37 @@ public class JenaDataSourceSetupSDB extends JenaDataSourceSetupBase implements j
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void getAppMetadata(Model source, Model target) {
|
||||||
|
|
||||||
|
String amdQuery = "DESCRIBE ?x WHERE { " +
|
||||||
|
"{?x a <" + VitroVocabulary.PORTAL +"> } UNION " +
|
||||||
|
"{?x a <" + VitroVocabulary.TAB +"> } UNION " +
|
||||||
|
"{?x a <" + VitroVocabulary.PROPERTYGROUP +"> } UNION " +
|
||||||
|
"{?x a <" + VitroVocabulary.CLASSGROUP +"> } } ";
|
||||||
|
|
||||||
|
try {
|
||||||
|
Query q = QueryFactory.create(amdQuery, Syntax.syntaxARQ);
|
||||||
|
QueryExecution qe = QueryExecutionFactory.create(q, source);
|
||||||
|
qe.execDescribe(target);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("unable to create the application metadata model",e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void repairAppMetadataModel(Store store, Model aboxAssertions, Model aboxInferences) {
|
||||||
|
|
||||||
|
log.info("Repairing the application metadata model");
|
||||||
|
Model applicationMetadataModel = SDBFactory.connectNamedModel(store, JenaDataSourceSetupBase.JENA_APPLICATION_METADATA_MODEL);
|
||||||
|
getAppMetadata(aboxAssertions, applicationMetadataModel);
|
||||||
|
getAppMetadata(aboxInferences, applicationMetadataModel);
|
||||||
|
aboxAssertions.remove(applicationMetadataModel);
|
||||||
|
aboxInferences.remove(applicationMetadataModel);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
public static StoreDesc makeStoreDesc() {
|
public static StoreDesc makeStoreDesc() {
|
||||||
String layoutStr = ConfigurationProperties.getProperty(
|
String layoutStr = ConfigurationProperties.getProperty(
|
||||||
"VitroConnection.DataSource.sdb.layout","layout2/hash");
|
"VitroConnection.DataSource.sdb.layout","layout2/hash");
|
||||||
|
@ -505,9 +564,13 @@ public class JenaDataSourceSetupSDB extends JenaDataSourceSetupBase implements j
|
||||||
Model aboxInferences = SDBFactory.connectNamedModel(store, JenaDataSourceSetupBase.JENA_INF_MODEL);
|
Model aboxInferences = SDBFactory.connectNamedModel(store, JenaDataSourceSetupBase.JENA_INF_MODEL);
|
||||||
copyDifference(inferenceModel, memTboxInferences, aboxInferences);
|
copyDifference(inferenceModel, memTboxInferences, aboxInferences);
|
||||||
|
|
||||||
|
// Set up the application metadata model
|
||||||
|
Model applicationMetadataModel = SDBFactory.connectNamedModel(store, JenaDataSourceSetupBase.JENA_APPLICATION_METADATA_MODEL);
|
||||||
|
getAppMetadata(memModel, applicationMetadataModel);
|
||||||
|
log.info("During initial SDB setup, created an application metadata model of size " + applicationMetadataModel.size());
|
||||||
|
|
||||||
// Make sure the reasoner takes into account the newly-set-up data.
|
// Make sure the reasoner takes into account the newly-set-up data.
|
||||||
SimpleReasonerSetup.setRecomputeRequired(ctx);
|
SimpleReasonerSetup.setRecomputeRequired(ctx);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Reference in a new issue