
prerna.engine.impl.owl.AbstractOWLEngine Maven / Gradle / Ivy
The newest version!
package prerna.engine.impl.owl;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.Vector;
import org.apache.jena.vocabulary.OWL;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFHandlerException;
import org.openrdf.rio.rdfxml.RDFXMLWriter;
import prerna.engine.api.IConstructWrapper;
import prerna.engine.api.IExplorable;
import prerna.engine.api.IHeadersDataRow;
import prerna.engine.api.IRawSelectWrapper;
import prerna.engine.impl.rdf.RDFFileSesameEngine;
import prerna.masterdatabase.utility.MetamodelVertex;
import prerna.query.interpreters.IQueryInterpreter;
import prerna.query.querystruct.AbstractQueryStruct;
import prerna.rdf.engine.wrappers.WrapperManager;
import prerna.util.Constants;
import prerna.util.Utility;
public abstract class AbstractOWLEngine implements IExplorable {
private static final String SEMOSS_URI = "http://semoss.org/ontologies/";
private static final String CONTAINS_BASE_URI = SEMOSS_URI + Constants.DEFAULT_RELATION_CLASS + "/Contains";
private static final String GET_BASE_URI_FROM_OWL = "SELECT DISTINCT ?entity WHERE { { ?entity } } LIMIT 1";
private static final String FROM_SPARQL = "SELECT DISTINCT ?entity WHERE { "
+ "{?rel } "
+ "{?entity } "
+ "{?x ?rel ?y} "
+ "{?entity * ?x}"
+ "{<@nodeType@> * ?y}"
+ "}";
private static final String TO_SPARQL = "SELECT DISTINCT ?entity WHERE { "
+ "{?rel } "
+ "{?entity } "
+ "{?x ?rel ?y} "
+ "{<@nodeType@> * ?x}"
+ "{?entity * ?y}"
+ "}";
private static final Logger classLogger = LogManager.getLogger(AbstractOWLEngine.class);
// predefined URIs
public static final String SEMOSS_URI_PREFIX = "http://semoss.org/ontologies/";
public static final String DEFAULT_NODE_CLASS = "Concept";
public static final String DEFAULT_RELATION_CLASS = "Relation";
public static final String DEFAULT_PROP_CLASS = "Relation/Contains";
public static final String CONCEPTUAL_RELATION_NAME = "Conceptual";
public static final String PIXEL_RELATION_NAME = "Pixel";
public static final String ADDITIONAL_DATATYPE_NAME = "AdtlDataType";
// since we keep making these URIs often
public static final String BASE_NODE_URI = SEMOSS_URI_PREFIX + DEFAULT_NODE_CLASS;
public static final String BASE_RELATION_URI = SEMOSS_URI_PREFIX + DEFAULT_RELATION_CLASS;
public static final String BASE_PROPERTY_URI = SEMOSS_URI_PREFIX + DEFAULT_PROP_CLASS;
public static final String CONCEPTUAL_RELATION_URI = BASE_RELATION_URI + "/" + CONCEPTUAL_RELATION_NAME;
public static final String PIXEL_RELATION_URI = BASE_RELATION_URI + "/" + PIXEL_RELATION_NAME;
public static final String ADDITIONAL_DATATYPE_RELATION_URI = BASE_RELATION_URI + "/" + ADDITIONAL_DATATYPE_NAME;
public static final String TIME_KEY = "ENGINE:TIME";
public static final String TIME_URL = "http://semoss.org/ontologies/Concept/TimeStamp";
@Deprecated
public static final String LEGACY_PRIM_KEY_URI = BASE_RELATION_URI + "/" + "LEGACY_PRIM_KEY";
protected RDFFileSesameEngine baseDataEngine = null;
protected String engineId = null;
protected String engineName = null;
public AbstractOWLEngine(RDFFileSesameEngine baseDataEngine, String engineId, String engineName) {
this.baseDataEngine = baseDataEngine;
this.engineId = engineId;
this.engineName = engineName;
}
/**
*
* @param query
* @return
* @throws Exception
*/
public IRawSelectWrapper query(String query) throws Exception {
return WrapperManager.getInstance().getRawWrapper(this.baseDataEngine, query);
}
/**
*
* @param query
* @return
*/
public IConstructWrapper queryCW(String query) {
return WrapperManager.getInstance().getCWrapper(this.baseDataEngine, query);
}
@Override
public Vector getFromNeighbors(String physicalNodeType, int neighborHood) {
// this is where this node is the from node
//String physicalNodeType = getTransformedNodeName(Constants.DISPLAY_URI + Utility.getInstanceName(nodeType), false);
String query = "SELECT DISTINCT ?node WHERE { BIND(<" + physicalNodeType + "> AS ?start) {?rel <" + RDFS.SUBPROPERTYOF + "> } "
+ "{?node ?rel ?start}}";
return Utility.getVectorOfReturn(query, baseDataEngine, true);
}
public Vector getFromNeighborsWithRelation(String physicalNodeType, int neighborHood) {
// this is where this node is the from node
//String physicalNodeType = getTransformedNodeName(Constants.DISPLAY_URI + Utility.getInstanceName(nodeType), false);
String query = "SELECT DISTINCT ?node ?rel WHERE { BIND(<" + physicalNodeType + "> AS ?start) {?rel <" + RDFS.SUBPROPERTYOF + "> } "
+ "{?node ?rel ?start}}";
return Utility.getVectorArrayOfReturn(query, baseDataEngine, true);
}
// gets the to nodes
public Vector getToNeighbors(String physicalNodeType, int neighborHood) {
// this is where this node is the to node
String query = "SELECT DISTINCT ?node WHERE { BIND(<" + physicalNodeType + "> AS ?start) {?rel <" + RDFS.SUBPROPERTYOF + "> } "
+ "{?start ?rel ?node}}";
return Utility.getVectorOfReturn(query, baseDataEngine, true);
}
// gets the from and to nodes
public Vector getNeighbors(String nodeType, int neighborHood) {
Vector from = getFromNeighbors(nodeType, 0);
Vector to = getToNeighbors(nodeType, 0);
from.addAll(to);
return from;
}
@Override
public String getOWLDefinition() {
StringWriter output = new StringWriter();
try {
baseDataEngine.getRc().export(new RDFXMLWriter(output));
} catch (RepositoryException re) {
classLogger.error(Constants.STACKTRACE, re);
} catch (RDFHandlerException e) {
classLogger.error(Constants.STACKTRACE, e);
}
return output.toString();
}
@Override
public String getOwlFilePath() {
// TODO Auto-generated method stub
return null;
}
@Override
public void setOwlFilePath(String owlFilePath) {
// TODO Auto-generated method stub
}
@Override
public void commitOWL() {
// TODO Auto-generated method stub
}
@Override
public void addProperty(String key, String value) {
// TODO Auto-generated method stub
}
@Override
public String getProperty(String key) {
return null;
}
@Override
public Vector executeInsightQuery(String sparqlQuery, boolean isDbQuery) {
return null;
}
@Override
public String getNodeBaseUri() {
String baseUri = null;
IRawSelectWrapper wrapper = null;
try {
wrapper = WrapperManager.getInstance().getRawWrapper(this.baseDataEngine, GET_BASE_URI_FROM_OWL);
if(wrapper.hasNext()) {
IHeadersDataRow data = wrapper.next();
baseUri = data.getRawValues()[0] + "";
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(wrapper != null) {
try {
wrapper.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
if(baseUri == null){
baseUri = Constants.CONCEPT_URI;
}
return baseUri;
}
public Vector getConcepts() {
String query = "SELECT ?concept WHERE { {?concept }"
+ " Filter(?concept != ) }";
return Utility.getVectorOfReturn(query, baseDataEngine, true);
}
/**
* Runs a select query on the base data engine of this engine
*/
public Object execOntoSelectQuery(String query) {
classLogger.debug("Running select query on base data engine of " + this.engineName);
classLogger.debug("Query is " + query);
return this.baseDataEngine.execQuery(query);
}
/**
* Runs insert query on base data engine of this engine
*/
public void ontoInsertData(String query) {
classLogger.debug("Running insert query on base data engine of " + this.engineName);
classLogger.debug("Query is " + query);
baseDataEngine.insertData(query);
}
/**
* This method runs an update query on the base data engine which contains all owl and metamodel information
*/
public void ontoRemoveData(String query) {
classLogger.debug("Running update query on base data engine of " + this.engineName);
classLogger.debug("Query is " + query);
baseDataEngine.removeData(query);
}
@Override
public String getDataTypes(String uri) {
String query = "SELECT DISTINCT ?TYPE WHERE { {<" + uri + "> <" + RDFS.CLASS.toString() + "> ?TYPE} }";
IRawSelectWrapper wrapper = null;
try {
wrapper = WrapperManager.getInstance().getRawWrapper(baseDataEngine, query);
if(wrapper.hasNext()) {
return wrapper.next().getValues()[0].toString();
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(wrapper != null) {
try {
wrapper.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return null;
}
@Override
public Map getDataTypes(String... uris) {
StringBuilder bindBuilder = new StringBuilder();
for(String uri : uris) {
bindBuilder.append("(<").append(uri).append(">)");
}
String query = "SELECT DISTINCT ?NODE ?TYPE WHERE { {?NODE <" + RDFS.CLASS.toString() + "> ?TYPE} } ";
String bindings = bindBuilder.toString();
if(!bindings.isEmpty()) {
query += "BINDINGS ?NODE {" + bindings + "}";
}
// results to be stored
Map retMap = new Hashtable<>();
IRawSelectWrapper wrapper = null;
try {
wrapper = WrapperManager.getInstance().getRawWrapper(baseDataEngine, query);
while(wrapper.hasNext()) {
Object[] row = wrapper.next().getValues();
String node = row[0].toString();
String type = row[1].toString();
retMap.put(node, type);
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(wrapper != null) {
try {
wrapper.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return retMap;
}
@Override
public String getAdtlDataTypes(String uri){
String query = "SELECT DISTINCT ?ADTLTYPE WHERE { {<" + uri + "> <" + ADDITIONAL_DATATYPE_RELATION_URI + "> ?ADTLTYPE} }";
IRawSelectWrapper wrapper = null;
try {
wrapper = WrapperManager.getInstance().getRawWrapper(baseDataEngine, query);
if(wrapper.hasNext()) {
IHeadersDataRow row = wrapper.next();
String adtlType = row.getValues()[0].toString().replace("ADTLTYPE:", "");
return adtlType;
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(wrapper != null) {
try {
wrapper.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return null;
}
@Override
public Map getAdtlDataTypes(String... uris){
StringBuilder bindBuilder = new StringBuilder();
for(String uri : uris) {
bindBuilder.append("(<").append(uri).append(">)");
}
String query = "SELECT DISTINCT ?NODE ?ADTLTYPE WHERE { {?NODE <" + ADDITIONAL_DATATYPE_RELATION_URI + "> ?ADTLTYPE} } ";
String bindings = bindBuilder.toString();
if(!bindings.isEmpty()) {
query += "BINDINGS ?NODE {" + bindings + "}";
}
// results to be stored
Map retMap = new Hashtable<>();
IRawSelectWrapper wrapper = null;
try {
wrapper = WrapperManager.getInstance().getRawWrapper(baseDataEngine, query);
while(wrapper.hasNext()) {
Object[] row = wrapper.next().getValues();
String node = row[0].toString();
String type = row[1].toString();
if (type != null && !type.equals("")) {
type = type.replace("ADTLTYPE:", "");
retMap.put(node, type);
}
retMap.put(node, type);
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(wrapper != null) {
try {
wrapper.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
return retMap;
}
@Override
public Map getMetamodel() {
// create this from the query struct
Map tableToVert = new TreeMap<>();
String getSelectorsInformation = "SELECT DISTINCT ?concept ?property WHERE { "
+ "{?concept }"
+ "OPTIONAL {"
+ "{?property <" + CONTAINS_BASE_URI + "> } "
+ "{?concept <" + OWL.DatatypeProperty.toString() + "> ?property } "
+ "}" // END OPTIONAL
+ "}"; // END WHERE
// execute the query and loop through and add the nodes and props
IRawSelectWrapper wrapper = null;
try {
wrapper = WrapperManager.getInstance().getRawWrapper(baseDataEngine, getSelectorsInformation);
while(wrapper.hasNext()) {
IHeadersDataRow hrow = wrapper.next();
Object[] raw = hrow.getRawValues();
if(raw[0].toString().equals("http://semoss.org/ontologies/Concept")) {
continue;
}
String concept = Utility.getInstanceName(raw[0].toString());
Object property = raw[1];
if(!tableToVert.containsKey(concept)) {
MetamodelVertex vert = new MetamodelVertex(concept);
tableToVert.put(concept, vert);
}
if(property != null && !property.toString().isEmpty()) {
tableToVert.get(concept).addProperty(Utility.getClassName(property.toString()));
}
}
} catch (Exception e) {
classLogger.error(Constants.STACKTRACE, e);
} finally {
if(wrapper != null) {
try {
wrapper.close();
} catch (IOException e) {
classLogger.error(Constants.STACKTRACE, e);
}
}
}
List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy