package org.deri.vocidex; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import com.hp.hpl.jena.query.Dataset; import com.hp.hpl.jena.query.DatasetFactory; import com.hp.hpl.jena.query.Query; import com.hp.hpl.jena.query.QueryExecution; import com.hp.hpl.jena.query.QueryExecutionFactory; import com.hp.hpl.jena.query.QueryFactory; import com.hp.hpl.jena.query.QuerySolution; import com.hp.hpl.jena.query.QuerySolutionMap; import com.hp.hpl.jena.query.ResultSet; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.RDFNode; import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.rdf.model.ResourceFactory; import com.hp.hpl.jena.util.FileUtils; /** * Convenience class for running SPARQL queries stored in files against * a Jena {@link Model} or {@link Dataset}. * * @author Richard Cyganiak */ public class SPARQLRunner { private final Dataset dataset; public SPARQLRunner(Model model) { this(DatasetFactory.create(model)); } public SPARQLRunner(Dataset dataset) { this.dataset = dataset; } public List<Resource> getURIs(String queryFile, String paramVariable, Resource paramValue, String resultVariable) { Query query = getQuery(queryFile); QuerySolutionMap args = new QuerySolutionMap(); if (paramVariable != null && paramValue != null) { args.add(paramVariable, paramValue); } ArrayList<Resource> result = new ArrayList<Resource>(); ResultSet rs = QueryExecutionFactory.create(query, dataset, args).execSelect(); while (rs.hasNext()) { RDFNode n = rs.next().get(resultVariable); if (n == null || !n.isURIResource()) continue; result.add(n.asResource()); } Collections.sort(result, new Comparator<Resource>() { public int compare(Resource r1, Resource r2) { return r1.getURI().compareTo(r2.getURI()); } }); return result; } public String getLangString(String queryFile, Resource term, String resultVariable) { Query query = getQuery(queryFile); QuerySolutionMap args = new QuerySolutionMap(); args.add("term", term); args.add("prefLang", ResourceFactory.createPlainLiteral("en")); ResultSet rs = QueryExecutionFactory.create(query, dataset, args).execSelect(); if (!rs.hasNext()) return null; RDFNode n = rs.next().get(resultVariable); if (n == null || !n.isLiteral()) return null; return n.asLiteral().getLexicalForm(); } public QuerySolution getOneSolution(String queryFile, String paramVariable, Resource paramValue) { Query query = getQuery(queryFile); QuerySolutionMap args = new QuerySolutionMap(); if (paramVariable != null && paramValue != null) { args.add(paramVariable, paramValue); } QueryExecution qe = QueryExecutionFactory.create(query, dataset, args); ResultSet rs = qe.execSelect(); if (!rs.hasNext()) return null; QuerySolution result = rs.next(); qe.close(); return result; } private static Query getQuery(String filename) { if (!queryCache.containsKey(filename)) { try { return QueryFactory.create(FileUtils.readWholeFileAsUTF8( SPARQLRunner.class.getResourceAsStream("/queries/" + filename))); } catch (IOException ex) { throw new RuntimeException(ex); } } return queryCache.get(filename); } private static final Map<String,Query> queryCache = new HashMap<String,Query>(); }