package org.hadatac.metadata.loader; import java.io.IOException; import java.io.OutputStream; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import org.apache.jena.query.QueryExecution; import org.apache.jena.query.QueryExecutionFactory; import org.apache.jena.query.QuerySolution; import org.apache.jena.query.ResultSet; import org.apache.jena.query.ResultSetFactory; import org.apache.jena.query.ResultSetFormatter; import org.apache.jena.query.ResultSetRewindable; import org.apache.jena.rdf.model.Model; import org.apache.jena.rdf.model.Statement; import org.apache.jena.rdf.model.StmtIterator; import org.hadatac.utils.Collections; import org.hadatac.utils.NameSpaces; public class CSVExporterContext{ String username = null; String password = null; String kbURL = null; boolean verbose = false; String processMessage = ""; String loadFileMessage = ""; Set<String> subclasses = new HashSet<String>(); Set<String> properties = new HashSet<String>(); public CSVExporterContext(String un, String pwd, String kb, boolean ver) { username = un; password = pwd; kbURL = kb; verbose = ver; } public String getLang(String contentType) { if (contentType.contains("turtle")) { return "TTL"; } else if (contentType.contains("rdf+xml")) { return "RDF/XML"; } else { return ""; } } public void getTriples(OutputStream outStream) throws IllegalStateException, IOException{ ResultSetRewindable results = getSelectQueryResult(queryAllTriples()); ResultSetFormatter.outputAsCSV(outStream, results); } public void getInstrumentModelTriples(OutputStream outStream) throws IllegalStateException, IOException{ subclasses.clear(); properties.clear(); getAllSubClasses("http://hadatac.org/ont/vstoi#Instrument", subclasses); for(String subclass : subclasses){ getDescribeQueryResult(queryDescription(subclass), properties); } ResultSetRewindable final_results = getSelectQueryResult( queryEntityOnProperty(subclasses, properties, "InstrumentModel")); ResultSetFormatter.outputAsCSV(outStream, final_results); } public void getInstrumentTriples(OutputStream outStream) throws IllegalStateException, IOException{ subclasses.clear(); properties.clear(); getAllSubClasses("http://hadatac.org/ont/vstoi#Instrument", subclasses); for(String subclass : subclasses){ Set<String> new_instances = getAllInstances(subclass); for(String instance : new_instances){ getDescribeQueryResult(queryDescription(instance), properties); } } ResultSetRewindable final_results = getSelectQueryResult( queryInstanceOnProperty(subclasses, properties, "Instrument")); ResultSetFormatter.outputAsCSV(outStream, final_results); } public void getDetectorModelTriples(OutputStream outStream) throws IllegalStateException, IOException{ subclasses.clear(); properties.clear(); getAllSubClasses("http://hadatac.org/ont/vstoi#Detector", subclasses); for(String subclass : subclasses){ getDescribeQueryResult(queryDescription(subclass), properties); } ResultSetRewindable final_results = getSelectQueryResult( queryEntityOnProperty(subclasses, properties, "DetectorModel")); ResultSetFormatter.outputAsCSV(outStream, final_results); } public void getDetectorTriples(OutputStream outStream) throws IllegalStateException, IOException{ subclasses.clear(); properties.clear(); getAllSubClasses("http://hadatac.org/ont/vstoi#Detector", subclasses); for(String subclass : subclasses){ Set<String> new_instances = getAllInstances(subclass); for(String instance : new_instances){ getDescribeQueryResult(queryDescription(instance), properties); } } ResultSetRewindable final_results = getSelectQueryResult( queryInstanceOnProperty(subclasses, properties, "Detector")); ResultSetFormatter.outputAsCSV(outStream, final_results); } public ResultSetRewindable getSelectQueryResult(String query){ String service = kbURL + Collections.METADATA_SPARQL; QueryExecution qe = QueryExecutionFactory.sparqlService(service, query); ResultSet results = qe.execSelect(); ResultSetRewindable resultsrw = ResultSetFactory.copyResults(results); qe.close(); return resultsrw; } public void getDescribeQueryResult(String query, Set<String> properties){ String service = kbURL + Collections.METADATA_SPARQL; QueryExecution qe = QueryExecutionFactory.sparqlService(service, query); Model model = qe.execDescribe(); StmtIterator stmtIterator = model.listStatements(); Statement statement; while (stmtIterator.hasNext()) { statement = stmtIterator.next(); properties.add(statement.getPredicate().getURI()); } } public String queryEntityOnProperty(Set<String> parent_classes, Set<String> properties, String entity){ String select = String.format(" SELECT ?%s ", entity); String which_triples = ""; Iterator<String> iter = parent_classes.iterator(); while(iter.hasNext()){ String parent_class = iter.next(); if(iter.hasNext()){ which_triples += String.format("{ ?%s rdfs:subClassOf <%s> } UNION \n", entity, parent_class); } else{ which_triples += String.format("{ ?%s rdfs:subClassOf <%s> } . \n", entity, parent_class); } } iter = properties.iterator(); while(iter.hasNext()){ String property = iter.next(); String[] name = property.split("#", 2); select += String.format("?%s ", name[1]); which_triples += String.format("OPTIONAL { ?%s <%s> ?%s } . \n", entity, property, name[1]); } String queryString = NameSpaces.getInstance().printSparqlNameSpaceList() + select + " WHERE { " + which_triples + " } "; System.out.println(queryString); return queryString; } public String queryInstanceOnProperty(Set<String> classes, Set<String> properties, String entity){ String select = String.format(" SELECT ?%s ", entity); String which_triples = ""; Iterator<String> iter = classes.iterator(); while(iter.hasNext()){ String cls = iter.next(); if(iter.hasNext()){ which_triples += String.format("{ ?%s rdf:type <%s> } UNION \n", entity, cls); } else{ which_triples += String.format("{ ?%s rdf:type <%s> } . \n", entity, cls); } } iter = properties.iterator(); while(iter.hasNext()){ String property = iter.next(); String[] name = property.split("#", 2); select += String.format("?%s ", name[1]); which_triples += String.format("OPTIONAL { ?%s <%s> ?%s } . \n", entity, property, name[1]); } String queryString = NameSpaces.getInstance().printSparqlNameSpaceList() + select + " WHERE { " + which_triples + " } "; System.out.println(queryString); return queryString; } public String queryAllTriples(){ String queryString = "SELECT ?s ?p ?o WHERE { ?s ?p ?o . }"; return queryString; } public String queryTest(){ String queryString = NameSpaces.getInstance().printSparqlNameSpaceList() + " SELECT ?instrument " + " WHERE { " + " ?instrument <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://hadatac.org/ont/hadatac-sn#H3123> ." + " } "; return queryString; } public void getAllSubClasses(String parent_class, Set<String> subclasses){ subclasses.add(parent_class); ResultSetRewindable results = getSelectQueryResult(querySubClass(parent_class)); while(results.hasNext()){ QuerySolution soln = results.next(); String uri = soln.getResource("subclasses").getURI(); getAllSubClasses(uri, subclasses); } } public Set<String> getAllInstances(String class_uri){ Set<String> instances = new HashSet<String>(); ResultSetRewindable results = getSelectQueryResult(queryInstance(class_uri)); while(results.hasNext()){ QuerySolution soln = results.next(); String uri = soln.getResource("instances").getURI(); instances.add(uri); } return instances; } public String querySubClass(String parent_class){ String queryString = NameSpaces.getInstance().printSparqlNameSpaceList() + String.format(" SELECT ?subclasses " + " WHERE { " + " ?subclasses rdfs:subClassOf <%s> ." + " } ", parent_class); return queryString; } public String queryInstance(String class_uri){ String queryString = NameSpaces.getInstance().printSparqlNameSpaceList() + String.format(" SELECT ?instances " + " WHERE { " + " ?instances rdf:type <%s> ." + " } ", class_uri); return queryString; } public String queryDescription(String uri){ String describe = String.format("DESCRIBE <%s>", uri); String queryString = NameSpaces.getInstance().printSparqlNameSpaceList() + describe; return queryString; } }