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

prerna.rdf.main.UpdateSystemSiteSupport Maven / Gradle / Ivy

The newest version!
package prerna.rdf.main;

import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.openrdf.model.vocabulary.RDF;
import org.openrdf.model.vocabulary.RDFS;

import prerna.engine.api.IDatabaseEngine;
import prerna.engine.api.ISelectStatement;
import prerna.engine.api.ISelectWrapper;
import prerna.poi.main.helper.CSVFileHelper;
import prerna.rdf.engine.wrappers.WrapperManager;
import prerna.util.Utility;

public class UpdateSystemSiteSupport {

//	public static void main(String[] args) throws Exception {
//		TestUtilityMethods.loadDIHelper("C:\\workspace\\Semoss_Dev\\RDF_Map.prop");
//
//		Map origToReplacement = processFile("C:\\Users\\mahkhalil\\Desktop\\SystemSiteSupportGLItem.csv");
//		
//		List deleteTriples = new Vector();
//		List addTriples = new Vector();
//		
//		String engineProp = "C:\\workspace\\Semoss_Dev\\db\\TAP_Portfolio.smss";
//		IDatabase pEng = new BigDataEngine();
//		pEng.open(engineProp);
//		pEng.setEngineId("TAP_Portfolio");
//		DIHelper.getInstance().setLocalProperty("TAP_Portfolio", pEng);
//
//		String query = "select distinct ?systemsitesupportglitem ?system ?dcsite ?fy ?gltag ?cost "
//				+ "where { "
//				+ "{?systemsitesupportglitem a } "
//				+ "{?system a } "
//				+ "{?dcsite a } "
//				+ "{?system  ?systemsitesupportglitem} "
//				+ "{?dcsite  ?systemsitesupportglitem} "
//				+ "{?systemsitesupportglitem  ?fy} "
//				+ "{?systemsitesupportglitem  ?gltag} "
//				+ "{?systemsitesupportglitem  ?cost} "
//				+ "}";
//		
//		int count = 0;
//		IRawSelectWrapper it = WrapperManager.getInstance().getRawWrapper(pEng, query);
//		while(it.hasNext()) {
//			IHeadersDataRow row = it.next();
//			Object[] values = row.getValues();
//			String dcsite = values[2].toString();
//			if(origToReplacement.containsKey(dcsite)) {
//				performReplacement(pEng, addTriples, deleteTriples, values, origToReplacement.get(dcsite));
//				count++;
//			}
//		}
//		System.out.println("Found total number = " + count);
//
//		for(Object[] del : deleteTriples) {
//			pEng.doAction(ACTION_TYPE.REMOVE_STATEMENT, del);
//		}
//		
//		for(Object[] add : addTriples) {
//			pEng.doAction(ACTION_TYPE.ADD_STATEMENT, add);
//		}
//		
//		System.out.println("Done");
//		
//		count = 0;
//		it = WrapperManager.getInstance().getRawWrapper(pEng, query);
//		while(it.hasNext()) {
//			IHeadersDataRow row = it.next();
//			Object[] values = row.getValues();
//			String dcsite = values[2].toString();
//			if(origToReplacement.containsKey(dcsite)) {
//				count++;
//			}
//		}
//		System.out.println("Found total number should now be 0.  It is = " + count);
//		
//		pEng.commit();
//	}
	
	private static void performReplacement(IDatabaseEngine eng, List addTriples, List deleteTriples, Object[] values, String newSiteName) {
		String sysSiteGl = values[0].toString();
		String sys = values[1].toString();
		String dcsite = values[2].toString();
		String fy = values[3].toString();
		String gltag = values[4].toString();
		double cost = (double) values[5];

		// delete the entire sys site gl item
		Set binding = new HashSet();
		binding.add("http://health.mil/ontologies/Concept/SystemSiteSupportGLItem/" + sysSiteGl);
		deleteAllRDFConnectionsToConcept(eng, binding, deleteTriples);
		
		// first get all the stuff to delete
		String semossRel = "http://semoss.org/ontologies/Relation";
		String semossHasPred = "http://semoss.org/ontologies/Relation/Has";
		String healthHasPred = "http://health.mil/ontologies/Relation/Has";
		String semossOccursPred = "http://semoss.org/ontologies/Relation/OccursIn";
		String healthOccursPred = "http://health.mil/ontologies/Relation/OccursIn";
		String semossTaggedPred = "http://semoss.org/ontologies/Relation/TaggedBy";
		String healthTaggedPred = "http://health.mil/ontologies/Relation/TaggedBy";

		// now we reconnect to new
		String newNodeName = sys + "%" + newSiteName + "%SiteSupport%" + fy;
		String newSysSiteGl = "http://health.mil/ontologies/Concept/SystemSiteSupportGLItem/" + newNodeName;
		// add new gl
		addTriples.add(new Object[]{newSysSiteGl, RDF.TYPE, "http://semoss.org/ontologies/Concept/SystemSiteSupportGLItem", true});
		addTriples.add(new Object[]{newSysSiteGl, RDFS.LABEL, newNodeName, false});
		// add new dcsite
		String newDcsite = "http://health.mil/ontologies/Concept/DCSite/" + newSiteName;
		addTriples.add(new Object[]{newDcsite, RDF.TYPE, "http://semoss.org/ontologies/Concept/DCSite", true});
		addTriples.add(new Object[]{newDcsite, RDFS.LABEL, newNodeName, false});
		
		// system to gl
		{
			String predSysGlName = sys + ":" + newNodeName;
			String predSysGl = healthHasPred + "/" + predSysGlName;
			addTriples.add(new Object[]{
					"http://health.mil/ontologies/Concept/System/" + sys, 
					semossRel, 
					newSysSiteGl, 
					true});
			addTriples.add(new Object[]{
					"http://health.mil/ontologies/Concept/System/" + sys, 
					semossHasPred, 
					newSysSiteGl, 
					true});
			addTriples.add(new Object[]{
					"http://health.mil/ontologies/Concept/System/" + sys, 
					predSysGl, 
					newSysSiteGl, 
					true});
			addTriples.add(new Object[]{
					predSysGl, 
					RDFS.SUBPROPERTYOF.toString(), 
					semossRel, 
					true});
			addTriples.add(new Object[]{
					predSysGl,
					RDFS.SUBPROPERTYOF.toString(), 
					semossHasPred, 
					true});
		}
		// dcsite to gl
		{
			String predSiteGlName = newSiteName + ":" + newNodeName;
			String predSiteGl = healthHasPred + "/" + predSiteGlName;

			addTriples.add(new Object[]{
					"http://health.mil/ontologies/Concept/DCSite/" + newSiteName, 
					semossRel, 
					newSysSiteGl, 
					true});
			addTriples.add(new Object[]{
					"http://health.mil/ontologies/Concept/DCSite/" + newSiteName, 
					semossHasPred, 
					newSysSiteGl, 
					true});
			addTriples.add(new Object[]{
					"http://health.mil/ontologies/Concept/DCSite/" + newSiteName, 
					predSiteGl, 
					newSysSiteGl, 
					true});
			addTriples.add(new Object[]{
					predSiteGl,
					RDFS.LABEL.toString(), 
					predSiteGlName, 
					false});
			addTriples.add(new Object[]{
					predSiteGl, 
					RDFS.SUBPROPERTYOF.toString(), 
					semossRel, 
					true});
			addTriples.add(new Object[]{
					predSiteGl,
					RDFS.SUBPROPERTYOF.toString(), 
					semossHasPred, 
					true});
		}
		// gl to gytag
		{
			String predGlGyTagName = newNodeName + ":" + gltag;
			String predGlGyTag = healthTaggedPred + "/" + predGlGyTagName;

			addTriples.add(new Object[]{
					newSysSiteGl, 
					semossRel, 
					"http://health.mil/ontologies/Concept/GLTag/" + gltag, 
					true});
			addTriples.add(new Object[]{
					newSysSiteGl, 
					semossTaggedPred, 
					"http://health.mil/ontologies/Concept/GLTag/" + gltag, 
					true});
			addTriples.add(new Object[]{
					newSysSiteGl, 
					predGlGyTag, 
					"http://health.mil/ontologies/Concept/GLTag/" + gltag, 
					true});
			addTriples.add(new Object[]{
					predGlGyTag,
					RDFS.LABEL, 
					predGlGyTagName, 
					false});
			addTriples.add(new Object[]{
					predGlGyTag, 
					RDFS.SUBPROPERTYOF.toString(), 
					semossRel, 
					true});
			addTriples.add(new Object[]{
					predGlGyTag,
					RDFS.SUBPROPERTYOF.toString(), 
					semossTaggedPred, 
					true});
		}
		
		// gl to fy
		{
			String predGlFyName = newNodeName + ":" + fy;
			String predGlFy = healthOccursPred + "/" + predGlFyName;

			addTriples.add(new Object[]{
					newSysSiteGl, 
					semossRel, 
					"http://health.mil/ontologies/Concept/FYTag/" + fy, 
					true});
			addTriples.add(new Object[]{
					newSysSiteGl, 
					semossOccursPred, 
					"http://health.mil/ontologies/Concept/FYTag/" + fy, 
					true});
			addTriples.add(new Object[]{
					newSysSiteGl, 
					predGlFy, 
					"http://health.mil/ontologies/Concept/FYTag/" + fy, 
					true});
			addTriples.add(new Object[]{
					predGlFy,
					RDFS.LABEL.toString(), 
					predGlFyName, 
					false});
			addTriples.add(new Object[]{
					predGlFy, 
					RDFS.SUBPROPERTYOF.toString(), 
					semossRel, 
					true});
			addTriples.add(new Object[]{
					predGlFy,
					RDFS.SUBPROPERTYOF.toString(), 
					semossOccursPred, 
					true});
		}
		
		// gl has cost
		{
			String costProp = "http://semoss.org/ontologies/Relation/Contains/Cost";

			addTriples.add(new Object[]{
					newSysSiteGl, 
					costProp, 
					cost, 
					false});
		}
	}

	private static Map processFile(String fileLoc) {
		Map retMap = new HashMap();
		CSVFileHelper helper = new CSVFileHelper();
		helper.setDelimiter(',');
		helper.parse(fileLoc);
		helper.getHeaders();
		Object[] row = null;
		while((row = helper.getNextRow()) != null) {
			String original = row[0].toString();
			String replacement = row[1].toString();
			
			retMap.put(original, replacement);
		}
		return retMap;
	}

	private static void deleteAllRDFConnectionsToConcept(IDatabaseEngine eng, Set uriBindingList, List deleteTriples) {
		String[] queries = new String[]{
				generateDeleteAllRDFConnectionsToConceptQuery(uriBindingList, true),
				generateDeleteAllRDFConnectionsToConceptQuery(uriBindingList, false)};

		String baseRel = "http://semoss.org/ontologies/Relation";
		for(String query : queries) {
			if(query == null) {
				continue;
			}
			ISelectWrapper wrapper = WrapperManager.getInstance().getSWrapper(eng, query);
			String[] names = wrapper.getVariables();
			while(wrapper.hasNext()) {
				ISelectStatement ss = wrapper.next();
				String subURI = ss.getRawVar(names[0]) + "";
				String predURI = ss.getRawVar(names[1]) + "";
				String objURI = ss.getRawVar(names[2]) + "";
				Object label = ss.getVar(names[3]);
				Object propURI = ss.getRawVar(names[4]);
				Object propVal = ss.getVar(names[5]);

				deleteTriples.add(new Object[]{subURI, predURI, objURI, true});
				if(label != null && !label.toString().isEmpty()) {
					deleteTriples.add(new Object[]{predURI, RDFS.LABEL, label, false});
				}
				if(propURI != null && !propURI.toString().isEmpty()) {
					deleteTriples.add(new Object[]{predURI, propURI, propVal, false});
				}

				// need to do a lot of stuff for relationships
				// ignore the base Relation
				if(!predURI.equals(baseRel)) {
					// remove the prefix so we only get RelType/Instance
					// assuming the instance is there..
					String suffix = predURI.replaceAll(".*ontologies/Relation/", "");
					if(suffix.contains("/")) {
						String[] split = suffix.split("/");
						String relType = split[0];

						// delete the sub properties around the instance
						String baseRelationURI = baseRel + "/" + relType;
						deleteTriples.add(new Object[]{predURI, RDFS.SUBPROPERTYOF, baseRel, true});
						deleteTriples.add(new Object[]{predURI, RDFS.SUBPROPERTYOF, baseRelationURI, true});
						deleteTriples.add(new Object[]{predURI, RDF.TYPE, RDF.PROPERTY, true});

						// and delete the base rel directly between the subject and object
						deleteTriples.add(new Object[]{subURI, baseRelationURI, objURI, true});
					}
				}
			}
		}
		// lastly, remove the node and all its props
		removeRDFNodeAndAllProps(eng, uriBindingList, deleteTriples);
	}

	/**
	 * 
	 * @param conceptURI
	 * @param downstream
	 * @return
	 */
	private static String generateDeleteAllRDFConnectionsToConceptQuery(Set conceptURI, boolean downstream) {
		if(conceptURI.isEmpty()) {
			return null;
		}
		StringBuilder query = new StringBuilder("SELECT DISTINCT ?SUB ?PRED ?OBJ ?LABEL ?PROP ?VAL WHERE { ");
		query.append("{ ");
		query.append("{?PRED <").append(RDFS.SUBPROPERTYOF).append("> } ");
		query.append("{?SUB ?PRED ?OBJ} ");
		query.append("OPTIONAL{ ?PRED <").append(RDFS.LABEL).append("> ?LABEL} ");
		query.append("} UNION { ");
		query.append("{?PRED <").append(RDFS.SUBPROPERTYOF).append("> } ");
		query.append("{?SUB ?PRED ?OBJ} ");
		query.append("OPTIONAL{ ?PRED <").append(RDFS.LABEL).append("> ?LABEL} ");
		query.append("{?PROP <").append(RDF.TYPE).append("> } ");
		query.append("{?PRED ?PROP ?VAL} ");
		query.append("} }");
		if(downstream) {
			query.append("BINDINGS ?SUB {");
		} else {
			query.append("BINDINGS ?OBJ {");
		}
		for(String concept : conceptURI) {
			query.append("(<");
			query.append(concept);
			query.append(">)");
		}
		query.append("}");

		return query.toString();
	}

	private static void removeRDFNodeAndAllProps(IDatabaseEngine eng, Set uriBindingList, List deleteTriples) {
		if(uriBindingList.isEmpty()) {
			return;
		}

		// delete the properties for the instances
		StringBuilder query = new StringBuilder("SELECT DISTINCT ?NODE ?PROP ?VAL WHERE { ");
		query.append("{?PROP <").append(RDF.TYPE).append("> } ");
		query.append("{?NODE ?PROP ?VAL} } ");
		query.append("BINDINGS ?NODE {");
		for(String concept : uriBindingList) {
			query.append("(<");
			query.append(concept);
			query.append(">)");
		}
		query.append("}");

		ISelectWrapper wrapper = WrapperManager.getInstance().getSWrapper(eng, query.toString());
		String[] names = wrapper.getVariables();
		while(wrapper.hasNext()) {
			ISelectStatement ss = wrapper.next();
			String nodeURI = ss.getRawVar(names[0]) + "";
			String propURI = ss.getRawVar(names[1]) + "";
			Object propVal = ss.getVar(names[2]);

			deleteTriples.add(new Object[]{nodeURI, propURI, propVal, false});
		}

		// deletes the instances
		String semossBaseConcept = "http://semoss.org/ontologies/Concept";
		for(String nodeURI : uriBindingList) {
			String typeURI = semossBaseConcept + "/" + Utility.getClassName(nodeURI);
			deleteTriples.add(new Object[]{nodeURI, RDF.TYPE, typeURI, true});
		}
	}


}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy