2013-08-20 17 views
12

Ich versuche, eine SPARQL Construct Abfrage zu verwenden, um ein neues benanntes Diagramm aus einem vorhandenen zu erstellen. Die Datenbank, die ich abfrage, enthält http://graph.com/old als eine vorhandene benannte Grafik. Ich benutze Jena TDB als die Datenbank, zugegriffen über eine Jena Fuseki Endpunkt. Die folgende Abfrage gibt mir eine Fehlermeldung:CONSTRUCT in ein benanntes Diagramm

CONSTRUCT 
{ 
    GRAPH <http://graph.com/new> { 
     ?s ?p ?o 
    } 
} 

WHERE 
{ 
    GRAPH <http://graph.com/old> { 
     ?s ?p ?o 
    } 
} 

Wenn ich die Grafik-Anweisung aus der CONSTRUCT Block zu entfernen, die Abfrage funktioniert perfekt, aber ich möchte die Tripel in einem benannten Diagramm platzieren, dass ich anstelle des Standard festlegen ein.

Soweit ich finden konnte, sagt die SPARQL 1.1 section on CONSTRUCT nichts über die Konstruktion in benannten Graphen. Gibt es eine Möglichkeit, dies zu tun?

Antwort

14

So wie SELECT-Abfragen verwendet werden, wenn Sie daran interessiert sind, eine Menge von Variablenbindungen zurückzuerhalten, werden CONSTRUCT-Abfragen verwendet, um ein Modell zurückzuerhalten. So wie die Variablen, die in einer SELECT-Ergebnismenge gebunden sind, nicht in ein Modell oder eine dauerhafte Menge von Bindungen eingefügt werden, wird auch das von einer CONSTRUCT erstellte Modell nirgendwo gespeichert. Sie möchten SPARQL 1.1 INSERT verwenden. Die Update-Funktionen sind in 3 SPARQL 1.1 Update Language beschrieben. Ihre Aktualisierungsanforderung kann so geschrieben werden, wie:

INSERT { 
    GRAPH <http://graph.com/new> { 
    ?s ?p ?o 
    } 
} 
WHERE { 
    GRAPH <http://graph.com/old> { 
    ?s ?p ?o 
    } 
} 

Für diesen speziellen Fall, aber Sie könnten in der Lage sein, um den Kopiervorgang in 3.2.3 COPY beschrieben zu verwenden. COPY entfernt jedoch zuerst alle Daten aus dem Zieldiagramm, sodass es möglicherweise nicht auf Ihren tatsächlichen Fall anwendbar ist (Sie verstehen, dass der von Ihnen bereitgestellte Code ein minimales Beispiel sein kann und nicht unbedingt das tatsächliche Update, das Sie ausführen möchten). Über COPY sagt der Standard:

The COPY operation is a shortcut for inserting all data from an input graph into a destination graph. Data from the input graph is not affected, but data from the destination graph, if any, is removed before insertion.

COPY (SILENT)? ((GRAPH)? IRIref_from | DEFAULT) TO ((GRAPH)? IRIref_to | DEFAULT) 

is similar in operation to:

DROP SILENT (GRAPH IRIref_to | DEFAULT); 
     INSERT { (GRAPH IRIref_to)? { ?s ?p ?o } } WHERE { (GRAPH IRIref_from)? { ?s ?p ?o } } 

The difference between COPY and the DROP/INSERT combination is that if COPY is used to copy a graph onto itself then no operation will be performed and the data will be left as it was. Using DROP/INSERT in this situation would result in an empty graph.

If the destination graph does not exist, it will be created. By default, the service may return failure if the input graph does not exist. If SILENT is present, the result of the operation will always be success.

Wenn COPY nicht geeignet ist, dann ADD sein kann, was Sie suchen:

3.2.5 ADD

The ADD operation is a shortcut for inserting all data from an input graph into a destination graph. Data from the input graph is not affected, and initial data from the destination graph, if any, is kept intact.

ADD (SILENT)? ((GRAPH)? IRIref_from | DEFAULT) TO ((GRAPH)? IRIref_to | DEFAULT) 

is equivalent to:

INSERT { (GRAPH IRIref_to)? { ?s ?p ?o } } WHERE { (GRAPH IRIref_from)? { ?s ?p ?o } } 

If the destination graph does not exist, it will be created. By default, the service may return failure if the input graph does not exist. If SILENT is present, the result of the operation will always be success.

+2

Die Alternative zu 'COPY' ist natürlich' ADD', dies kopiert die Daten von der Quelle zum Ziel und bewahrt die Zielgraphen vorhandenen Daten – RobV

+0

@RobV Guter Punkt! Ich habe nicht viel SPARQL 1.1 Update gemacht, und ich denke, ich habe nicht weit genug in die Spezifikation gelesen, nachdem ich COPY gefunden habe. Ich füge ADD hinzu. –

Verwandte Themen