带圆括号的sparql查询引发异常

带圆括号的sparql查询引发异常,sparql,jena,dbpedia,Sparql,Jena,Dbpedia,我试图从DBpedia中为一些人提取标签。我现在取得了部分成功,但我陷入了以下问题。下面的代码可以工作 公共类DbPediaQueryExtractor{ 公共静态void main(字符串[]args){ 字符串实体=“Aharon_Barak”; String queryString=“前缀dbres:SELECT*其中{dbres:“+entity+”?o过滤器(langMatches(lang(?o),\“en\”))); //String queryString=“select*whe

我试图从DBpedia中为一些人提取标签。我现在取得了部分成功,但我陷入了以下问题。下面的代码可以工作

公共类DbPediaQueryExtractor{
公共静态void main(字符串[]args){
字符串实体=“Aharon_Barak”;
String queryString=“前缀dbres:SELECT*其中{dbres:“+entity+”?o过滤器(langMatches(lang(?o),\“en\”)));
//String queryString=“select*where{?instance;?o FILTER(langMatches(lang(?o),\“en\”)LIMIT 5000000”;
QueryExecution qexec=getResult(queryString);
试一试{
ResultSet results=qexec.execSelect();
对于(;results.hasNext();)
{
QuerySolution soln=results.nextSolution();
系统输出打印(soln.get(“?o”)+“\n”);
}
}
最后{
qexec.close();
}
}
公共静态查询执行getResult(字符串查询字符串){
Query=QueryFactory.create(queryString);
//VirtuosoQueryExecution vqe=VirtuosoQueryExecutionFactory.create(sparql,图形);
QueryExecution qexec=QueryExecutionFactory.sparqlService(“http://dbpedia.org/sparql“,查询);
返回qexec;
}
}
但是,当实体包含括号时,它不起作用。比如说,

String entity = "William_H._Miller_(writer)";
导致这种例外情况:

线程“main”com.hp.hpl.jena.query.QueryParseException中出现异常:在第1行第86列遇到“”`


问题出在哪里?

需要进行一些复制和粘贴才能查看到底发生了什么。我建议您在查询中添加换行符,以便于阅读。您使用的查询是:

PREFIX dbres: <http://dbpedia.org/resource/>
SELECT * WHERE
{
  dbres:??? <http://www.w3.org/2000/01/rdf-schema#label> ?o 
  FILTER (langMatches(lang(?o),"en"))
}
您可以将其粘贴到中,您将得到类似的解析错误消息:

Virtuoso 37000 Error SP030: SPARQL compiler, line 6: syntax error at 'writer' before ')'

SPARQL query:
define sql:big-data-const 0 
#output-format:text/html
define sql:signal-void-variables 1 define input:default-graph-uri <http://dbpedia.org> PREFIX dbres: <http://dbpedia.org/resource/>
SELECT * WHERE
{
  dbres:William_H._Miller_(writer) <http://www.w3.org/2000/01/rdf-schema#label> ?o 
  FILTER (langMatches(lang(?o),"en"))
}
然后查询输出将使用前缀形式:

PREFIX dbres: <http://dbpedia.org/resource/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT * WHERE
{
  dbres:George_Washington rdfs:label ?o
  FILTER (langMatches(lang(?o),"en"))
}
前缀dbres: 前缀rdfs: 选择*WHERE { dbres:George_Washington rdfs:label?o 过滤器(langMatches(lang(?o),“en”)) }
这非常方便,因为您不必检查后缀,即
实体
,是否有任何需要转义的字符;Jena会为您处理这些字符。

您能给出第86行的内容吗?对我来说,这看起来有点像语法错误。圆括号(或括号,在我的当地方言中)用于包围SPARQL中的函数参数,例如,在
concat(“[”,?x,”])中
,因此我认为这是一个语法错误。您可能需要使用URI的完整形式,周围是
。非常感谢Joshua Taylor花时间提供帮助。我运行生成的查询,结果很好。但是,运行代码会引发另一个异常:线程“main”java.lang.NoClassDefFoundError中的异常:com/hp/hpl/jena/graph/NodeFactory位于com.hp.hpl.jena.query.ParameterizedSparqlString.setIri(ParameterizedSparqlString.java:720)位于nl.cwi.kba2013.apps.PssExample.main(PssExample.java:26)位于com.hp.hpl.jena.query.ParameterizedSparqlString.setIri(ParameterizedSparqlString.java:720)....@use1967220如果您得到提示类路径问题的错误(可能在您的类路径上有多个版本的ARQ)。您使用的是什么版本的ARQ(以及任何其他Jena库?@RobV,非常感谢。这确实是problem@Joshua_Taylor“预期结果”超链接正在生成一个error@Kristian有趣的是,它是从DBpedia搜索结果中复制和粘贴的,但是中间有一些东西被打断了。我修复了链接(通过链接到一个等效但稍加修改的查询的结果)。
PREFIX dbres: <http://dbpedia.org/resource/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT * WHERE
{
  <http://dbpedia.org/resource/William_H._Miller_(writer)> rdfs:label ?o
  FILTER (langMatches(lang(?o),"en"))
}
PREFIX dbres: <http://dbpedia.org/resource/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT * WHERE
{
  dbres:George_Washington rdfs:label ?o
  FILTER (langMatches(lang(?o),"en"))
}