错误的SPARQL查询 - 使用Java

时间:2015-06-03 20:09:24

标签: java sparql jena

我正在努力使这个非常有趣的查询指向DBpedia.org 我是Java新手,这个SPARQL是我朝​​这个方向迈出的第一步。

我已经想出了类似这样的代码。它从我可以找到googleing的内容进行了修改; 从源代码我可以从单个查询中获取摘要。现在,我希望获得您在查询字符串中可以看到的所有属性,以及更多内容。

有人可以帮我解决这个问题吗?我被卡住了。谢谢!

String service = "PREFIX rdfs: http://dbpedia.org/page/Texas_Longhorn";
String query = "SELECT * WHERE {"
        + " rdfs:name ?name ;"
        + " rdfs:label ?label ;"
        + " rdfs:abstract ?abstract ."
        + "}";

QueryExecution qe = QueryExecutionFactory.sparqlService(service, query);
try {
    ResultSet results = qe.execSelect();

    for (; results.hasNext();) {

        QuerySolution sol = (QuerySolution) results.next();

        System.out.println(sol.get("?name"));
        System.out.println(sol.get("?label"));            
        System.out.println(sol.get("?abstract"));


    }
}catch(Exception e){

    e.printStackTrace();
}
finally {
   qe.close();
}

2 个答案:

答案 0 :(得分:3)

您的SPARQL查询完全错误。当你有SPARQL时,你会寻找三元组,如果你看第一行,你只能看到两个元素。然后,在dbpedia中没有rdfs:namerdfs:abstract这样的东西。 rdfs是预定义的命名空间,您最好保留它以帮助您处理标签。您有dbpedia-owl:abstractfoaf:name。所以你的查询必须是:

prefix dbpedia-owl: <http://dbpedia.org/ontology/>
prefix foaf: <http://xmlns.com/foaf/0.1/>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT * WHERE {
     ?x foaf:name ?name ;
     rdfs:label ?label ;
     dbpedia-owl:abstract ?abstract .
    }

但是,在这种情况下,?name?label会产生相同的变量。所以我会将您的查询编辑为:

prefix dbpedia-owl: <http://dbpedia.org/ontology/>
prefix foaf: <http://xmlns.com/foaf/0.1/>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT * WHERE {
     ?x rdfs:label ?label ;
     dbpedia-owl:abstract ?abstract .
    }

答案 1 :(得分:3)

除了进行@Artemis建议的更改外,您还需要将Theta(n^2)字符串更改为dbpedia的端点:

service

QueryExecutionFactory.sparqlService接受表示SPARQL端点(服务)的String参数,以及定义为Jena Query或String的查询。