package org.aksw.jena_sparql_api.playground;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.aksw.jena_sparql_api.core.FluentQueryExecutionFactory;
import org.aksw.jena_sparql_api.core.QueryExecutionFactory;
import org.aksw.jena_sparql_api.core.SparqlService;
import org.aksw.jena_sparql_api.sparql_path2.PropertyFunctionFactoryKShortestPaths;
import org.aksw.jena_sparql_api.sparql_path2.PropertyFunctionKShortestPaths;
import org.aksw.jena_sparql_api_sparql_path2.SparqlKShortestPathFinderYen;
import org.aksw.jena_sparql_api_sparql_path2.SparqlPathUtils;
import org.apache.jena.graph.Node;
import org.apache.jena.graph.NodeFactory;
import org.apache.jena.query.QueryExecution;
import org.apache.jena.query.ResultSet;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.riot.Lang;
import org.apache.jena.riot.RDFDataMgr;
import org.apache.jena.shared.PrefixMapping;
import org.apache.jena.shared.impl.PrefixMappingImpl;
import org.apache.jena.sparql.core.Prologue;
import org.apache.jena.sparql.engine.binding.Binding;
import org.apache.jena.sparql.path.PathParser;
import org.apache.jena.sparql.pfunction.PropertyFunctionRegistry;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import au.com.bytecode.opencsv.CSVReader;
public class MainKShortestPathsTaskRunner {
public static TaskContext createTaskContext(List<String> cols, ResourceLoader resourceLoader, String basePath, QueryExecutionFactory dcatQef) throws IOException {
// TODO: The mapping from sparql service to path finder must be made configurable
PropertyFunctionRegistry.get().put(PropertyFunctionKShortestPaths.DEFAULT_IRI, new PropertyFunctionFactoryKShortestPaths(ss ->
new SparqlKShortestPathFinderYen(ss.getQueryExecutionFactory(), 50)
));
PrefixMappingImpl pm = new PrefixMappingImpl();
pm.setNsPrefix("jsafn", "http://jsa.aksw.org/fn/");
pm.setNsPrefixes(PrefixMapping.Extended);
Prologue prologue = new Prologue(pm);
TaskContext result = new TaskContext();
result.setDescription("Task: " + cols);
if(cols.size() != 6) {
throw new RuntimeException("Input rows must have exactly 6 columns, got :" + cols.size() + ": " + cols);
}
String dataset = cols.get(0);
SparqlService ss = SparqlPathUtils.createSparqlService(dataset, resourceLoader, prologue, dcatQef);
result.setSparqlService(ss);
Node start = NodeFactory.createURI(cols.get(1));
Node end = NodeFactory.createURI(cols.get(2));
result.setStartNode(start);
result.setEndNode(end);
int k = Integer.parseInt(cols.get(3));
result.setK(k);
String rawPathStr = cols.get(4).trim();
String pathStr;
if(rawPathStr.isEmpty()) {
//pathStr = "(<http://ex.org/p>|!<http://ex.org/p>)*";
pathStr = "(!<http://ex.org/tmp>)*";
}
else if(rawPathStr.startsWith("http://")) {
pathStr
= "<" + rawPathStr + ">/(!<http://ex.org/tmp>)*|"
+ "(!<http://ex.org/tmp>)/<" + rawPathStr + ">" ;
}
else {
pathStr = rawPathStr;
}
result.setPath(PathParser.parse(pathStr, prologue.getPrefixMapping()));
//System.out.println("GOT PATH: " + result.getPath());
String refFile = cols.get(5);
Resource cp = resourceLoader.getResource(basePath + "/" + refFile);
if(!cp.exists()) {
throw new RuntimeException("Reference file does not exist: " + cp);
}
System.out.println(cols);
System.out.println(dataset);
return result;
// Stopwatch sw = Stopwatch.createStarted();
//
// //joinSummaryModel = RDFDataMgr.loadModel("/home/raven/Projects/Eclipse/Spark-RDF/tmp/fp7-summary-predicate-join.nt");
// //System.out.println("Join Summary Read took: " + sw.stop().elapsed(TimeUnit.SECONDS) + " for " + joinSummaryModel.size() + " triples");
//
// Model model = ModelFactory.createDefaultModel();
// //RDFDataMgr.read(model, "classpath://dataset-fp7.ttl");
// RDFDataMgr.read(model, (new ClassPathResource("dataset-fp7.ttl").getInputStream()), Lang.TTL);
//
// Resource ds = ResourceFactory.createResource("http://example.org/resource/data-fp7");
//String q = "Select ?service ?graph"
//
// dataset = DatasetDescriptionUtils.createDefaultGraph("http://fp7-pp.publicdata.eu/");
// predDataset = DatasetDescriptionUtils.createDefaultGraph("http://fp7-pp.publicdata.eu/summary/predicate/");
// predJoinDataset = DatasetDescriptionUtils.createDefaultGraph("http://fp7-pp.publicdata.eu/summary/predicate-join/");
//
// desiredPred = NodeFactory.createURI("http://fp7-pp.publicdata.eu/ontology/funding");
// pathExprStr = createPathExprStr("http://fp7-pp.publicdata.eu/ontology/funding");
// //pathExprStr = "<http://fp7-pp.publicdata.eu/ontology/funding>/^<http://foo>/<http://fp7-pp.publicdata.eu/ontology/funding>/<http://fp7-pp.publicdata.eu/ontology/partner>/!<http://foobar>*";
// startNode = NodeFactory.createURI("http://fp7-pp.publicdata.eu/resource/project/257943");
// endNode = NodeFactory.createURI("http://fp7-pp.publicdata.eu/resource/city/France-PARIS");
//
// queryStr = "SELECT ?path { <" + startNode.getURI() + "> jsafn:kShortestPaths ('" + pathExprStr + "' ?path <" + endNode.getURI() + "> 471199) }";
}
public static void runTask(TaskContext taskContext) throws IOException {
System.out.println("Running task " + taskContext.getStartNode() + " " + taskContext.getEndNode() + " " + taskContext.getK());
String pathExprStr = "" + taskContext.getPath();
Node startNode = taskContext.getStartNode();
Node endNode = taskContext.getEndNode();
String queryStr = "SELECT ?path { <" + startNode.getURI() + "> jsafn:kShortestPaths ('" + pathExprStr + "' ?path <" + endNode.getURI() + "> " + taskContext.getK() + ") }";
QueryExecutionFactory qef = taskContext.getSparqlService().getQueryExecutionFactory();
QueryExecution qe = qef.createQueryExecution(queryStr);
ResultSet rs = qe.execSelect();
File tmpFile = File.createTempFile("path", "txt");
while(rs.hasNext()) {
Binding binding = rs.nextBinding();
System.out.println("Binding: " + binding);
}
//throw new RuntimeException("done");
}
public static void main(String[] args) throws IOException {
ResourceLoader resourceLoader = new AnnotationConfigApplicationContext();
Model datasetModel = ModelFactory.createDefaultModel();
QueryExecutionFactory dcatQef = FluentQueryExecutionFactory.model(datasetModel).create();
SparqlPathUtils.readModel(datasetModel, resourceLoader, "classpath:dcat-eswc-training.ttl", Lang.TURTLE);
//datasetModel.write(System.out, "TTL");
// URL url = new URL("classpath:custom/data.nt");
// System.out.println(StreamUtils.toString(url.openStream()));
Map<String, QueryExecutionFactory> datasetToQef = new HashMap<>();
List<TaskContext> taskContexts = new ArrayList<>();
String basePath = "file:///home/raven/Downloads/eswc";
String taskResource = "eswc-training-task1.tsv";
String refPath = basePath + "/challenge_training_result_sets";
//String basePath = "custom";
//String taskFile = "tasks.tsv";
//ClassPathResource
try(CSVReader reader = new CSVReader(new InputStreamReader(new ClassPathResource(taskResource).getInputStream()), '\t')) {
// First path: Validate referenecd resources and set up services
String[] row;
while((row = reader.readNext()) != null) {
List<String> cols = Arrays.asList(row);
boolean isRowEmpty = cols.size() == 1 && cols.get(0).trim().equals("");
if(!isRowEmpty) {
TaskContext taskContext = createTaskContext(cols, resourceLoader, refPath, dcatQef);
taskContexts.add(taskContext);
}
}
}
// run the tasks
for(TaskContext taskContext : taskContexts) {
runTask(taskContext);
//break;
//taskContext.get
}
}
}