
prerna.reactor.database.upload.rdf.RdfCsvUploadReactor Maven / Gradle / Ivy
The newest version!
package prerna.reactor.database.upload.rdf;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.config.Configurator;
import org.openrdf.model.vocabulary.RDF;
import prerna.algorithm.api.SemossDataType;
import prerna.auth.User;
import prerna.engine.api.IDatabaseEngine;
import prerna.engine.api.IEngine;
import prerna.engine.api.ISesameRdfEngine;
import prerna.engine.impl.owl.WriteOWLEngine;
import prerna.engine.impl.rdf.RDFDefaultDatabaseTypeFactory;
import prerna.engine.impl.rdf.RdfUploadReactorUtility;
import prerna.poi.main.helper.CSVFileHelper;
import prerna.reactor.database.upload.AbstractDatabaseUploadFileReactor;
import prerna.util.Constants;
import prerna.util.DIHelper;
import prerna.util.UploadInputUtility;
import prerna.util.UploadUtilities;
import prerna.util.Utility;
public class RdfCsvUploadReactor extends AbstractDatabaseUploadFileReactor {
private CSVFileHelper helper;
public RdfCsvUploadReactor() {
this.keysToGet = new String[] {
UploadInputUtility.DATABASE,
UploadInputUtility.FILE_PATH,
UploadInputUtility.ADD_TO_EXISTING,
UploadInputUtility.DELIMITER,
UploadInputUtility.DATA_TYPE_MAP,
UploadInputUtility.NEW_HEADERS,
UploadInputUtility.ADDITIONAL_DATA_TYPES,
UploadInputUtility.METAMODEL,
UploadInputUtility.PROP_FILE,
UploadInputUtility.START_ROW,
UploadInputUtility.END_ROW,
UploadInputUtility.CUSTOM_BASE_URI
};
}
public void generateNewDatabase(User user, String newDatabaseName, String filePath) throws Exception {
final String delimiter = UploadInputUtility.getDelimiter(this.store);
String baseUri = UploadInputUtility.getCustomBaseURI(this.store);
int stepCounter = 1;
logger.info(stepCounter + ". Create metadata for database...");
File owlFile = UploadUtilities.generateOwlFile(IEngine.CATALOG_TYPE.DATABASE, this.databaseId, newDatabaseName);
logger.info(stepCounter + ". Complete");
stepCounter++;
// need instance to write to smss
this.database = RDFDefaultDatabaseTypeFactory.getDefaultSesameEngine();
logger.info(stepCounter + ". Create properties file for database...");
this.tempSmss = UploadUtilities.createTemporaryRdfSmss(this.database, this.databaseId, newDatabaseName, owlFile, baseUri);
DIHelper.getInstance().setEngineProperty(this.databaseId + "_" + Constants.STORE, this.tempSmss.getAbsolutePath());
logger.info(stepCounter + ". Complete");
stepCounter++;
// get metamodel
Map metamodelProps = UploadInputUtility.getMetamodelProps(this.store, this.insight);
Map dataTypesMap = (Map) metamodelProps.get(Constants.DATA_TYPES);
/*
* Load data into rdf database
*/
logger.info(stepCounter + ". Create database store...");
this.database.setEngineId(this.databaseId);
this.database.setEngineName(newDatabaseName);
this.database.open(this.tempSmss.getAbsolutePath());
String semossURI = DIHelper.getInstance().getProperty(Constants.SEMOSS_URI);
String sub = semossURI + "/" + Constants.DEFAULT_NODE_CLASS;
String typeOf = RDF.TYPE.stringValue();
String obj = Constants.CLASS_URI;
this.database.doAction(IDatabaseEngine.ACTION_TYPE.ADD_STATEMENT, new Object[] { sub, typeOf, obj, true });
sub = semossURI + "/" + Constants.DEFAULT_RELATION_CLASS;
obj = Constants.DEFAULT_PROPERTY_URI;
this.database.doAction(IDatabaseEngine.ACTION_TYPE.ADD_STATEMENT, new Object[] { sub, typeOf, obj, true });
logger.info(stepCounter + ". Complete");
stepCounter++;
logger.info(stepCounter + ". Start loading data..");
Configurator.setLevel(logger.getName(), Level.WARN);
this.helper = UploadUtilities.getHelper(filePath, delimiter, dataTypesMap, (Map) metamodelProps.get(UploadInputUtility.NEW_HEADERS));
WriteOWLEngine owlEngine = this.database.getOWLEngineFactory().getWriteOWL();
owlEngine.addCustomBaseURI(baseUri);
Object[] headerTypesArr = UploadUtilities.getHeadersAndTypes(this.helper, dataTypesMap, (Map) metamodelProps.get(UploadInputUtility.ADDITIONAL_DATA_TYPES));
String[] headers = (String[]) headerTypesArr[0];
SemossDataType[] types = (SemossDataType[]) headerTypesArr[1];
String[] additionalTypes = (String[]) headerTypesArr[2];
processRelationships(this.database, owlEngine, this.helper, Arrays.asList(headers), types, metamodelProps);
logger.info(stepCounter + ". Complete");
stepCounter++;
logger.info(stepCounter + ". Commit database metadata...");
RdfUploadReactorUtility.loadMetadataIntoEngine(this.database, owlEngine);
// add the owl metadata
UploadUtilities.insertOwlMetadataToGraphicalEngine(owlEngine, (Map>) metamodelProps.get(Constants.NODE_PROP),
UploadInputUtility.getCsvDescriptions(this.store), UploadInputUtility.getCsvLogicalNames(this.store));
owlEngine.commit();
owlEngine.export();
owlEngine.close();
// commit the created database
this.database.commit();
((ISesameRdfEngine) this.database).infer();
((ISesameRdfEngine) this.database).exportDB();
logger.info(stepCounter + ". Complete");
stepCounter++;
/*
* Back to normal upload database stuff
*/
logger.info(stepCounter + ". Save csv metamodel prop file");
UploadUtilities.createPropFile(this.databaseId, newDatabaseName, filePath, metamodelProps);
logger.info(stepCounter + ". Complete");
}
public void addToExistingDatabase(String filePath) throws Exception {
// get existing database
int stepCounter = 1;
if (!(this.database instanceof ISesameRdfEngine)) {
throw new IllegalArgumentException("Invalid database type");
}
logger.info(stepCounter + ". Get database upload input...");
Configurator.setLevel(logger.getName(), Level.WARN);
final String delimiter = UploadInputUtility.getDelimiter(this.store);
Map metamodelProps = UploadInputUtility.getMetamodelProps(this.store, this.insight);
Map dataTypesMap = (Map) metamodelProps.get(Constants.DATA_TYPES);
logger.info(stepCounter + ". Done");
stepCounter++;
logger.info(stepCounter + ". Parsing file metadata...");
this.helper = UploadUtilities.getHelper(filePath, delimiter, dataTypesMap, (Map) metamodelProps.get(UploadInputUtility.NEW_HEADERS));
// get the user selected datatypes for each header
Object[] headerTypesArr = UploadUtilities.getHeadersAndTypes(this.helper, dataTypesMap, (Map) metamodelProps.get(UploadInputUtility.ADDITIONAL_DATA_TYPES));
String[] headers = (String[]) headerTypesArr[0];
SemossDataType[] types = (SemossDataType[]) headerTypesArr[1];
String[] additionalTypes = (String[]) headerTypesArr[2];
logger.info(stepCounter + ". Complete");
stepCounter++;
logger.info(stepCounter + ". Start loading data..");
WriteOWLEngine owlEngine = this.database.getOWLEngineFactory().getWriteOWL();
processRelationships(this.database, owlEngine, this.helper, Arrays.asList(headers), types, metamodelProps);
logger.info(stepCounter + ". Complete");
stepCounter++;
logger.warn(stepCounter + ". Committing database metadata....");
RdfUploadReactorUtility.loadMetadataIntoEngine(this.database, owlEngine);
// add the owl metadata
UploadUtilities.insertOwlMetadataToGraphicalEngine(owlEngine, (Map>) metamodelProps.get(Constants.NODE_PROP),
UploadInputUtility.getCsvDescriptions(this.store), UploadInputUtility.getCsvLogicalNames(this.store));
owlEngine.commit();
owlEngine.export();
owlEngine.close();
// commit the created database
this.database.commit();
((ISesameRdfEngine) this.database).infer();
((ISesameRdfEngine) this.database).exportDB();
logger.info(stepCounter + ". Complete");
stepCounter++;
logger.info(stepCounter + ". Save csv metamodel prop file ");
UploadUtilities.createPropFile(this.databaseId, this.database.getEngineName(), filePath, metamodelProps);
logger.info(stepCounter + ". Complete");
}
@Override
public void closeFileHelpers() {
if (this.helper != null) {
this.helper.clear();
}
}
private void parseMetamodel(Map metamodel, List nodePropList, List relationList, List relPropList) {
// get node properties
if (metamodel.get(Constants.NODE_PROP) != null) {
if (metamodel.get(Constants.NODE_PROP) != null) {
Map nodeProps = (Map) metamodel.get(Constants.NODE_PROP);
for (String concept : nodeProps.keySet()) {
List conceptProps = (List) nodeProps.get(concept);
for (String property : conceptProps) {
String relation = concept + "%" + property;
nodePropList.add(relation);
}
}
}
}
// get relationships
if (metamodel.get(Constants.RELATION) != null) {
List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy