All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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> relationships = new Vector<>();

		// query to get all the relationships 
		String getRelationshipsInformation = "SELECT DISTINCT ?fromConceptualConcept ?rel ?toConceptualConcept WHERE { "
				+ "{?fromConcept  } "
				+ "{?toConcept  } "
				+ "{?rel <" + RDFS.SUBPROPERTYOF.toString() + "> } "
				+ "{?fromConcept ?rel ?toConcept} "
				+ "{?fromConcept  ?fromConceptualConcept }"
				+ "{?toConcept  ?toConceptualConcept }"
				+ "}"; // END WHERE

		try {
			wrapper = WrapperManager.getInstance().getRawWrapper(baseDataEngine, getRelationshipsInformation);
			while(wrapper.hasNext()) {
				IHeadersDataRow hrow = wrapper.next();
				Object[] row = hrow.getValues();

				if(hrow.getRawValues()[1].toString().equals("http://semoss.org/ontologies/Relation")) {
					continue;
				}

				String fromConcept = row[0].toString();
				String rel = row[1].toString();
				String toConcept = row[2].toString();

				Map edgeMap = new TreeMap<>();
				edgeMap.put("source", fromConcept);
				edgeMap.put("target", toConcept + "");
				edgeMap.put("rel", rel);
				relationships.add(edgeMap);
			}
		} catch (Exception e) {
			classLogger.error(Constants.STACKTRACE, e);
		} finally {
			if(wrapper != null) {
				try {
					wrapper.close();
				} catch (IOException e) {
					classLogger.error(Constants.STACKTRACE, e);
				}
			}
		}

		Map retObj = new Hashtable<>();
		retObj.put("nodes", tableToVert.values().toArray());
		retObj.put("edges", relationships.toArray());
		return retObj;
	}

	@Override
	public File getOwlPositionFile() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public IQueryInterpreter getQueryInterpreter() {
		return null;
	}

	@Override
	public boolean isBasic() {
		return true;
	}

	@Override
	public void setBasic(boolean isBasic) {
		// this is always basic - used only for OWL
	}

//	@Override
//	public RDFFileSesameEngine getBaseDataEngine() {
//		return this.baseDataEngine;
//	}
//
//	@Override
//	public void setBaseDataEngine(RDFFileSesameEngine baseDataEngine) {
//		this.baseDataEngine = baseDataEngine;
//	}
	
	
	////////////////////////////////////////////////////////////////////////////////////////////
	
	/*
	 * NEW PIXEL TO REPLACE CONCEPTUAL NAMES
	 */
	
	@Override
	public List getPixelConcepts() {
		String query = "SELECT ?pixelName WHERE {"
				+ " {?concept   }"
				+ " {?concept  ?pixelName }"
				+ " }";
		return Utility.getVectorOfReturn(query, baseDataEngine, false);
	}
	
	@Override
	public List getPixelSelectors(String conceptPixelName) {
		// first grab the concept if it has data
		String query = "SELECT DISTINCT ?pixelName WHERE { "
				+ " BIND( as ?concept) "
				+ " {?concept  ?pixelName }"
				+ " FILTER NOT EXISTS {?concept  \"noData\" }"
				+ " }";
		// then grab the properties of the concept which always have data
		Vector retArr = Utility.getVectorOfReturn(query, baseDataEngine, false);
		query = "SELECT DISTINCT ?pixelName WHERE { "
				+ " BIND( as ?concept) "
				+ " {?concept   } "
				+ " {?property  } "
				+ " {?concept  ?property} "
				+ " {?property  ?pixelName}"
				+ " }";
		Vector pArr = Utility.getVectorOfReturn(query, baseDataEngine, true);
		for(String p : pArr) {
			retArr.add(conceptPixelName + "__" + Utility.getClassName(p));
		}
		
		return retArr;
	}
	
	@Override
	public List getPropertyPixelSelectors(String conceptPixelName) {
		// then grab the properties of the concept which always have data
		String query = "SELECT DISTINCT ?pixelName WHERE { "
				+ " BIND( as ?concept) "
				+ " {?concept   } "
				+ " {?property  } "
				+ " {?concept  ?property} "
				+ " {?property  ?pixelName}"
				+ " }";
		List retArr = new Vector<>();
		Vector pArr = Utility.getVectorOfReturn(query, baseDataEngine, false);
		for(String p : pArr) {
			retArr.add(conceptPixelName + "__" + p);
		}
		
		return retArr;
	}
	
	@Override
	public List getPhysicalConcepts() {
		String query = "SELECT ?concept WHERE {"
						+ "{?concept   }"
						+ "Filter(?concept != )"
						+ "}";
		return Utility.getVectorOfReturn(query, baseDataEngine, true);
	}
	
	@Override
	public List getPhysicalRelationships() {
		String query = "SELECT DISTINCT ?start ?end ?rel WHERE { "
				+ "{?start   }"
				+ "{?end   }"
				+ "{?rel <" + RDFS.SUBPROPERTYOF + "> } "
				+ "{?start ?rel ?end}"
				+ "Filter(?rel != <" + RDFS.SUBPROPERTYOF + ">)"
				+ "Filter(?rel != )"
				+ "}";
		return Utility.getVectorArrayOfReturn(query, baseDataEngine, true);
	}
	
	@Override
	public List getPropertyUris4PhysicalUri(String physicalUri) {
		String query = "SELECT DISTINCT ?property WHERE { "
					+ "BIND(<" + physicalUri + "> AS ?concept) "
					+ "{?concept   } "
//					+ "{?property  } "
					+ "{?concept  ?property} "
					+ "}";
		return Utility.getVectorOfReturn(query, baseDataEngine, true);
	}
	
	@Override
	public String getPhysicalUriFromPixelSelector(String pixelSelector) {
		String semossConceptName = pixelSelector;
		String semossPropertyName = null;
		if(semossConceptName.contains("__")) {
			String[] split = pixelSelector.split("__");
			semossConceptName = split[0];
			semossPropertyName = split[1];
			
			// accounting if we are using the prim key placeholder
			if(semossPropertyName.equals(AbstractQueryStruct.PRIM_KEY_PLACEHOLDER)) {
				semossPropertyName = null;
			}
		}
		
		String query = null;
		if(semossPropertyName == null) {
			// this is just a concept
			query = "SELECT DISTINCT ?concept WHERE { "
					+ " BIND( as ?pixelName) "
					+ " {?concept  ?pixelName } "
					+ " }";
		} else {
			// this is a property
			query = "SELECT DISTINCT ?property WHERE { "
					+ " BIND( as ?pixelName) "
					+ " {?property  ?pixelName } "
					+ " }";
		}
		
		List retArr = Utility.getVectorOfReturn(query, baseDataEngine, true);
		if(!retArr.isEmpty()) {
			return retArr.get(0);
		}
		return null;
	}

	@Override
	@Deprecated
	/**
	 * We cannot use this cause of the fact that we have not updated the OWL triples
	 * for a RDF engine for the properties to contain the Concept in the URL (which would make it unique)
	 * Example: Right now we have http://semoss.org/ontologies/Relation/Contains/Description as a 
	 * property which could point to multiple concepts
	 */
	public String getPixelUriFromPhysicalUri(String physicalUri) {
		String query = "SELECT DISTINCT ?pixel WHERE { "
					+ " BIND(<" + physicalUri + "> as ?physicalUri) "
					+ " {?physicalUri  ?pixel } "
					+ " }";
		List retArr = Utility.getVectorOfReturn(query, baseDataEngine, true);
		if(!retArr.isEmpty()) {
			if(retArr.size() > 1) {
				classLogger.debug("UGH... WHY ARE YOU NOT UNIQUE AS PHYSICAL!!! " + physicalUri);
				classLogger.debug("UGH... WHY ARE YOU NOT UNIQUE AS PHYSICAL!!! " + physicalUri);
				classLogger.debug("UGH... WHY ARE YOU NOT UNIQUE AS PHYSICAL!!! " + physicalUri);
				classLogger.debug("UGH... WHY ARE YOU NOT UNIQUE AS PHYSICAL!!! " + physicalUri);
				classLogger.debug("UGH... WHY ARE YOU NOT UNIQUE AS PHYSICAL!!! " + physicalUri);
			}
			return retArr.get(0);
		}
		return null;
	}
	
	@Override
	public String getConceptPixelUriFromPhysicalUri(String conceptPhysicalUri) {
		String query = "SELECT DISTINCT ?pixel WHERE { "
				+ " BIND(<" + conceptPhysicalUri + "> as ?physicalUri) "
				+ " {?physicalUri   }"
				+ " {?physicalUri  ?pixel } "
				+ " }";
		List retArr = Utility.getVectorOfReturn(query, baseDataEngine, true);
		if(!retArr.isEmpty()) {
			if(retArr.size() > 1) {
				classLogger.debug("UGH... WHY ARE YOU NOT UNIQUE AS PHYSICAL!!! " + conceptPhysicalUri);
				classLogger.debug("UGH... WHY ARE YOU NOT UNIQUE AS PHYSICAL!!! " + conceptPhysicalUri);
				classLogger.debug("UGH... WHY ARE YOU NOT UNIQUE AS PHYSICAL!!! " + conceptPhysicalUri);
				classLogger.debug("UGH... WHY ARE YOU NOT UNIQUE AS PHYSICAL!!! " + conceptPhysicalUri);
				classLogger.debug("UGH... WHY ARE YOU NOT UNIQUE AS PHYSICAL!!! " + conceptPhysicalUri);
			}
			return retArr.get(0);
		}
		return null;
	}

	@Override
	/**
	 * This is so annoying... no simple work around for the issue with {@link #getPixelUriFromPhysicalUri(String)} 
	 */
	public String getPropertyPixelUriFromPhysicalUri(String conceptPhysicalUri, String propertyPhysicalUri) {
		String query = "SELECT DISTINCT ?pixel ?parentPixel WHERE { "
				+ " BIND(<" + propertyPhysicalUri + "> as ?propertyPhysicalUri) "
				+ " BIND(<" + conceptPhysicalUri + "> as ?conceptPhysicalUri) "
				+ " {?conceptPhysicalUri   }"
				+ " {?conceptPhysicalUri  ?parentPixel } "
				+ " {?propertyPhysicalUri  } "
				+ "	{?conceptPhysicalUri  ?propertyPhysicalUri} "
				+ " {?propertyPhysicalUri  ?pixel } "
				+ " }";
		
		IRawSelectWrapper wrapper = null;
		try {
			wrapper = WrapperManager.getInstance().getRawWrapper(baseDataEngine, query);
			String conceptName = null;
			if(wrapper.hasNext()) {
				Object[] raw = wrapper.next().getRawValues();
				String propPixel = raw[0].toString();
				String parentPixel = raw[1].toString();
				conceptName = Utility.getInstanceName(parentPixel);
				if(Utility.getInstanceName(propPixel).equals(conceptName)) {
					return propPixel;
				}
			}
			classLogger.debug("UGH... WHY ARE YOU NOT UNIQUE AS PHYSICAL!!! " + conceptPhysicalUri + " ::: " + propertyPhysicalUri);
			while(wrapper.hasNext()) {
				Object[] raw = wrapper.next().getRawValues();
				String propPixel = raw[0].toString();
				if(Utility.getInstanceName(propPixel).equals(conceptName)) {
					return propPixel;
				}
			}
		} 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 String getPixelSelectorFromPhysicalUri(String physicalUri) {
		String query = "SELECT DISTINCT ?pixel ?type WHERE { "
					+ " {"
						+ " BIND(\"concept\" as ?type) "
						+ " BIND(<" + physicalUri + "> as ?physicalUri) "
						+ " {?physicalUri   }"
						+ " {?physicalUri  ?pixel } "
					+ " }"
					+ " UNION "
					+ "	{"
						+ " BIND(\"property\" as ?type) "
						+ " BIND(<" + physicalUri + "> as ?physicalUri) "
						+ " {?physicalUri   }"
						+ " {?physicalUri  ?pixel } "
					+ "	}"
					+ " }";
		
		IRawSelectWrapper wrapper = null;
		try {
			wrapper = WrapperManager.getInstance().getRawWrapper(baseDataEngine, query);
			while(wrapper.hasNext()) {
				Object[] raw = wrapper.next().getRawValues();
				if(raw[1].toString().contains("concept")) {
					return Utility.getInstanceName(raw[0].toString());
				} else {
					String parent = Utility.getInstanceName(raw[0].toString());
					String child = Utility.getClassName(raw[0].toString());
					return parent + "__" + child;
				}
			}
		} 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 String getConceptualName(String physicalUri) {
		String query = "SELECT DISTINCT ?conceptual WHERE { "
				+ "BIND(<" + physicalUri + "> AS ?uri) "
				+ "{?uri <" + CONCEPTUAL_RELATION_URI + "> ?conceptual } "
				+ "}";

		String conceptualName = null;
		IRawSelectWrapper wrapper = null;
		try {
			wrapper = WrapperManager.getInstance().getRawWrapper(baseDataEngine, query);
			if(wrapper.hasNext()) {
				conceptualName = 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 conceptualName;
	}

	@Override
	public Set getLogicalNames(String physicalUri) {
		String query = "SELECT DISTINCT ?logical WHERE { "
				+ "BIND(<" + physicalUri + "> AS ?uri) "
				+ "{?uri <" + OWL.sameAs.toString() + "> ?logical } "
				+ "}";

		Set logicals = new TreeSet<>();
		IRawSelectWrapper wrapper = null;
		try {
			wrapper = WrapperManager.getInstance().getRawWrapper(baseDataEngine, query);
			while(wrapper.hasNext()) {
				logicals.add(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 logicals;
	}
	
	@Override
	public String getDescription(String physicalUri) {
		String query = "SELECT DISTINCT ?description WHERE { "
				+ "BIND(<" + physicalUri + "> AS ?uri) "
				+ "{?uri <" + RDFS.COMMENT.toString() + "> ?description } "
				+ "}";

		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
	@Deprecated
	public String getLegacyPrimKey4Table(String physicalUri) {
		String query = "SELECT DISTINCT ?value WHERE { "
				+ "BIND(<" + physicalUri + "> AS ?uri) "
				+ "{?uri <" + LEGACY_PRIM_KEY_URI + "> ?value } "
				+ "}";

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




© 2015 - 2025 Weber Informatics LLC | Privacy Policy