Jena: how to query data from model?

Pedro picture Pedro · Mar 27, 2012 · Viewed 7.9k times · Source

Is it possible to query data from a Model without writing sqarql-queries? Adding properties to resources or resources to models can be done easily, but I haven't found out yet, if there is a more efficient way to query data from a Model than using code the one below:

    String sparql = "SELECT ?thing ?str WHERE { " +
                        "?thing a <" + THING + "> . " +
                        "?thing <" + HAS_STRING + "> ?str . " +
                        "FILTER (?str = \"" + s + "\") . }";

    Query qry = QueryFactory.create(sparql);
    QueryExecution qe = QueryExecutionFactory.create(qry, getModel());
    ResultSet rs = qe.execSelect();

    while(rs.hasNext())
    {
        QuerySolution sol = rs.nextSolution();
        RDFNode str = sol.get("str"); 
        RDFNode thing = sol.get("thing"); 

        ...
    }

    qe.close(); 

Answer

castagna picture castagna · Mar 29, 2012

You can use the list* methods available on a Jena Model: http://incubator.apache.org/jena/documentation/javadoc/jena/com/hp/hpl/jena/rdf/model/Model.html

For example, model.listStatements() or model.listStatements ((Resource)null, RDF.type, (RDFNode)null), etc.

You can find an example of model.listStatements() here: https://github.com/castagna/jena-examples/blob/995d7acf8fcb3f9a8f7264dfd0902cdddfc00279/src/main/java/org/apache/jena/examples/ExampleAPI_01.java

See also the section "Querying a Model" in the Jena tutorial on the Jena website: http://incubator.apache.org/jena/tutorials/rdf_api.html#ch-Querying%20a%20Model

One last comment, in terms of efficiency you should not see much difference, indeed I do not think there is a difference. For every list* methods in Model you can write a very simple SPARQL query and compare performances yourself. If what you want is available as a method of a Model then use it, but you'll soon find that when you want to do more, SPARQL queries can be more concise and allows you to get back just exactly what you need with less code.