我使用Jena启动SPARQL查询。该查询适用于DBpedia SPARQL端点!我在查询验证器验证了查询并得到了同样的错误

时间:2015-01-18 12:22:11

标签: java eclipse sparql jena dbpedia

我需要根据常见属性找到与eglagaan类似的电影。我尝试了下面的代码,但是当我使用jena时我得到以下异常,尽管查询在sparql端点工作正常。

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端点和查询验证器中正常工作。我尝试了以下链接SPARQL parse error with Jena, but DBpedia accepts the query中给出的解决方案,但对我来说不起作用。

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);
        }
    }

}

ERROR:

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)

1 个答案:

答案 0 :(得分:1)

在评论中看起来已经解决了这个问题。这是社区wiki的答案,以便访问者(如果评论被删除):

  
      
  • 在查询中添加一些换行符,并查看解析器引用的确切位置。它将是解析错误开始的地方。 HAVING子句需要   ()适用于合法的SPARQL 1.1 having (count(?p) > 35)。 - 安迪斯
  •   
  • { dbpedia:Lagaan }也不对 - 昨天AndyS
  •   
  • 我知道了。前缀中的尖括号后面需要一个空格。 - Kulsum Fatima
  •