2013-08-12 30 views
5

sto cercando di interrogare un repository utilizzando SPARQL e Sesamo 2.7, ma quando eseguo il mio codice che ho il seguente errorequery SPARQL RDF usando/Sesame

org.openrdf.http.client.SesameHTTPClient - Server reports problem: org.openrdf.query.parser.sparql.ast.VisitorException: QName 'viagem:nome' uses an undefined prefix 

Il problema è che, ho il prefisso " viagem" nella scheda namespace per quel repository su openrdf-banco di lavoro, anche quando uso il metodo getNamespaces() si presenta ...

l'unico modo ho la query da eseguire è quello di aggiungere il prefisso manualmente su ogni query, ma sembra sbagliato ...

C'è qualcosa che mi manca su come usarlo correttamente?

--- A cura con più informazioni

codice non funziona: il lavoro

String queryString = "SELECT ?name \n" + 
"WHERE {?Aeroporto viagem:nome ?name.\n" + 
"?Aeroporto rdf:type viagem:Aeroporto}"; 
     TupleQuery tupleQuery = con.prepareTupleQuery(QueryLanguage.SPARQL, queryString); 
     TupleQueryResult result = tupleQuery.evaluate(); 
     try { 
      List<String> bindingNames = result.getBindingNames(); 
      while (result.hasNext()) { 
       BindingSet bindingSet = result.next(); 
       Value firstValue = bindingSet.getValue(bindingNames.get(0)); 
       System.out.println(firstValue); 
     } 
     } finally { 
      result.close(); 

     } 
... 

Questo codice se cambio queryString

String queryString = "PREFIX viagem:<http://teste.com.br/tut/Viagem.owl#> SELECT ?name \n" + 
"WHERE {?Aeroporto viagem:nome ?name.\n" + 
"?Aeroporto rdf:type viagem:Aeroporto}"; 

non ero sicuro se devo aggiungere il PREFISSO per ogni query che eseguirò (se è normale, va bene ...)

Anche se corro il seguente codice ottengo il prefisso e il nome correttamente

RepositoryResult<Namespace> listaNamespace = meuRepositorio.getConnection().getNamespaces(); 

    while(listaNamespace.hasNext()){ 
     Namespace atual = listaNamespace.next(); 
     System.out.println("Name " + atual.getName() + " Prefix " + atual.getPrefix()); 
    } 

l'output è:

Name http://www.w3.org/2000/01/rdf-schema# Prefix rdfs 
Name http://www.w3.org/2003/11/swrl# Prefix swrl 
... 
Name http://www.w3.org/1999/02/22-rdf-syntax-ns# Prefix rdf 
Name http://teste.com.br/tut/Viagem.owl# Prefix viagem 
+0

Qual è il tuo codice? Qual è la domanda? Non c'è abbastanza qui per diagnosticare qualcosa ancora. Cosa intendi con "ho il prefisso" viagem "sotto la scheda Namespace per quel repository"? È per un'interfaccia SPARQL basata sul web? Gli spazi dei nomi disponibili potrebbero non essere definiti per le query eseguite nel codice. –

+0

Per quel che vale, è in genere una buona idea per definire tutti i prefissi che si utilizza, e non dipendere dal server di fare qualcosa per aggiungerli in. Non dovrebbe essere difficile definire aa stringa che definisce una serie di prefissi e anteponilo alle tue domande prima di inviarle. –

+0

Questo biglietto può essere rilevante: http://www.openvest.com/trac/ticket/34 (ma non ne sono assolutamente sicuro). Qualcuno fa il punto che se gli spazi dei nomi predefiniti sul server vengono modificati, che ha il potenziale per rompere il codice di query chiunque fare, che sembra una cosa negativa ™, e che i prefissi per le query dovrebbe essere definito in modo esplicito. –

risposta

4

Anche se le dichiarazioni negozi di sesamo namespace nel repository, non esiste alcun meccanismo in atto per aggiungere automaticamente questi spazi dei nomi a una query SPARQL. Spetta all'utente come utente assicurarsi che la query SPARQL sia corretta e completa.

Tuttavia, l'applicazione Workbench ha un editor SPARQL avanzato con supporto del completamento automatico, che aggiunge automaticamente le dichiarazioni dello spazio dei nomi quando si utilizza un prefisso. Quindi non è necessario digitarli manualmente quando si usa Workbench. Si noti che questa è semplicemente una comodità dell'applicazione client, non del motore di query SPARQL corrente.

aggiornamento anche se, come detto sopra, di sesamo non legge le definizioni di namespace dal repository quando analizza/esecuzione di una query, non consente di utilizzare i nomi prefissati per un numero limitato di vocabolari standard, senza di loro dichiarando esplicitamente. Questi sono i prefissi 'rdf', 'rdfs', 'owl', 'xsd', 'fn' e 'sesame'. Se si utilizzano quelli in una query SPARQL senza dichiararli, il motore SPARQL di Sesame li sostituisce automaticamente con lo spazio dei nomi standard a cui mappano i prefissi (nota che lo non utilizza gli spazi dei nomi nel proprio repository per questo, utilizza costanti predefinite).

Tuttavia, detto tutto ciò, è comunque buona pratica come autore di una query SPARQL per assicurarsi che la query sia completa. Le dichiarazioni di prefisso sono parte integrante di una query SPARQL, senza di esse la query è semplicemente non sintatticamente valida e quindi non portatile.

+0

Dici che non lo fa automaticamente. C'è un modo per sostituirli? A che serve avere spazi dei nomi se non puoi utilizzarli direttamente? – FreakyDan

+0

@FreakyDan bene in Java, che hai appena letto gli spazi dei nomi dal negozio, scorrere su di loro e Anteponi la stringa di ricerca prima di eseguirlo. Ma il punto di avere spazi dei nomi non è quello di consentire di scrivere query incomplete. Sono per lo più lì per permetterne l'uso in serializzazione quando si scrive il contenuto del deposito in un file (ad esempio in tartaruga-sintassi) - e, naturalmente, per essere interrogati e riutilizzati da voi come un dev. E FWIW: l'ultima versione dello strumento Workbench ha un editor SPARQL avanzato con completamento automatico che aggiunge automaticamente le dichiarazioni dello spazio dei nomi. –

+0

Inoltre, la mia affermazione che Sesame non fa nulla per aggiungere automaticamente spazi dei nomi non è vera al 100%. Aggiornerò la mia risposta –