使用Jena API在SPARQL中绑定函数

时间:2015-11-22 22:46:33

标签: android sparql jena

我使用jena for android向DBpedia发送查询。这是我的问题:

    protected Vector<List> doInBackground(String... keyword) {
                VecDBpedia=new Vector();
                vecurl= new ArrayList();
                 int i=0;
                 ResultSet results,re = null ;
                 QueryExecution exec = null ;
    try{           
              do{
               if(i!=VectorKeyWords.size())
                 {System.out.println(keyword[i]);
                String sparqlQuery=

                        "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n" +
                            "PREFIX dbo:     <http://dbpedia.org/ontology/>\n" +
                            "PREFIX rdfs:   <http://www.w3.org/2000/01/rdf-schema#> \n" +
                            "prefix foaf: <http://xmlns.com/foaf/0.1/> \n"+
                            "PREFIX dbpprop: <http://dbpedia.org/property/>\n"+


                            "select distinct ?nbr ?Nom ?resource ?url where {\n" +
                            "?resource rdfs:label ?Nom.\n" +
                                "?resource foaf:isPrimaryTopicOf ?url.\n" +
                                 "?resource dbo:abstract ?resume.\n"+
                                "FILTER  langMatches( lang(?Nom), \"EN\") .\n" +
                                "FILTER langMatches( lang(?resume), \"EN\" )\n"+
                                "?Nom <bif:contains> \"Apple\".\n"+
                                "bind(strlen(replace(replace(Lcase(?resume), \"jobs\", \"_\"),\"[^_]\", \"\")) as ?nbr )\n"+
                                "filter (?nbr >= 1)\n"+
                                "}" ;

            String service=  "http://dbpedia.org/sparql";

            Query qur=QueryFactory.create(sparqlQuery,Syntax.syntaxARQ);
            System.out.print("sparqlQuery"+sparqlQuery);

             exec =QueryExecutionFactory.sparqlService(service,qur );
             System.out.print("qur"+qur);
              re =exec.execSelect();
              System.out.print("re"+re);

            i++;
            System.out.println(re.hasNext());}  

              } while(re.hasNext()==false && i<VectorKeyWords.size());
          if(i==VectorKeyWords.size())  //si aucun des mot clé ne se trouve dans DBpedia
     { System.out.println("Aucun mot clé ne correspond à une entrée en DBpedia");
     cancel(true);// A vérifier
     finish();}


     results = ResultSetFactory.copyResults( re );
     ResultSetFormatter.out( results );
     while ( results.hasNext() ) {
                ArrayList<String>   listDBpediaResource=new ArrayList();
                QuerySolution node=  results.next();

                RDFNode colonne1=node.get( "Nom" );
                RDFNode colonne2=node.get( "resource" );
                RDFNode colonne3=node.get( "url" );

                // RDFNode s2= results.next().get( "url" );
                 listDBpediaResource.add(colonne2.toString());
                 listDBpediaResource.add(colonne3.toString());
                 listDBpediaResource.add(colonne1.toString());

                 VecDBpedia.add(listDBpediaResource);
                 vecurl.add(colonne3.toString());//creer un vecteur contenant les url de chaque ressource condidat de dbpedia

                }


            }  catch (Exception  e) {
                 e.printStackTrace();
            }
            finally{exec.close();}

            return VecDBpedia;
        }
         ;

此查询适用于SPARQL端点,也适用于java应用程序,但在Android应用程序中无效。

我在执行代码时收到此消息:

W/System.err(8123): com.hp.hpl.jena.query.QueryParseException: Lexical error at line 13, column 5.  Encountered: "(" (40), after : "bind"
W/System.err(8123):     at com.hp.hpl.jena.sparql.lang.ParserARQ.perform(ParserARQ.java:95)
W/System.err(8123):at com.hp.hpl.jena.sparql.lang.ParserARQ.parse(ParserARQ.java:39)
W/System.err(8123):     at com.hp.hpl.jena.query.QueryFactory.parse(QueryFactory.java:129)
W/System.err(8123):     at com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:72)
W/System.err(8123):     at com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:43)
W/System.err(8123):     at com.example.testtvprg.MainActivity$AsyncDBpedia.doInBackground(MainActivity.java:426)
W/System.err(8123):     at com.example.testtvprg.MainActivity$AsyncDBpedia.doInBackground(MainActivity.java:1)
W/System.err(8123):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
W/System.err(8123):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
W/System.err(8123):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
 W/System.err(8123):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
W/System.err(8123):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
W/System.err(8123):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
W/System.err(8123):     at java.lang.Thread.run(Thread.java:856)

我认为这是jena或arq版本的问题,但我不知道如何纠正它。 任何人都可以帮助我。 感谢

1 个答案:

答案 0 :(得分:0)

想想所有想帮助我的人。我最终决定更改查询的BIND函数,因为它不能与QueryEeineHttp一起使用QueryExecutionFactory.sparqlService。这是一个临时解决方案,因为我可能需要其他具有相同问题的功能。如果有人知道解决方案,我将不胜感激。