使用VALUES使用Sparql查询DBpedia

时间:2014-09-24 00:34:31

标签: java rdf sparql jena dbpedia

当我在java中运行此代码时出现错误,我认为错误是由于"字符串值"而发生的。我不确定要添加它,但我从上一个问题的答案中得到了这个想法,我在这个网站上提到了Query DBpedia to get abstract for different inputs

    public static void DbpediaResultSparql() { 
    String values = "New York";
    String service = "http://dbpedia.org/sparql";

    String sparqlQueryString2 = "PREFIX  rdfs: <http://www.w3.org/2000/01/rdf-schema#>"+
           "PREFIX  dbpedia-owl: <http://dbpedia.org/ontology/>"+
           "PREFIX  dbpedia: <http://dbpedia.org/resource/>"+

               "SELECT DISTINCT  ?abstract"+
               "WHERE"+
                 "{ _:b0 rdfs:label ?name ."+
                   "_:b0 dbpedia-owl:abstract ?abstract"+
                   "FILTER langMatches(lang(?abstract), 'en')"+
                  "?name { " + values +" @en }"+
                "}" ;                 

    Query query = QueryFactory.create(sparqlQueryString2);
    ARQ.getContext().setTrue(ARQ.useSAX);
    // Executing SPARQL Query and pointing to the DBpedia SPARQL Endpoint
    QueryExecution qexec = QueryExecutionFactory.sparqlService(
            "http://DBpedia.org/sparql", query);
    // Retrieving the SPARQL Query results
    ResultSet results = qexec.execSelect();
    // Iterating over the SPARQL Query results
    while (results.hasNext()) {
        QuerySolution soln = results.nextSolution();
        // Printing DBpedia entries' abstract.
        System.out.println(soln.get("?abstract"));
    }
    qexec.close();
 }

1 个答案:

答案 0 :(得分:2)

您无法通过

等代码获得有用的答案
"SELECT DISTINCT  ?abstract"+ "WHERE"

"_:b0 dbpedia-owl:abstract ?abstract"+ "FILTER langMatches(lang(?abstract), 'en')"

因为它变成了

SELECT DISTINCT ?abstractWHERE

_:b0 dbpedia-owl:abstract ?abstractFILTER

并且您不希望变量名为?abstractWHERE?abstractFILTER

这没有任何意义:

String values = "New York";
"?name { " + values +" @en }"

你最终会

?name { New York@en }

我希望你想要的是

values ?name { "New York"@en }

我建议您查看ParameterizedSparqlStrings,并确保在代码中添加终止换行符或至少空格。如果您刚刚打印出查询,可以将其放入sparql.org的查询验证程序中,并且您已经立即看到了问题。

您可以像这样编写查询:

select distinct ?abstract where {
  values ?name { "New York"@en }
  [ rdfs:label ?name ;
    dbpedia-owl:abstract ?abstract ]
  filter langMatches(lang(?abstract),'en')
}

SPARQL Results

如果您只有?name的一个值,并且您没有选择该变量,则可以在查询中将其写入:

select distinct ?abstract where {
  [ rdfs:label "New York"@en ;
    dbpedia-owl:abstract ?abstract ]
  filter langMatches(lang(?abstract),'en')
}