package semanticweb; import org.openrdf.query.*; import org.openrdf.repository.Repository; import org.openrdf.repository.RepositoryConnection; import org.openrdf.repository.RepositoryException; import org.openrdf.repository.sail.SailRepository; import org.openrdf.rio.RDFFormat; import org.openrdf.rio.RDFHandler; import org.openrdf.rio.RDFHandlerException; import org.openrdf.rio.RDFParseException; import org.openrdf.rio.n3.N3Writer; import org.openrdf.sail.inferencer.fc.ForwardChainingRDFSInferencer; import org.openrdf.sail.memory.MemoryStore; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; /** * Wrapper class for an embedded Sesame RDF data store. This class was derived * from the TrippleStoreSesameManager class in the commercial (but free for * non commercial use) product KB_bundle as descibed at http://knowledgebooks.com * * Copyright 2008-2012 by Mark Watson. All rights reserved. * <p/> * This software is not public domain. It can be legally * used under either the LGPL version 3 or Apache 2 license. */ public class TripleStoreSesameManager { /** * Create an in-memory RDF triple store * * @throws org.openrdf.repository.RepositoryException */ public TripleStoreSesameManager() throws RepositoryException { MemoryStore ms = new MemoryStore(); ForwardChainingRDFSInferencer fci = new ForwardChainingRDFSInferencer(ms); myRepository = new SailRepository(fci); myRepository.initialize(); System.out.println(myRepository); con = myRepository.getConnection(); } /** * Load RDF from a file. The file should have one of these extentions: * <ul> * <li>.rdf - for XML RDF format</li> * <li>.nt - for NTriple RDF format</li> * <li>.n3 - for the most concise N3 RDF format</li> * </ul> * @param rdf_file_path_name * @throws org.openrdf.repository.RepositoryException * @throws java.io.IOException * @throws org.openrdf.rio.RDFParseException */ public void loadRDF(String rdf_file_path_name) throws RepositoryException, IOException, RDFParseException { File file = new File(rdf_file_path_name); if (rdf_file_path_name.endsWith(".nt")) con.add(file, "http://knowledgebooks.com/ontology", RDFFormat.NTRIPLES); else if (rdf_file_path_name.endsWith(".n3")) con.add(file, "http://knowledgebooks.com/ontology", RDFFormat.N3); else if (rdf_file_path_name.endsWith(".rdf")) con.add(file, "http://knowledgebooks.com/ontology", RDFFormat.RDFXML); else System.out.println("\n\nERROR: file name " + rdf_file_path_name + " has an unsupported file extention.\n"); } /** * Close the RDF repository */ public void close() { try { con.close(); } catch (RepositoryException ex) { Logger.getLogger(TripleStoreSesameManager.class.getName()).log(Level.SEVERE, null, ex); } } /** * Perform a SPARQL query * * @param sparql_query * @param handler * @return * @throws RepositoryException * @throws MalformedQueryException * @throws QueryEvaluationException */ public String doSparqlQuery(String sparql_query, ISparqlProcessResults handler) throws RepositoryException, MalformedQueryException, QueryEvaluationException { StringBuffer sb = new StringBuffer(); TupleQuery tupleQuery = con.prepareTupleQuery(QueryLanguage.SPARQL, sparql_query); TupleQueryResult result = tupleQuery.evaluate(); try { //.... // do something with the result //System.out.println("\n\n\n* * * result: " + result.getBindingNames()); List<String> bindingNames = result.getBindingNames(); int size = result.getBindingNames().size(); //System.out.println("Size of result data = " + size); while (result.hasNext()) { BindingSet bindingSet = result.next(); int size2 = bindingSet.size(); //System.out.println("size2 = " + size2); List<String> temp = new ArrayList<String>(size2); for (int i = 0; i < size2; i++) { String val = bindingSet.getValue(bindingNames.get(i)).stringValue(); //System.out.println("val = " + val); temp.add(val); } handler.processResult(temp); } } finally { result.close(); } return sb.toString(); } /** * Save the RDF repository that is currently in memory to a N3 formatted RDF file. * * @param output_file_path * @throws org.openrdf.repository.RepositoryException * @throws org.openrdf.rio.RDFHandlerException * @throws java.io.IOException */ public void saveRepositoryAsN3(String output_file_path) throws RepositoryException, RDFHandlerException, IOException { FileWriter outFile = new FileWriter(output_file_path); //PrintWriter out = new PrintWriter(outFile); RDFHandler n3Writer = new N3Writer(outFile); con.export(n3Writer); outFile.close(); } private Repository myRepository; private RepositoryConnection con; private String baseURI = "http://knowledgebooks.com/ontology"; }