简体   繁体   中英

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

I need to find movies which are similar to movie for eglagaan based on the common properties.I tried the code below but i am getting the below Exception when i use jena though the query works fine in sparql endpoint.

Output in sparql endpoint:

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

For any other query which i tried im getting the same exception error though that query is working fine in sparql endpoint and Query validator. I tried the solution given in the below link SPARQL parse error with Jena, but DBpedia accepts the query but is doesnt work for me.

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)

I tried removing the group by clause which is validated by query validator and gives some output at sparql endpoint but again same exception when i run it in 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 " +
              " } ";

CHANGES:` query validator returns the following query output when i added () to having as said by @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)

I changed query to following in eclipse but again the same error.

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

Corrected Query:

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

new query to find movie link with movie name:

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
   }

now how to pass the output of this query to the similarity query?

Modified query using wikiredirects to handle mispelled movie names as suggested by @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)

It looks like this got resolved in the comments. Here's a community wiki answer for the sake of visitors (in case the comments get deleted):

  • Put some newlines in the query and see exactly where parser referes to. It will be the place the parse error starts. HAVING clause needs () for legal SPARQL 1.1 having (count(?p) > 35) . – AndyS
  • { dbpedia:Lagaan } isn't right either – AndyS yesterday
  • i got it.It needed a space after the angular bracket in the prefix. – Kulsum Fatima

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM