如何用java将Sparql端点写入DBpedia



下面是用于获取美国位置的sparql查询,当我在virtualoaso 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(); }
                    }
}

您需要声明前缀

首先,您需要在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的查询验证器上测试您的查询。此外,如果您使用了Jena的ParameterizedSparqlStrings之一,那么您可能已经预先解析了查询,这应该会发现语法错误。

最新更新