user3824844
user3824844

Reputation: 21

How do I add and retrieve data from a Sesame server?

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

Answers (1)

Jeen Broekstra
Jeen Broekstra

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

Related Questions