SPARQL 查询 returns 空

SPARQL query returns null

基于使用 SPARQL 和 DBPedia,我想检索有关位于巴黎的所有教堂的信息。 如果我 运行 下面的代码,它 returns null。我不知道哪里出了问题,因为没有错误信息。

package com.tests.example;

import org.apache.jena.query.Query;
import org.apache.jena.query.QueryExecution;
import org.apache.jena.query.QueryExecutionFactory;
import org.apache.jena.query.QueryFactory;
import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.ResultSet;
import org.apache.jena.rdf.model.RDFNode;

public class JenaTestDBPedia {

    public static void main(String[] args) {

        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" +
                " }";

        Query query = QueryFactory.create(queryString);

        QueryExecution qexec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", query); 

        try {
            ResultSet results = qexec.execSelect();
            while(results.hasNext()) {
                 QuerySolution qs = results.next();
                 RDFNode type = qs.get("label");
                 System.out.println(type.toString());
            }
        }
        finally {
           qexec.close();
        }

    }

}

更新: 更正查询(尽管它不起作用):

"SELECT DISTINCT ?m ?n ?p ?d \n" +
                "WHERE { \n" +
                " ?m rdfs:label ?n." +
                " ?m skos:subject ?c." +
                " ?c skos:broader category:Churches_in_Paris." +
                " ?m p:abstract ?d." +
                " ?m geo:point ?p" +
                " }";
qs.get("label");

您没有 select 一个名为 label 的变量。对于 rdfs:label 的值,您使用了 属性 ?n。您需要使用 qs.get("n").

此外,请注意您的字符串连接有一些意想不到的效果,例如 "select ... ?dWHERE { ...",并且您的查询没有使用名为 dWHERE 的变量。

我将专注于查询,而不是其余代码:

  • 没有skos:subject,需要dct:subject
  • 而不是 p:abstract,您需要 dbo:abstract

更正后的查询:

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/>
PREFIX dct: <http://purl.org/dc/terms/>
PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT DISTINCT ?m ?n ?p ?d WHERE {
 ?m rdfs:label ?n.
 ?m dct:subject ?c.
 ?c skos:broader category:Churches_in_Paris.
 ?m dbo:abstract ?d.
 ?m geo:point ?p
 }

其他几点:

  • 考虑将摘要和标签过滤为您感兴趣的语言(可能是英语)
  • 考虑制作 geo:point OPTIONAL,因为并非所有结果都有
  • 考虑父类别的子类别,而不仅仅是子类别
  • 考虑使用比看似随机的单个字母更具描述性的变量名