[英]I'm using Jena to launch a SPARQL query. The query works in DBpedia SPARQL endpoint! I verified the query at query validator and got the same error
我需要基于通用属性找到与eglagaan电影相似的电影。我尝试了下面的代码,但是尽管在sparql端点中查询正常,但我使用jena时却遇到了以下异常。
在sparql端点中的输出:
similar movies similarity score
http://dbpedia.org/resource/Lagaan 177
http://dbpedia.org/resource/Jodhaa_Akbar 44
http://dbpedia.org/resource/Jaane_Tu..._Ya_Jaane_Na 42
http://dbpedia.org/resource/Swades 42
http://dbpedia.org/resource/Rangeela_(film) 40
http://dbpedia.org/resource/Dil_Ne_Jise_Apna_Kahaa 38
http://dbpedia.org/resource/Love_You_Hamesha 37
http://dbpedia.org/resource/Sholay 37
http://dbpedia.org/resource/Kannathil_Muthamittal 36
http://dbpedia.org/resource/Andaaz 36
http://dbpedia.org/resource/Jaan-E-Mann 36
http://dbpedia.org/resource/Sarfarosh 36
http://dbpedia.org/resource/Saathiya_(film) 36
http://dbpedia.org/resource/Sillunu_Oru_Kaadhal 36
http://dbpedia.org/resource/Doli_Saja_Ke_Rakhna 36
http://dbpedia.org/resource/Dil_Se.. 36
http://dbpedia.org/resource/Rang_De_Basanti 36
http://dbpedia.org/resource/Lage_Raho_Munna_Bhai 36
http://dbpedia.org/resource/Ishq_Vishk 36
对于我尝试过的其他任何查询,我都遇到相同的异常错误,尽管该查询在sparql端点和查询验证器中运行良好。 我尝试了使用Jena在下面的链接SPARQL解析错误中给出的解决方案,但DBpedia接受了查询但对我不起作用。
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
public class Dbpedia {
public static void main(String[] args) {
// TODO Auto-generated method stub
String service="http://dbpedia.org/sparql";
String query= " PREFIX dbpedia: <http://dbpedia.org/resource/> "
+ "PREFIX dbpedia-owl: <http://dbpedia.org/ontology/> "
+ "select ?similar (count(?p) as ?similarity) "
+ "where { values ?movie { dbpedia:Lagaan }"
+ " ?similar ?p ?o ; a dbpedia-owl:Film . "
+ "?movie ?p ?o .} group by "
+ "?similar ?movie having count(?p) > 35 order by desc(?similarity)";
QueryExecution e=QueryExecutionFactory.sparqlService(service, query);
ResultSet rs=e.execSelect();
while (rs.hasNext()) {
QuerySolution qs=rs.nextSolution();
System.out.println(qs);
}
}
}
错误:
Exception in thread "main" com.hp.hpl.jena.query.QueryParseException: Encountered " ">" "> "" at line 1, column 350.
Was expecting one of:
<EOF>
<IRIref> ...
<PNAME_NS> ...
<PNAME_LN> ...
"limit" ...
"offset" ...
"order" ...
"values" ...
"exists" ...
"not" ...
"count" ...
"min" ...
"max" ...
"sum" ...
"avg" ...
"sample" ...
"group_concat" ...
"bound" ...
"coalesce" ...
"if" ...
"bnode" ...
"iri" ...
"uri" ...
"str" ...
"strlang" ...
"strdt" ...
"datatype" ...
"lang" ...
"langmatches" ...
"isURI" ...
"isIRI" ...
"isBlank" ...
"isLiteral" ...
"isNumeric" ...
"regex" ...
"sameTerm" ...
"RAND" ...
"ABS" ...
"CEIL" ...
"FLOOR" ...
"ROUND" ...
"CONCAT" ...
"SUBSTR" ...
"STRLEN" ...
"REPLACE" ...
"UCASE" ...
"LCASE" ...
"ENCODE_FOR_URI" ...
"CONTAINS" ...
"STRSTARTS" ...
"STRENDS" ...
"STRBEFORE" ...
"STRAFTER" ...
"YEAR" ...
"MONTH" ...
"DAY" ...
"HOURS" ...
"MINUTES" ...
"SECONDS" ...
"TIMEZONE" ...
"TZ" ...
"NOW" ...
"UUID" ...
"STRUUID" ...
"MD5" ...
"SHA1" ...
"SHA256" ...
"SHA384" ...
"SHA512" ...
"(" ...
at com.hp.hpl.jena.sparql.lang.ParserSPARQL11.perform(ParserSPARQL11.java:102)
at com.hp.hpl.jena.sparql.lang.ParserSPARQL11.parse$(ParserSPARQL11.java:53)
at com.hp.hpl.jena.sparql.lang.SPARQLParser.parse(SPARQLParser.java:37)
at com.hp.hpl.jena.query.QueryFactory.parse(QueryFactory.java:148)
at com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:80)
at com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:53)
at com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:41)
at com.hp.hpl.jena.query.QueryExecutionFactory.sparqlService(QueryExecutionFactory.java:311)
at com.hp.hpl.jena.query.QueryExecutionFactory.sparqlService(QueryExecutionFactory.java:298)
at com.wiki.Dbpedia.main(Dbpedia.java:22)
我尝试删除由查询验证器验证的group by子句,并在sparql端点提供一些输出,但是当我在eclipse中运行它时再次出现相同的异常
" PREFIX dbpedia-owl: <http://dbpedia.org/ontology/> " +
" PREFIX dbpedia: <http://dbpedia.org/resource/> " +
" SELECT ?similar " +
" WHERE " +
" { VALUES ?movie { dbpedia:Lagaan } " +
" ?similar ?p ?o ."+
" ?similar <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> dbpedia-owl:Film ." +
" ?movie ?p ?o " +
" } ";
更改:当我在@AndyS所说的添加()时,查询验证器返回以下查询输出
1 PREFIX dbpedia-owl: <http://dbpedia.org/ontology/>
2 PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
3
4 SELECT ?similar (count(?p) AS ?similarity)
5 WHERE
6 { VALUES ?movie { <http://dbpedia.org/resource/Lagaan> }
7 ?similar ?p ?o .
8 ?similar rdf:type dbpedia-owl:Film .
9 ?movie ?p ?o
10 }
11 GROUP BY ?similar ?movie
12 HAVING ( count(?p) > 35 )
13 ORDER BY DESC(?similarity)
我在eclipse中将查询更改为以下内容,但再次出现相同的错误。
String query= "PREFIX dbpedia-owl: <http://dbpedia.org/ontology/>"+
"PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>"+
"SELECT ?similar (count(?p) AS ?similarity)" +
"WHERE" +
"{ VALUES ?movie { <http://dbpedia.org/resource/Lagaan> }"+
"?similar ?p ?o ."+
"?similar rdf:type dbpedia-owl:Film ."+
"?movie ?p ?o"+
"}"+
"GROUP BY ?similar ?movie"+
"HAVING ( count(?p) > 35 )"+
"ORDER BY DESC(?similarity)";
更正的查询:
String query="PREFIX dbpprop: <http://dbpedia.org/property/> "
+ " PREFIX dbpedia: <http://dbpedia.org/resource/> "
+ "PREFIX dbpedia-owl: <http://dbpedia.org/ontology/> "
+ "select ?similar (count(?p) as ?similarity) "
+ "where { values ?movie { <http://dbpedia.org/resource/Lagaan> }"
+ " ?similar ?p ?o ; a dbpedia-owl:Film . "
+ "?movie ?p ?o .} group by "
+ "?similar ?movie having(count(?p) > 35) order by desc(?similarity)";
新查询以查找具有电影名称的电影链接:
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix dbpedia-owl: <http://dbpedia.org/ontology/>
SELECT *WHERE
{
{
select distinct ?film where {
?film a dbpedia-owl:Film .
?film rdfs:label ?label .
filter regex( str(?label), "Lagaan", "i")
}
limit 10
}
现在如何将此查询的输出传递给相似性查询?
修改后的查询使用wikiredirects处理@Joshau Taylor建议的拼写错误的电影名称:
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
SELECT ?s ?other (count(*) AS ?similarity)
WHERE
{
{
SELECT ?s WHERE {
{ ?s rdfs:label "Veer zara"@en .
?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> owl:Thing
}
UNION
{ ?altName rdfs:label "Veer zara"@en .
?altName dbo:wikiPageRedirects ?s
}
}
}
?s ?p ?o .
?other <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> dbo:Film .
?other ?p ?o
}
GROUP BY ?s ?other
HAVING ( count(?p) > 25 )
ORDER BY DESC(?similarity)
看来此评论已解决。 这是为访问者而设的社区Wiki答案(以防删除评论):
- 在查询中放入一些换行符,然后查看解析器确切指向的位置。 它将是解析错误开始的地方。
having (count(?p) > 35)
合法SPARQL 1.1的HAVING子句需要(having (count(?p) > 35)
。 –安迪斯{ dbpedia:Lagaan }
也不正确–昨天{ dbpedia:Lagaan }
- 我明白了。它在前缀的尖括号后面需要一个空格。 –库尔苏姆·法蒂玛(Kulsum Fatima)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.