Reputation: 21
I am familiarising with the sesame Triple store and trying basic stuff with like adding and retrieving data. When I use a SailRepository everything works well, but when i use the http repository as shown below, i get this error:
repository initialized
Exception in thread "main" org.openrdf.repository.http.HTTPQueryEvaluationException:
at org.openrdf.repository.http.HTTPTupleQuery.evaluate(HTTPTupleQuery.java:59)
at servlet.sesame.Test.isStored(Test.java:28)
at servlet.sesame.Test.ADD(Test.java:33)
at servlet.sesame.Test.main(Test.java:54)
Caused by: org.openrdf.repository.RepositoryException:
at org.openrdf.http.client.HTTPClient.handleHTTPError(HTTPClient.java:953)
at org.openrdf.http.client.HTTPClient.sendTupleQueryViaHttp(HTTPClient.java:718)
at org.openrdf.http.client.HTTPClient.getBackgroundTupleQueryResult(HTTPClient.java:602)
at org.openrdf.http.client.HTTPClient.sendTupleQuery(HTTPClient.java:367)
at org.openrdf.repository.http.HTTPTupleQuery.evaluate(HTTPTupleQuery.java:53)
... 3 more
Here's my code:
public class Test {
public static boolean isStored(String id, Repository rep) throws RepositoryException, QueryEvaluationException, MalformedQueryException
{
ValueFactory f = rep.getValueFactory();
URI testedIdURI = f.createURI("http://example.org/" + id);
// Check if
String request ="SELECT ?subject WHERE{<"+ testedIdURI +"> ?predicate ?object}";
TupleQueryResult reponse = rep.getConnection().prepareTupleQuery(QueryLanguage.SPARQL, request).evaluate();
return reponse.hasNext();
}
public static void ADD(String id, Repository rep) throws RepositoryException, QueryEvaluationException, MalformedQueryException{
boolean is = isStored(id,rep);
if(is){
System.out.println("already exists");
}
else{
rep.getConnection().add(rep.getValueFactory().createURI("http://example.org/", id), RDF.TYPE,FOAF.PERSON);
System.out.println(id+" added");
}
}
public static void main(String[] args) throws RepositoryException,RDFHandlerException, MalformedQueryException, QueryEvaluationException {
Repository rep = new HTTPRepository("http://localhost:8080/openrdf-workbench/","Test");
//Repository rep = new SailRepository(new MemoryStore());
rep.initialize();
System.out.println("repository initialized");
ValueFactory f = rep.getValueFactory();
try{
ADD("Timon",rep);
ADD("Pumba",rep);
ADD("eddy",rep);
ADD("Pumba",rep);
ADD("Timon",rep);
rep.getConnection().add(f.createURI("http://example.org/", "Turin"),RDF.PREDICATE,f.createURI("http://example.org/", "Timon"));
rep.getConnection().add(f.createURI("http://example.org/", "Turin"),RDF.PREDICATE,f.createURI("http://example.org/", "Timon"));
rep.getConnection().add(f.createURI("http://example.org/", "Timon"),RDF.PREDICATE, f.createURI("http://example.org/", "eddy"));
rep.getConnection().add(f.createURI("http://example.org/", "Pumba"),RDF.PREDICATE, f.createURI("http://example.org/", "Timon"));
// RepositoryResult<Statement> statements = rep.getConnection().getStatements(null, null, null, true);
// Model model = Iterations.addAll(statements, new LinkedHashModel());
String request = "SELECT DISTINCT ?object WHERE{<" +f.createURI("http://example.org/", "Timon")+"> <"+ RDF.PREDICATE +"> ?object }";
rep.getConnection().prepareTupleQuery(QueryLanguage.SPARQL, request);
TupleQueryResult res = rep.getConnection().prepareTupleQuery(QueryLanguage.SPARQL, request).evaluate();
String s="";
while(res.hasNext())
{
BindingSet bs = res.next();
s+="\n " +(bs.getBinding("object").getValue().stringValue());
}
System.out.println(s);
}
finally
{
rep.getConnection().close();
}
}
}
Upvotes: 2
Views: 919
Reputation: 22042
There's a couple of things wrong with your code. The immediate problem is probably caused by this line:
Repository rep = new HTTPRepository("http://localhost:8080/openrdf-workbench/","Test");
You are using the wrong server URL here. The correct server URL is http://localhost:8080/openrdf-sesame/
. Changing this should solve the immediate problem.
Apart from this, however, I have a tip for you to make your code more robust, faster, and more scalable. In your code, you are passing a Repository object between methods, and are creating a new RepositoryConnection every time you perform an update or query. That is really very inefficient, not to mention the fact that you then do not close any connections.
So instead, I'd recommend that you reuse your RepositoryConnection object a bit more, and properly close it when done. For example, instead of:
rep.getConnection().add(f.createURI("http://example.org/", "Turin"),RDF.PREDICATE,f.createURI("http://example.org/", "Timon"));
rep.getConnection().add(f.createURI("http://example.org/", "Turin"),RDF.PREDICATE,f.createURI("http://example.org/", "Timon"));
rep.getConnection().add(f.createURI("http://example.org/", "Timon"),RDF.PREDICATE, f.createURI("http://example.org/", "eddy"));
rep.getConnection().add(f.createURI("http://example.org/", "Pumba"),RDF.PREDICATE, f.createURI("http://example.org/", "Timon"));
do something like this:
RepositoryConnection conn = rep.getConnection();
try {
conn.begin(); // start a transaction
conn.add(f.createURI("http://example.org/", "Turin"),RDF.PREDICATE,f.createURI("http://example.org/", "Timon"));
conn.add(f.createURI("http://example.org/", "Turin"),RDF.PREDICATE,f.createURI("http://example.org/", "Timon"));
conn.add(f.createURI("http://example.org/", "Timon"),RDF.PREDICATE, f.createURI("http://example.org/", "eddy"));
conn.add(f.createURI("http://example.org/", "Pumba"),RDF.PREDICATE, f.createURI("http://example.org/", "Timon"));
conn.commit();
}
finally {
conn.close();
}
Upvotes: 2