我使用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版本的问题,但我不知道如何纠正它。 任何人都可以帮助我。 感谢
答案 0 :(得分:0)
想想所有想帮助我的人。我最终决定更改查询的BIND函数,因为它不能与QueryEeineHttp一起使用QueryExecutionFactory.sparqlService。这是一个临时解决方案,因为我可能需要其他具有相同问题的功能。如果有人知道解决方案,我将不胜感激。