2012-04-02 16 views
1

Ich habe mich gefragt, ob es möglich war, in Jena einen SPARQL UpdateRequest mit ARQ Op-Objekten zu erstellen. Es würde mich interessieren programmatisch erstellen Updates wie folgt aus:Jena UpdateFactory

DELETE {?s :predicate <http://example.org#old> }  
INSERT {?s :predicate <http://example.org#toAdd>} 
WHERE {?s :predicate <http://example.org#old> } 

durch die Muster in der DELETE, INSERT Erstellen und WHERE-Klauseln aus der ARQ-API. Bis jetzt habe ich nur SPARQL-Update-Anfragen erstellt, um eine SPARQL-Zeichenfolge zu analysieren oder ein com.hp.hpl.jena.update.Update-Objekt zu erstellen (das QuadAcc-Objekte verwendet, die ich nicht finden konnte) Beispiele für den Einsatz.

Meine Befürchtung ist, dass das Management von UPDATE-Anfragen SPARQL und die von SPARQL SELECT-Abfragen werden getrennt und die ARQ nicht zu ‚montieren‘ on the fly Abfragen verwendet werden.

Vielen Dank im Voraus

Antwort

0

Ich habe das selbst nicht versucht, aber es sieht aus wie Update Objekte zu erstellen und sie zu einemzu montierenist in der Tat der Weg zu gehen.

Nach einem kurzen Blick, QuadAcc scheint nicht besonders schwierig, verwenden Sie einfach mit Tripel, die Variablen enthalten.

Die UpdateModify Unterklasse von Update sieht besonders interessant, es entspricht das DELETE … INSERT … WHERE Muster in Ihrem Beispiel. Leider wird die WHERE-Klausel mit einer Element (syntaktische Darstellung eines Abfrageteils) anstelle einer Op (algebraische Darstellung) initialisiert.

+0

Hallo, danke. Die Frage, die mich brennt, ist die Definition eines UPDATE-Objekts, das sich so von einem SELECT unterscheidet, dass eine Brücke von einer ARQ-Operation nicht gefunden werden konnte? – GCorrendo

+0

... zumindest teilweise Brücke. – GCorrendo

1

Diese Frage hat mich auch verbrannt. Ich wollte ein aus ElementGroup Objekte und ElementTriplesBlock Objekte komponieren. Dies sind die zwei Hauptklassen, die zum Erstellen einer Abfrage verwendet werden. Zum Beispiel:

ElementGroup queryPattern = ... 
ElementTriplesBlock constructTriples = ... 

Query query = new Query(); 
query.setQueryConstructType(); 

// set CONSTRUCT clause 
query.setConstructTemplate(new Template(constructTriples.getPattern())); 

// set WHERE clause 
query.setQueryPattern(queryPattern); 

habe ich versucht, die Mailing-Liste Jena und erhielt diese Antwort:

Das Update API ist so konzipiert, mit Streaming beliebig großer unbegrenzt INSERT und DELETE Daten daher die Verwendung von QuadAcc beschäftigen anstelle von ein Element für den INSERT/DELETE-Teil des Updates.

Schließlich implementiert ich dies ein ParametrizedSparqlString mit:

für die Antwort
ElementGroup queryPattern = ... 
ElementTriplesBlock deleteTriples = ... 
ElementTriplesBlock insertTriples = ... 

ParameterizedSparqlString qstring = new ParameterizedSparqlString(); 

// Set DELETE clause 
qstring.append("DELETE {"); 
qstring.append(deleteTriples.toString()); 
qstring.append("}"); 

// Set INSERT clause 
qstring.append("INSERT {"); 
qstring.append(insertTriples.toString()); 
qstring.append("}"); 

// Set WHERE clause 
qstring.append("WHERE {"); 
qstring.append(queryPattern.toString()); 
qstring.append("}"); 

// Construct an update query 
UpdateRequest request = qstring.asUpdate();