Querying DBpedia with SPARQL and Jena
Asked Answered
P

1

9

I cannot understand how can I query DBpedia using Jena. In the tutorials like here(Listing 4) model is initialized as follows:

// Open the bloggers RDF graph from the filesystem
InputStream in = new FileInputStream(new File("bloggers.rdf"));

// Create an empty in-memory model and populate it from the graph
Model model = ModelFactory.createMemModelMaker().createModel();
model.read(in,null); // null base URI, since model URIs are absolute
in.close();

Let's say I want to write a query that will list churches in Paris. In SPARQL it will look like (taken from this mailing list message):

PREFIX p: <http://dbpedia.org/property/>
PREFIX dbpedia: <http://dbpedia.org/resource/>
PREFIX category: <http://dbpedia.org/resource/Category:>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX geo: <http://www.georss.org/georss/>

SELECT DISTINCT ?m ?n ?p ?d
WHERE {
 ?m rdfs:label ?n.
 ?m skos:subject ?c.
 ?c skos:broader category:Churches_in_Paris.
 ?m p:abstract ?d.
 ?m geo:point ?p
 FILTER ( lang(?n) = "fr" )
 FILTER ( lang(?d) = "fr" )
 }

How will this query look in Java? Particularly, I'm interested in how the model object is initialized.

Pentagon answered 29/10, 2009 at 14:46 Comment(2)
Do you want to know how to run SPARQL queries in Jena, or a procedure that performs an equivalent query to that one?Bingle
Yes. Actually I found an answer which I was looking for but I would look with pleasure to your answer. Thanks.Pentagon
P
15

After browsing tons and tons of pages I found the answer. Perhaps I didn't ask the question clearly enough, but anyway below is the code that worked for me.

String queryString=
"PREFIX p: <http://dbpedia.org/property/>"+
"PREFIX dbpedia: <http://dbpedia.org/resource/>"+
"PREFIX category: <http://dbpedia.org/resource/Category:>"+
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>"+
"PREFIX skos: <http://www.w3.org/2004/02/skos/core#>"+
"PREFIX geo: <http://www.georss.org/georss/>"+

"SELECT DISTINCT ?m ?n ?p ?d"+
"WHERE {"+
" ?m rdfs:label ?n."+
" ?m skos:subject ?c."+
" ?c skos:broader category:Churches_in_Paris."+
" ?m p:abstract ?d."+
" ?m geo:point ?p"+
" FILTER ( lang(?n) = "fr" )"+
" FILTER ( lang(?d) = "fr" )"+
" }"

// now creating query object
Query query = QueryFactory.create(queryString);
// initializing queryExecution factory with remote service.
// **this actually was the main problem I couldn't figure out.**
QueryExecution qexec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", query);

//after it goes standard query execution and result processing which can
// be found in almost any Jena/SPARQL tutorial.
try {
    ResultSet results = qexec.execSelect();
    for (; results.hasNext();) {

    // Result processing is done here.
    }
}
finally {
   qexec.close();
}

This answer I found on dbpedia-discussion of www.mail-archive.com page.

Pentagon answered 30/10, 2009 at 12:20 Comment(2)
The code in this answer isn't quite right, and contains some subtle bugs. String concatenation like "SELECT DISTINCT ?m ?n ?p ?d"+ "WHERE {" leads to "SELECT DISTINCT ... ?dWHERE {` with a variable named dWHERE (and this is still legal, since the WHERE in a SPARQL where is optional; i.e., select ?x { } and select ?x WHERE {} are the same).Homage
And escapes are needed in the language tags, in " FILTER ( lang(?n) = "fr" )"+. But on top of that, language tags should be compared with langMatches: filter langMatches(lang(?n),'fr').Homage

© 2022 - 2024 — McMap. All rights reserved.