2013-08-12 7 views
5

Ich versuche ein Repository 2.7 mit SPARQL und Sesam abzufragen, aber wenn ich meinen Code ausführen bekomme ich folgende FehlerAbfrage RDF mit SPARQL/Sesame

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

Das Problem ist, dass ich mit dem Präfix " viagem“unter der Registerkarte Namespaces für das Repository auf openrdf-Werkbank, auch wenn ich die Methode verwenden getNamespaces() zeigt sich, ...

die einzige Art, wie ich die Abfrage erhalten zu laufen ist die Vorsilbe manuell hinzufügen bei jeder Abfrage, aber das klingt falsch ...

Gibt es etwas, das mir fehlt, wie man es richtig benutzt?

--- Edited mit mehr Informationen

-Code nicht funktioniert:

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

     } 
... 

Dieser Code funktioniert, wenn ich Abfrage-Zeichenfolge-ändern zu

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

ich nicht sicher war, ob ich das sollte hinzufügen PREFIX für jede Abfrage, die ich ausführen werde (wenn es das normale Verhalten ist, ist es in Ordnung ...)

Auch wenn ich den folgenden Code ausführen bekomme ich das Präfix und den Namen richtig

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

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

der Ausgang ist:

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

Wie lautet Ihr Code? Was ist die Abfrage? Es gibt nicht genug, um noch etwas zu diagnostizieren. Was meinst du "Ich habe das Präfix" viagem "unter der Registerkarte Namespaces für dieses Repository"? Ist das für eine webbasierte SPARQL-Schnittstelle? Die dafür verfügbaren Namespaces sind möglicherweise nicht für Abfragen definiert, die Sie im Code ausführen. –

+0

Für das, was es wert ist, ist es in der Regel eine gute Idee, alle Präfixe zu definieren, die Sie verwenden, und nicht davon abhängen, dass der Server etwas tut, um sie hinzuzufügen. Es sollte nicht schwierig sein, eine Zeichenfolge zu definieren, die eine Reihe von Präfixe definiert , und dies Ihren Anfragen vorzuziehen, bevor Sie sie versenden. –

+0

Dieses Ticket kann relevant sein: http://www.openvest.com/trac/ticket/34 (aber ich bin mir nicht ganz sicher). Jemand macht den Punkt, dass, wenn die vordefinierten Namespaces auf dem Server geändert werden, dies den Code eines jeden, der Abfragen durchführt, brechen könnte, was wie ein Bad Thing ™ aussieht, und dass die Präfixe für Abfragen explizit definiert werden sollten. –

Antwort

4

Obwohl Sesame speichert Namespace-Deklarationen im Repository, gibt es keinen Mechanismus zu fügen Sie diese Namespaces automatisch einer SPARQL-Abfrage hinzu. Es liegt an Ihnen als Benutzer, sicherzustellen, dass die SPARQL-Abfrage korrekt und vollständig ist.

Die Workbench-Anwendung verfügt jedoch über einen erweiterten SPARQL-Editor mit Autocomplete-Unterstützung, der automatisch Namespacedeklarationen hinzufügt, wenn Sie ein Präfix verwenden. Sie müssen sie also nicht manuell eingeben, wenn Sie Workbench verwenden. Beachten Sie, dass dies lediglich eine Annehmlichkeit der Clientanwendung nicht der tatsächlichen SPARQL-Abfrage-Engine ist.

aktualisieren obwohl, wie oben erwähnt, Sesame eine Abfrage nicht Namespace-Definitionen aus dem Repository lesen, wenn das Parsen/Ausführen, es Ihnen gelegten Namen für eine begrenzte Anzahl von Standardvokabulare ohne ausdrücklich erklärt, sie zu nutzen erlaubt. Dies sind die Präfixe 'rdf', 'rdfs', 'eule', 'xsd', 'fn' und 'sesame'. Wenn Sie diese in einer SPARQL-Abfrage verwenden, ohne sie zu deklarieren, ersetzt die SPARQL-Engine von Sesame diese automatisch durch den Standardnamespace, dem diese Präfixe zugeordnet sind (beachten Sie, dass nicht die Namespaces in Ihrem Repository dafür verwendet, verwendet vordefinierte Konstanten).

Nachdem dies jedoch alles gesagt wurde, ist es immer noch eine gute Übung als Autor einer SPARQL-Abfrage, um sicherzustellen, dass Ihre Abfrage abgeschlossen ist. Präfix-Deklarationen sind ein integraler Bestandteil einer SPARQL-Abfrage, ohne diese ist Ihre Abfrage einfach nicht syntaktisch gültig und daher nicht portierbar.

+0

Sie sagen, es tut es nicht automatisch. Gibt es eine Möglichkeit, sie zu ersetzen? Was nützt es, Namensräume zu haben, wenn man sie nicht direkt benutzen kann? – FreakyDan

+0

@FreakyDan gut in Java, lesen Sie einfach die Namespaces aus dem Speicher, durchlaufen Sie über sie und vor dem Ausführen sie an Ihre Abfrage Zeichenfolge. Der Punkt, Namespaces zu haben, erlaubt es Ihnen jedoch nicht, unvollständige Abfragen zu schreiben. Sie sind hauptsächlich dort, um ihre Verwendung in der Serialisierung zu erlauben, wenn Speicherinhalte in eine Datei geschrieben werden (z.B. in Turtle-Syntax) - und natürlich von Ihnen als Entwickler abgefragt und wiederverwendet werden. Und FWIW: Die neueste Version des Workbench-Tools verfügt über einen erweiterten SPARQL-Editor mit Autocomplete, der automatisch Namespace-Deklarationen für Sie hinzufügt. –

+0

Auch meine Aussage, dass Sesame nichts tut, um Namespaces automatisch hinzuzufügen, ist nicht 100% wahr. Ich werde meine Antwort aktualisieren. –