如何在java中将Sparql端点写入DBpedia

时间:2014-09-14 16:50:05

标签: java sparql jena dbpedia

下面是用于获取处于联合状态的场所的sparql查询,当我在virtuoaso SPARQL上运行此代码时,我得到了所需的输出。但是当我在java中编写这段代码时,它没有给出输出。

  select (str(?label) as ?strLabel) where {  
    ?place a dbpedia-owl:PopulatedPlace ;
     dbpedia-owl:country dbpedia:United_States ;
     rdfs:label ?label
 filter langMatches( lang(?label), 'en' )`
 }
 limit 100

据我所知,我写了它,但没有给出任何结果。

   public class TestDbpedia {
    public static void main(String[] args) {

        String sparqlQueryString = " select (str(?label) as ?strLabel) "+
                            "where {"+
                            "?place a dbpedia-owl:PopulatedPlace ;"+
                            "dbpedia-owl:country dbpedia:United_States ;"+
                            "rdfs:label ?label"+                                
                            "filter langMatches( lang(?label), 'en' )"+
                            "limit 10"+
                            "}";

                    Query query = QueryFactory.create(sparqlQueryString);

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


                    try {
                        ResultSet results = qexec.execSelect();
                        for ( ; results.hasNext() ; )
                    {
                        QuerySolution soln = results.nextSolution() ;                           
                        System.out.println(soln.get("?strLabel"));                               
                    }
                    }
                    catch(Exception e){

                        e.printStackTrace();
                    }    

                    finally { qexec.close(); }

                    }
}

1 个答案:

答案 0 :(得分:3)

您需要声明前缀

首先,您需要在SPARQL查询中包含必要的前缀。也就是说,你需要写

prefix dbpedia-owl: <http://dbpedia.org/ontology/>

以及查询开头的其余部分。根据我所知,预定义的前缀仅应用于使用基于浏览器的Web界面进行的查询。

您需要使用一些空格或换行符

当您从字符串构造查询时,您需要非常小心新行和空格等。例如,Java行

"rdfs:label ?label"+                                
"filter langMatches( lang(?label), 'en' )"+

最终为您提供包含

的查询字符串
rdfs:label ?labelfilter langMatches( lang(?label), 'en' )

您的查询结果无效。在字符串中添加一些空格或换行符。

您需要编写正确的查询

您的查询未正确结束

"filter langMatches( lang(?label), 'en' )"+
"limit 10"+
"}";

会给你(一旦你添加一些换行符和空格):

  filter …
  limit 10
}

这不是正确的语法。你需要

  filter …
}
limit 10

如果没有收到有用的错误消息,请打印并检查您的查询

我很惊讶DBpedia没有给你一个更有用的错误信息(或者它确实没有;你毕竟没有向我们展示堆栈跟踪)。您也可以在sparql.org's query validator测试您的查询。此外,如果您使用Jena的ParameterizedSparqlStrings之一,您可以预先解析查询,这应该已经捕获了语法错误。