swt lecture session 4 - sesame
DESCRIPTION
TRANSCRIPT
+
Sesame
Mariano Rodriguez-Muro, Free University of Bozen-Bolzano
+Disclaimer
License This work is licensed under a
Creative Commons Attribution-Share Alike 3.0 License (http://creativecommons.org/licenses/by-sa/3.0/)
Material for these slides has been taken from Programming the Semantic Web (Chapter 8) Sesame’s documentation
+Reading material
Programming the Semantic Web Chapter 8
Sesame user guide http://www.openrdf.org/doc/sesame2/users/
See also Jetty 8http://download.eclipse.org/jetty/stable-8/dist/
+
Overview
+Overview
Sesame History Overview Repository API
Creating a Repository Repository connections
Sesame Console Sesame workbench
+Overview and History
Open source Java for storage and querying RDF
RDF inference
RDF IO (all file formats)
JDBC-like user API
RESTful HTTP interface
SPARQL Protocol support
Easy learning curve, great management features
By Aduna for the On-To-Knowledge EU project
Now developed by Nlnet foundation, Ontotext and community volunteers
Available at www.openrdf.org
+Sesame components
RDF Model: contains all basic entities
Rio: parsers and writers
Sail: low level API for RDF stores and inferencers (abstraction)
Repository API: high level API with developer-methods
HTTP Server: Java Servlets to access Sesame repos
HTTPClient: Abstraction layer to access HTTP Servers
+
Repository API
+Repository API
Developer-focused API
In contrast with Jena, in Sesame RDF models are not handled by the user (normally), instead we use Repositories.
Vendors provide triple stores as Repository implementations
Sesame provides the following repository implementations: Main memory Native RDF repository Remote repository (HTTP proxy)
To use Sesame repositories, these must be stacked in Sails, i.e., stacks of layered behavior
+Creating a repository
An in-memory repo
An in-memory repo with persistance
Repository myRepository = new SailRepository(new MemoryStore());myRepository.initialize();
File dataDir = new File("c:\\temp\\myRepository\\");Repository myRepository = new SailRepository( new MemoryStore(dataDir) );myRepository.initialize();
+Creating a repository
a native RDF repository
a native RDF repository with custom indexes
File dataDir = new File("/path/to/datadir/");Repository myRepository = new SailRepository(new NativeStore(dataDir));myRepository.initialize();
File dataDir = new File("/path/to/datadir/");String indexes = "spoc,posc,cosp";Repository myRepository = new SailRepository(new NativeStore(dataDir, indexes));myRepository.initialize();
+Creating a repository
a remote Repository
String sesameServer = "http://example.org/sesame2";String repositoryID = "example-db";
Repository myRepository = new HTTPRepository(sesameServer, repositoryID);myRepository.initialize();
+Using a repository: RepositoryConnection
JDBC like-interface
Operations add triples by file, URI,
Statement query using SPARQL
SELECT, ASK or Construct queries
create, retrieve, remove individual statements
prepared queries
Transaction support commit(), rollback()
+Adding to a repository
File file = new File("/path/to/example.rdf");String baseURI = "http://example.org/example/local";
try { RepositoryConnection con = myRepository.getConnection(); try { con.add(file, baseURI, RDFFormat.RDFXML);
URL url = new URL("http://example.org/example/remote"); con.add(url, url.toString(), RDFFormat.RDFXML); } finally { con.close(); }}catch (…)
+Querying a repository (tuple)
RepositoryConnection con = myRepository.getConnection(); try { String queryString = “SELECT …. “;TupleQuery tupleQuery = con.prepareTupleQuery(SPARQL, queryString); TupleQueryResult result = tupleQuery.evaluate(); try { .... // do something with the result } finally { result.close(); } } finally { con.close(); }
+Tuple queries (cont)
while (result.hasNext()) { BindingSet bindingSet = result.next(); Value valueOfX = bindingSet.getValue("x"); Value valueOfY = bindingSet.getValue("y");
// do something interesting with the values here...}
List<String> bindingNames = result.getBindingNames();while (result.hasNext()) { BindingSet bindingSet = result.next(); Value firstValue = bindingSet.getValue(bindingNames.get(0)); Value secondValue = bindingSet.getValue(bindingNames.get(1));
// do something interesting with the values here...}
+TupleQueryResultHandlerFileOutputStream out = new FileOutputStream("/path/to/result.srx");try { SPARQLResultsXMLWriter sparqlWriter = new SPARQLResultsXMLWriter(out);
RepositoryConnection con = myRepository.getConnection(); try { String queryString = "SELECT * FROM {x} p {y}"; TupleQuery tupleQuery = con.prepareTupleQuery(QueryLanguage.SERQL, queryString); tupleQuery.evaluate(sparqlWriter); } finally { con.close(); }}finally { out.close();}
+Evaluating Graph queries
GraphQueryResult graphResult = con.prepareGraphQuery( QueryLanguage.SPARQL, "CONSTRUCT ….").evaluate();
while (graphResult.hasNext()) { Statement st = graphResult.next(); // ... do something with the resulting statement here.}
+RDF Handler
Equivalent for TupleQueryResultHandler > RDFHandler
Examples: RDFXMLWriter, TurtleWriter, etc.
TurtleWriter turtleWriter = new TurtleWriter(System.out);
con.prepareGraphQuery(QueryLanguage.SPARQL, "CONSTRUCT …").evaluate(turtleWriter);
+Adding individual statements
ValueFactory f = myRepository.getValueFactory();
URI alice = f.createURI("http://example.org/people/alice");URI bob = f.createURI("http://example.org/people/bob");URI name = f.createURI("http://example.org/ontology/name");URI person = f.createURI("http://example.org/ontology/Person");Literal bobsName = f.createLiteral("Bob");Literal alicesName = f.createLiteral("Alice");
RepositoryConnection con = myRepository.getConnection();
con.add(alice, RDF.TYPE, person); con.add(alice, name, alicesName);
con.add(bob, RDF.TYPE, person); con.add(bob, name, bobsName);
+Retrieving
RepositoryResult<Statement> statements = con.getStatements(alice, null, null, true);
try { while (statements.hasNext()) { Statement st = statements.next();
... // do something with the statement }}finally { statements.close(); // make sure the result object is closed properly}
+Deleting statements
a single statement
many statements
con.remove(alice, name, alicesName);
con.remove(alice, null, null);
+Iterators and statements
Sesame’s API offer many calls compatible for iterators to facilitate “batch” manipulation
// Retrieve all statements about Alice and put them in a listRepositoryResult<Statement> statements = con.getStatements(alice, null, null, true));List<Statement> aboutAlice = Iterations.addAll(statements, new ArrayList<Statement>());
// Then, remove them from the repositorycon.remove(aboutAlice);
con.remove(con.getStatements(alice, null, null, true));
+Named graphs
Named graphs are natively supported by Sesame
Named graphs are called “Context” in Sesame
String location = "http://example.org/example/example.rdf";String baseURI = location;URL url = new URL(location);URI context = f.createURI(location);
con.add(url, baseURI, RDFFormat.RDFXML, context);
+Transactions
SQL-like transactions
Treat a “block” of operations as a single update
Failures can be “rolled back”
+TransactionsFile inputFile1 = new File("/path/to/example1.rdf");String baseURI1 = "http://example.org/example1/";
File inputFile2 = new File("/path/to/example2.rdf");String baseURI2 = "http://example.org/example2/";
RepositoryConnection con = myRepository.getConnection();try { con.setAutoCommit(false);
con.add(inputFile1, baseURI1, RDFFormat.RDFXML);
con.add(inputFile2, baseURI2, RDFFormat.RDFXML);
con.commit();}catch (RepositoryException e) { con.rollback(); }finally { con.close(); }
+
Sesame Console
+Sesame console
command-line application to interact with Sesame
Easy way to create and manage repositories
Create in the console, use from Java
Possible actions: Creating repositories Load/Unload data from
Files/URIs/SPARQL Update Query using SPARQL Querying/Managing
remote Sesame repositories
> sh bin/console.shConnected to default data directory
Commands end with '.' at the end of a lineType 'help.' for help> help.
+Repository types
memory,memory-rdfsa memory based RDF repository (optionaly with RDFS inference)
native, native-rdfsa repository that uses on-disk data structure (optional RDFS inference)
pgsql, mysqla repository that stores data in a PostgreSQL (mysql) database
remote -- a repository that serves as a proxy for a
repository on a Sesame Server
Please specify values for the following variables:Repository ID [native]: myRepoRepository title [Native store]: My repositoryTriple indexes [spoc,posc]: Repository created> show repositories.> +----------> |SYSTEM> |myRepo(”My repository")> +----------
+
Sesame WorkbenchRepository Manager and SPARQL end-points with Sesame
+Sesame workbench
SPARQL Protocol implementation (sparql-endpoint) for Sesame repositories
Web based management console for Sesame repositories
Web based query interface for repositories.
+Setup
Requires a JSP server, e.g., Tomcat or Jetty 8
Drop the 2 .war files from the /war folder of the sesame .zip into your webapps folder
Start the JSP server If you are using Jetty, do:
jetty.sh/bat start
in the command line