使用SPARQL和Jena查询DBpedia

Eug*_*ica 9 semantic-web sparql jena dbpedia

我无法理解如何使用Jena查询DBpedia.在这里的教程(清单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();
Run Code Online (Sandbox Code Playgroud)

假设我想编写一个列出巴黎教堂的查询.在SPARQL中,它看起来像(取自此邮件列表消息):

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" )
 }
Run Code Online (Sandbox Code Playgroud)

这个查询在Java中如何看待?特别是,我对如何初始化模型对象感兴趣.

Eug*_*ica 16

浏览了大量的页面后,我找到了答案.也许我没有明确地提出这个问题,但无论如何,下面的代码对我有用.

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();
}
Run Code Online (Sandbox Code Playgroud)

我在dbpedia讨论的www.mail-archive.com页面上找到了这个答案.

  • 这个答案中的代码不太正确,并且包含一些微妙的错误.字符串连接如"SELECT DISTINCT?m?n?p?d"+"WHERE {"`导致"SELECT DISTINCT ...?dWHERE {`带有一个名为`dWHERE`的变量(这仍然是合法的,因为SPARQL中的`WHERE`是可选的;即`select?x {}`和`select?x WHERE {}`是相同的). (2认同)
  • 语言标签中需要转义,在"FILTER(lang(?n)="fr")"+`中.但最重要的是,语言标签应该与langMatches进行比较:`filter langMatches(lang(?n),'fr')`. (2认同)