
prerna.ui.components.RDFEngineHelper Maven / Gradle / Ivy
The newest version!
/*******************************************************************************
* Copyright 2015 Defense Health Agency (DHA)
*
* If your use of this software does not include any GPLv2 components:
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ----------------------------------------------------------------------------
* If your use of this software includes any GPLv2 components:
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*******************************************************************************/
package prerna.ui.components;
import java.util.Hashtable;
import java.util.List;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.openrdf.query.BindingSet;
import org.openrdf.query.MalformedQueryException;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.RepositoryException;
import prerna.engine.api.IConstructStatement;
import prerna.engine.api.IConstructWrapper;
import prerna.engine.api.IDatabaseEngine;
import prerna.engine.api.ISelectStatement;
import prerna.engine.api.ISelectWrapper;
import prerna.engine.impl.rdf.InMemorySesameEngine;
import prerna.om.GraphDataModel;
import prerna.rdf.engine.wrappers.SesameConstructWrapper;
import prerna.rdf.engine.wrappers.WrapperManager;
import prerna.util.Constants;
import prerna.util.Utility;
/**
* This class is responsible for loading many of the hierarchies available in RDF through the repository connection.
*/
public class RDFEngineHelper {
static final Logger logger = LogManager.getLogger(RDFEngineHelper.class.getName());
// responsible for handling various engine related stuff
// loads the concepts from the engine into the specified sesame
/**
* Loads the concept hierarchy.
* @param fromEngine Engine where data is stored.
* @param subjects Subject.
* @param objects Object.
* @param ps Graph playsheet that allows properties to be added to the repository connection.
*/
public static void loadConceptHierarchy(IDatabaseEngine fromEngine, String subjects, String objects, GraphDataModel ps)
{
String conceptHierarchyForSubject = "" ;
if(fromEngine.getDatabaseType() == IDatabaseEngine.DATABASE_TYPE.SESAME || fromEngine.getDatabaseType() == IDatabaseEngine.DATABASE_TYPE.SEMOSS_SESAME_REMOTE)
{
conceptHierarchyForSubject = "CONSTRUCT { ?Subject ?Predicate ?Object} WHERE " +
"{" +
"{?Subject ?Object}" +
"{?Subject ?Predicate ?Object}" +
"} BINDINGS ?Subject { " + subjects + objects + " } " +
"";
}
else if(fromEngine.getDatabaseType() == IDatabaseEngine.DATABASE_TYPE.JENA)
{
conceptHierarchyForSubject = "CONSTRUCT { ?Subject ?Predicate ?Object} WHERE " +
"{VALUES ?Subject {" + subjects + objects + "}" +
"{?Subject ?Object}" +
"{?Subject ?Predicate ?Object}" +
"}";
}
addResultsToRC(fromEngine, conceptHierarchyForSubject, ps);
}
/**
* Loads the relation hierarchy.
* @param fromEngine Engine where data is stored.
* @param predicates Predicate.
* @param ps Graph playsheet that allows properties to be added to the repository connection.
*/
public static void loadRelationHierarchy(IDatabaseEngine fromEngine, String predicates, GraphDataModel ps)
{
// same concept as the subject, but only for relations
String relationHierarchy = "";
if(fromEngine.getDatabaseType() == IDatabaseEngine.DATABASE_TYPE.SESAME || fromEngine.getDatabaseType() == IDatabaseEngine.DATABASE_TYPE.SEMOSS_SESAME_REMOTE)
{
relationHierarchy = "CONSTRUCT { ?Subject ?Predicate ?Object} WHERE " +
"{" +
"{?Subject ?Predicate ?Object}" +
"{?Subject ?Object}" +
"} BINDINGS ?Subject { " + predicates + " } " +
"";// relation hierarchy
}
else if(fromEngine.getDatabaseType() == IDatabaseEngine.DATABASE_TYPE.JENA)
{
relationHierarchy = "CONSTRUCT { ?Subject ?Predicate ?Object} WHERE " +
"{ VALUES ?Subject {" + predicates + "}" +
"{?Subject ?Predicate ?Object}" +
"{?Subject ?Object}" +
"}";// relation hierarchy
}
addResultsToRC(fromEngine, relationHierarchy, ps);
}
/**
* Loads the property hierarchy.
* @param fromEngine Engine where data is stored.
* @param predicates Predicate.
* @param containsRelation String that shows the relation.
* @param ps Graph playsheet that allows properties to be added to the repository connection.
*/
public static void loadPropertyHierarchy(IDatabaseEngine fromEngine, String predicates, String containsRelation, GraphDataModel ps)
{
// same concept as the subject, but only for relations
String relationHierarchy = "";
if(fromEngine.getDatabaseType() == IDatabaseEngine.DATABASE_TYPE.SESAME || fromEngine.getDatabaseType() == IDatabaseEngine.DATABASE_TYPE.SEMOSS_SESAME_REMOTE)
{
relationHierarchy = "CONSTRUCT { ?Subject ?Predicate ?Object} WHERE " +
"{" +
"{?Subject ?Predicate ?Object}" +
"{?Subject " + containsRelation + " }" +
"} BINDINGS ?Subject { " + predicates + " } " +
"";// relation hierarchy
}
else if(fromEngine.getDatabaseType() == IDatabaseEngine.DATABASE_TYPE.JENA)
{
relationHierarchy = "CONSTRUCT { ?Subject ?Predicate ?Object} WHERE " +
"{ VALUES ?Subject {" + predicates + "}" +
"{?Subject ?Predicate ?Object}" +
"{?Subject " + containsRelation + " }" +
"}";// relation hierarchy
}
addResultsToRC(fromEngine, relationHierarchy, ps);
}
/**
* Gets general properties given a subject, object, predicate, and relationship.
* @param fromEngine Engine where data is stored.
* @param subjects Subject.
* @param objects Object.
* @param predicates Predicate.
* @param containsRelation String that shows the relation for the property query.
* @param ps Graph playsheet that allows properties to be added to repository connection.
*/
public static void genPropertiesRemote(IDatabaseEngine fromEngine, String subjects, String objects, String predicates, String containsRelation, GraphDataModel ps)
{
String propertyQuery = "";
if(fromEngine.getDatabaseType() == IDatabaseEngine.DATABASE_TYPE.SESAME|| fromEngine.getDatabaseType() == IDatabaseEngine.DATABASE_TYPE.SEMOSS_SESAME_REMOTE)
{
propertyQuery = "CONSTRUCT { ?Subject ?Predicate ?Object . ?Predicate ?type ?contains} WHERE {" +
"BIND( AS ?type)"+
"BIND("+containsRelation+" as ?contains)"+
"{?Predicate " +" " + containsRelation + ";}" +
//"{?Subject " + " " + " ;}" +
"{?Subject ?Predicate ?Object}}" +
"BINDINGS ?Subject { " + subjects + " " + predicates + " " + objects + " }";
}
else if(fromEngine.getDatabaseType() == IDatabaseEngine.DATABASE_TYPE.JENA)
{
propertyQuery = "CONSTRUCT { ?Subject ?Predicate ?Object. ?Predicate ?type ?contains} WHERE {" +
"VALUES ?Subject {" + subjects + " " + predicates + " " + objects + "}" +
"BIND( AS ?type)"+
"BIND("+containsRelation+" as ?contains)"+
"{?Predicate " +" " + containsRelation + ";}" +
//"{?Subject " + " " + " ;}" +
"{?Subject ?Predicate ?Object}}";
}
addResultsToRC(fromEngine, propertyQuery, ps);
}
/**
* Gets node properties from a local repository connection.
* @param rc Repository connection: main interface for updating data in and performing queries on a Sesame repository.
* @param containsRelation String that shows the relation for the property query.
* @param ps Graph playsheet where edge properties are added.
*/
public static void genNodePropertiesLocal(RepositoryConnection rc, String containsRelation, GraphDataModel ps, Boolean subclassCreate)
{
IDatabaseEngine sesameEngine = new InMemorySesameEngine();
((InMemorySesameEngine)sesameEngine).setRepositoryConnection(rc);
String propertyQuery = "CONSTRUCT { ?Subject ?Predicate ?Object} WHERE {" +
"{?Predicate " +" " + containsRelation + ";}" +
"{?Subject " + " " + " ;}" +
"{?Subject ?Predicate ?Object}}";
if(subclassCreate){
propertyQuery = "CONSTRUCT { ?Subject ?Predicate ?Property} WHERE {" +
"{?Predicate " +" " + containsRelation + ";}" +
"{?Subject " + " " + " ;}" +
"{?Subject ?Object ?Predicate} BIND('' AS ?Property)}";
}
logger.info("Local node prop query " + Utility.cleanLogString(propertyQuery));
//SesameJenaConstructWrapper sjsc = new SesameJenaConstructWrapper();
IConstructWrapper sjsc = WrapperManager.getInstance().getCWrapper(sesameEngine, propertyQuery);
/*sjsc.setEngine(sesameEngine);
sjsc.setQuery(propertyQuery);
sjsc.execute();
*/
while(sjsc.hasNext())
{
IConstructStatement sct = sjsc.next();
String subject = sct.getSubject();
String predicate = sct.getPredicate();
Object obj = sct.getObject();
// System.out.println("local node prop " + subject+ obj+ predicate);
// add the property
ps.addNodeProperty(subject, obj, predicate);
}
}
/**
* Gets edge properties from a local repository connection.
* @param rc Repository connection: main interface for updating data in and performing queries on a Sesame repository.
* @param containsRelation String that shows the relation for the property query.
* @param ps Graph playsheet where edge properties are added.
*/
public static void genEdgePropertiesLocal(RepositoryConnection rc, String containsRelation, GraphDataModel ps)
{
IDatabaseEngine sesameEngine = new InMemorySesameEngine();
((InMemorySesameEngine)sesameEngine).setRepositoryConnection(rc);
String propertyQuery = "SELECT ?edge ?prop ?value ?outNode ?inNode WHERE {" +
"{?prop " +" " + containsRelation + ";}" +
"{?edge " + " " + " ;}" +
"{?outNode " + " " + " ;}" +
"{?inNode " + " " + " ;}" +
"{?edge ?prop ?value} {?outNode ?edge ?inNode} }";
ISelectWrapper sjsc = WrapperManager.getInstance().getSWrapper(sesameEngine, propertyQuery);
/*SesameJenaSelectWrapper sjsc = new SesameJenaSelectWrapper();
sjsc.setEngine(sesameEngine);
sjsc.setQuery(propertyQuery);
sjsc.executeQuery();
sjsc.getVariables();*/
while(sjsc.hasNext())
{
ISelectStatement sct = sjsc.next();
String edge = sct.getRawVar("edge") + "";
String prop = sct.getRawVar("prop") + "";
String inNode = sct.getRawVar("inNode") + "";
String outNode = sct.getRawVar("outNode") + "";
Object value = sct.getRawVar("value");
// System.out.println("local edge prop " + edge+value+prop+ outNode+ inNode);
// add the property
ps.addEdgeProperty(edge, value, prop, outNode, inNode);
}
}
// /**
// * Loads all of the labels from subjects.
// * @param fromEngine Engine where data is stored.
// * @param subjects String containing the subjects.
// * @param ps Graph playsheet where vertexes and edges are stored.
// */
// public static void loadLabels(IDatabase fromEngine, String subjects, GraphDataModel ps)
// {
// // loads all of the labels
// // http://www.w3.org/2000/01/rdf-schema#label
// String labelQuery = "";
// if(fromEngine.getDatabaseType() == IDatabase.DATABASE_TYPE.SESAME || fromEngine.getDatabaseType() == IDatabase.DATABASE_TYPE.SEMOSS_SESAME_REMOTE)
// {
// labelQuery = "SELECT DISTINCT ?Subject ?Label WHERE " +
// "{" +
// "{?Subject ?Label}" +
// "} BINDINGS ?Subject { " + subjects + " } " +
// "";
// }
// else if(fromEngine.getDatabaseType() == IDatabase.DATABASE_TYPE.JENA)
// {
// labelQuery = "SELECT DISTINCT ?Subject ?Label WHERE " +
// "{VALUES ?Subject {" + subjects + "}" +
// "{?Subject ?Label}" +
// "}";
// }
// System.err.println("Query is " + labelQuery);
//
// ISelectWrapper sjsw = WrapperManager.getInstance().getSWrapper(fromEngine, labelQuery);
//
// /*SesameJenaSelectWrapper sjsw = new SesameJenaSelectWrapper();
// sjsw.setEngine(fromEngine);
// sjsw.setQuery(labelQuery);
// sjsw.executeQuery();
// sjsw.getVariables();
// */
//
// Hashtable vertStore = ps.getVertStore();
// Hashtable edgeStore = ps.getEdgeStore();
// while(sjsw.hasNext())
// {
// ISelectStatement st = sjsw.next();
// String subject = st.getRawVar("Subject") + "";
// String label = st.getVar("Label") + "";
//
// SEMOSSVertex vert = vertStore.get(subject);
// if(vert != null)
// vert.setProperty(Constants.VERTEX_NAME, label);
// else
// {
// // may be an edge ?
// SEMOSSEdge edge = edgeStore.get(subject);
// if(edge != null)
// edge.setProperty(Constants.EDGE_NAME, label);
// }
// }
// }
/**
* Add results from a query on an engine to the respository connection.
* @param fromEngine Engine where data is stored.
* @param query Query to be run.
* @param ps Graph playsheet where sesame construct statement is stored.
*/
private static void addResultsToRC(IDatabaseEngine fromEngine, String query, GraphDataModel ps) {
IConstructWrapper sjsc = WrapperManager.getInstance().getCWrapper(fromEngine, query);
/*SesameJenaConstructWrapper sjsc = new SesameJenaConstructWrapper();
sjsc.setEngine(fromEngine);
sjsc.setQuery(query);
sjsc.execute();
*/
while(sjsc.hasNext())
{
IConstructStatement st = sjsc.next();
ps.addToSesame(st, false, false);
}
}
/**
* Adds data to a specified engine.
* @param fromEngine Engine where data is stored.
* @param toRC Main interface for updating data in and performing queries on a Sesame repository.
*/
public static void addAllData(IDatabaseEngine fromEngine, RepositoryConnection toRC)
{
// same concept as the subject, but only for relations
String constructAllQuery = "CONSTRUCT { ?Subject ?Predicate ?Object} WHERE " +
"{" +
"{?Subject ?Predicate ?Object} }" +
"";
addQueryData(fromEngine, toRC, constructAllQuery);
}
public static void addQueryData(IDatabaseEngine fromEngine, RepositoryConnection toRC, String query){
if(query == null){
query = "CONSTRUCT { ?Subject ?Predicate ?Object} WHERE " +
"{" +
"{?Subject ?Predicate ?Object} }" +
"BINDINGS ?Object {()()}";
}
IConstructWrapper sjsc = WrapperManager.getInstance().getCWrapper(fromEngine, query);
/*SesameJenaConstructWrapper sjsc = new SesameJenaConstructWrapper();
sjsc.setEngine(fromEngine);
sjsc.setQuery(constructAllQuery);
sjsc.execute();
*/
if(fromEngine.getDatabaseType() == IDatabaseEngine.DATABASE_TYPE.SESAME || fromEngine.getDatabaseType() == IDatabaseEngine.DATABASE_TYPE.SEMOSS_SESAME_REMOTE)
{
try {
toRC.add(((SesameConstructWrapper)sjsc).gqr); // abstraction leak
//TODO: Delete? Engine type is Sesame
// while(sjsc.hasNext())
// {
// SesameJenaConstructStatement st = sjsc.next();
// logger.debug(st.getSubject() + st.getPredicate() + st.getObject());
// addToJenaModel(st);
// }
} catch (QueryEvaluationException e) {
logger.error(Constants.STACKTRACE, e);
} catch (RepositoryException e) {
logger.error(Constants.STACKTRACE, e);
}
}
}
/**
* Removes all data from a certain engine.
* @param fromEngine Engine where data is stored.
* @param toRC Main interface for updating data in and performing queries on a Sesame repository.
*/
public static void removeAllData(IDatabaseEngine fromEngine, RepositoryConnection toRC)
{
// same concept as the subject, but only for relations
String constructAllQuery = "CONSTRUCT { ?Subject ?Predicate ?Object} WHERE " +
"{" +
"{?Subject ?Predicate ?Object} }" +
"";// relation hierarchy
IConstructWrapper sjsc = WrapperManager.getInstance().getCWrapper(fromEngine, constructAllQuery);
/*SesameJenaConstructWrapper sjsc = new SesameJenaConstructWrapper();
sjsc.setEngine(fromEngine);
sjsc.setQuery(constructAllQuery);
sjsc.execute();
*/
if(fromEngine.getDatabaseType() == IDatabaseEngine.DATABASE_TYPE.SESAME || fromEngine.getDatabaseType() == IDatabaseEngine.DATABASE_TYPE.SEMOSS_SESAME_REMOTE)
{
try {
toRC.remove(((SesameConstructWrapper)sjsc).gqr);
} catch (QueryEvaluationException e) {
logger.error(Constants.STACKTRACE, e);
} catch (RepositoryException e) {
logger.error(Constants.STACKTRACE, e);
}
}
}
public static Hashtable createBaseFilterHash(RepositoryConnection rcOWL) throws RepositoryException, MalformedQueryException, QueryEvaluationException{
Hashtable baseFilterHash = new Hashtable();
String queryString = "SELECT ?x ?p ?y WHERE { ?x ?p ?y } ";
TupleQuery tupleQuery = rcOWL.prepareTupleQuery(QueryLanguage.SPARQL, queryString);
TupleQueryResult result = tupleQuery.evaluate();
List bindingNames = result.getBindingNames();
while (result.hasNext())
{
BindingSet bindingSet = result.next();
baseFilterHash.put(bindingSet.getValue(bindingNames.get(0)).toString(), bindingSet.getValue(bindingNames.get(0)).toString());
baseFilterHash.put(bindingSet.getValue(bindingNames.get(1)).toString(), bindingSet.getValue(bindingNames.get(1)).toString());
baseFilterHash.put(bindingSet.getValue(bindingNames.get(2)).toString(), bindingSet.getValue(bindingNames.get(2)).toString());
}
return baseFilterHash;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy