2013-08-14 15 views
6

Sto cercando di estrarre le etichette da DBpedia per alcune persone. Ora ho parzialmente successo, ma mi sono bloccato nel seguente problema. Il seguente codice funziona.query sparql con parentesi tonde lanciare l'eccezione

public class DbPediaQueryExtractor { 
    public static void main(String [] args) { 
     String entity = "Aharon_Barak"; 
     String queryString ="PREFIX dbres: <http://dbpedia.org/resource/> SELECT * WHERE {dbres:"+ entity+ "<http://www.w3.org/2000/01/rdf-schema#label> ?o FILTER (langMatches(lang(?o),\"en\"))}"; 
     //String queryString="select *  where { ?instance <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person>; <http://www.w3.org/2000/01/rdf-schema#label> ?o FILTER (langMatches(lang(?o),\"en\")) } LIMIT 5000000"; 
     QueryExecution qexec = getResult(queryString); 
     try { 
      ResultSet results = qexec.execSelect(); 
      for (; results.hasNext();) 
      { 
       QuerySolution soln = results.nextSolution(); 
       System.out.print(soln.get("?o") + "\n"); 
      } 
     } 
     finally { 
      qexec.close(); 
     } 
    } 

    public static QueryExecution getResult(String queryString){ 
     Query query = QueryFactory.create(queryString); 
     //VirtuosoQueryExecution vqe = VirtuosoQueryExecutionFactory.create (sparql, graph); 
     QueryExecution qexec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", query); 
     return qexec; 
    } 
} 

Tuttavia, quando l'entità contiene parentesi, non funziona. Ad esempio,

String entity = "William_H._Miller_(writer)"; 

porta a questa eccezione:

Exception in thread "main" com.hp.hpl.jena.query.QueryParseException: Encountered " "(" "("" at line 1, column 86.`

Qual è il problema?

+0

puoi fornire il contenuto della riga 86? Inoltre sembra un errore di sintassi per me. – Framester

+0

Le parentesi tonde (o parentesi, nel mio dialetto locale) sono usate per circondare gli argomenti delle funzioni in SPARQL, ad esempio, in 'concat ('[',? X, ']')', quindi mi aspetterei che questa sia una sintassi errore. Probabilmente dovrai utilizzare l'intero URI, circondato da "<' and '>". –

risposta

6

Sono state necessarie alcune operazioni di copia e incolla per vedere cosa stava succedendo esattamente. Ti suggerirei di mettere i newline nella tua query per una leggibilità più semplice. La query che si sta utilizzando è:

PREFIX dbres: <http://dbpedia.org/resource/> 
SELECT * WHERE 
{ 
    dbres:??? <http://www.w3.org/2000/01/rdf-schema#label> ?o 
    FILTER (langMatches(lang(?o),"en")) 
} 

dove ??? che viene sostituito dal contenuto della stringa entity. . Si sta facendo assolutamente alcuna convalida dell'input qui per garantire che il valore di entity sarà legale per incollare in base alla tua domanda, suona come entity contiene William_H._Miller_(writer), in modo che stai ricevendo il query:

PREFIX dbres: <http://dbpedia.org/resource/> 
SELECT * WHERE 
{ 
    dbres:William_H._Miller_(writer) <http://www.w3.org/2000/01/rdf-schema#label> ?o 
    FILTER (langMatches(lang(?o),"en")) 
} 

È possibile incollare che nella public DBpedia endpoint, e si otterrà un simile messaggio di errore di analisi:

Virtuoso 37000 Error SP030: SPARQL compiler, line 6: syntax error at 'writer' before ')' 

SPARQL query: 
define sql:big-data-const 0 
#output-format:text/html 
define sql:signal-void-variables 1 define input:default-graph-uri <http://dbpedia.org> PREFIX dbres: <http://dbpedia.org/resource/> 
SELECT * WHERE 
{ 
    dbres:William_H._Miller_(writer) <http://www.w3.org/2000/01/rdf-schema#label> ?o 
    FILTER (langMatches(lang(?o),"en")) 
} 

Meglio di colpire endpoint di DBpedia con le query cattivi, si può anche utilizzare the SPARQL query validator, che riporta per quella query:

Syntax error: Lexical error at line 4, column 34. Encountered: ")" (41), after : "writer"

In Jena, è possibile utilizzare ParameterizedSparqlString per evitare questo tipo di problemi. Ecco il tuo esempio, rielaborato ad utilizzare una stringa con parametri:

import com.hp.hpl.jena.query.ParameterizedSparqlString; 

public class PSSExample { 
    public static void main(String[] args) { 
     // Create a parameterized SPARQL string for the particular query, and add the 
     // dbres prefix to it, for later use. 
     final ParameterizedSparqlString queryString = new ParameterizedSparqlString(
       "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n" + 
       "SELECT * WHERE\n" + 
       "{\n" + 
       " ?entity rdfs:label ?o\n" + 
       " FILTER (langMatches(lang(?o),\"en\"))\n" + 
       "}\n" 
       ) {{ 
      setNsPrefix("dbres", "http://dbpedia.org/resource/"); 
     }}; 

     // Entity is the same. 
     final String entity = "William_H._Miller_(writer)"; 

     // Now retrieve the URI for dbres, concatentate it with entity, and use 
     // it as the value of ?entity in the query. 
     queryString.setIri("?entity", queryString.getNsPrefixURI("dbres")+entity); 

     // Show the query. 
     System.out.println(queryString.toString()); 
    } 
} 

L'output è:

PREFIX dbres: <http://dbpedia.org/resource/> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT * WHERE 
{ 
    <http://dbpedia.org/resource/William_H._Miller_(writer)> rdfs:label ?o 
    FILTER (langMatches(lang(?o),"en")) 
} 

È possibile eseguire questa query a livello di endpoint pubblico e ottenere the expected results. Si noti che se si utilizza un entity che non ha bisogno fuga speciale, ad esempio,

final String entity = "George_Washington"; 

allora l'uscita query di utilizzare il modulo prefissato:

PREFIX dbres: <http://dbpedia.org/resource/> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
SELECT * WHERE 
{ 
    dbres:George_Washington rdfs:label ?o 
    FILTER (langMatches(lang(?o),"en")) 
} 

Questo è molto conveniente, perché si don' t deve fare qualsiasi verificando se il suffisso, ad es., entity, ha caratteri che devono essere sfuggiti; Jena si prende cura di questo per te.

+0

Grazie mille Joshua Taylor per aver dedicato del tempo e l'aiuto. Eseguo la query generata e ha funzionato.Tuttavia, l'esecuzione del codice genera un'altra eccezione: Eccezione nel thread "main" java.lang.NoClassDefFoundError: com/hp/hpl/jena/graph/NodeFactory \t in com.hp.hpl.jena.query.ParameterizedSparqlString.setIri (ParameterizedSparqlString .java: 720) \t a nl.cwi.kba2013.apps.PssExample.main (PssExample.java:26) \t a com.hp.hpl.jena.query.ParameterizedSparqlString.setIri (ParameterizedSparqlString.java:720) \t .... – gebremeskel

+0

@ use1967220 Se si riceve quell'errore che suggerisce un problema con il percorso classe (probabilmente più versioni di ARQ sul percorso classe). Quale versione (o versioni) di ARQ (e di qualsiasi altra libreria di Jena) stai usando? – RobV

+0

@RobV, grazie mille. Questo era effettivamente il problema – gebremeskel

Problemi correlati