我不明白如何使用Jena查询DBpedia.在像
here(清单4)这样的教程中,模型的初始化如下:
// 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();
假设我想写一个在巴黎列出教堂的查询.在SPARQL中,它将看起来像(从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" ) }
这个查询在Java中如何看?特别是,我对模型对象的初始化感兴趣.
解决方法
浏览吨和吨的页面后,我找到了答案.也许我没有清楚地提出这个问题,但下面是对我有用的代码.
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(); }