2012-05-22 23 views
12

Come si può usare la funzione di sostituzione in SPARQL 1.1, specialmente nei comandi di aggiornamento?SPARQL 1.1: come utilizzare la funzione di sostituzione?

Ad esempio, se ho un numero di tripli? S? P? O dove? O è una stringa e per tutte le triple dove? O contiene la stringa "gotit" Voglio inserire una tripla aggiuntiva dove "gotit" è sostituito da "haveit", come potrei farlo? Sto cercando di raggiungere questo obiettivo è Sesame 2.6.0.

Ho provato questo approccio ingenuo:

INSERT { ?s ?p replace(?o,"gotit","haveit","i") . } 
WHERE { ?s ?p ?o . FILTER(regex(?o,"gotit","i")) } 

ma questo ha causato un errore di sintassi.

Ho anche omesso di utilizzare sostituire nella lista dei risultati di una query in questo modo:

SELECT ?s ?p (replace(?o,"gotit","haveit","i") as ?r) WHERE { .... } 

Il documento SPARQL purtroppo non contiene un esempio di come utilizzare questa funzione.

È possibile utilizzare le funzioni per creare nuovi valori e non solo per verificare i valori esistenti e se sì, come?

risposta

14

Non è possibile utilizzare un'espressione direttamente nella clausola INSERT come si è tentato di fare. Inoltre stai vincolando ?name con il primo pattern triplo, ma poi lo stai filtrando su ?o nello FILTER che non ti darà alcun risultato (il filtraggio su una variabile non associata non darà risultati per la maggior parte delle espressioni di filtro).

Invece è necessario utilizzare un BIND nella vostra WHERE clausola per rendere la nuova versione del valore disponibile nella clausola INSERT in questo modo:

INSERT 
{ 
    ?s ?p ?o2 . 
} 
WHERE 
{ 
    ?s ?p ?o . 
    FILTER(REGEX(?o, "gotit", "i")) 
    BIND(REPLACE(?o, "gotit", "haveit", "i") AS ?o2) 
} 

BIND assegna il risultato di un'espressione ad una nuova variabile in modo puoi usare quel valore altrove nella tua query/aggiornamento.

La parte rilevante della specifica SPARQL che ti interessa è la sezione sulla Assignment

+0

Grazie per aver segnalato l'errore di usare? Name invece di? O .. Ho provato a semplificare una query effettiva per qui e ho dimenticato di cambiare il? Nome in? O. Ho provato la query utilizzando BIND con l'installazione di SESAME ma mi dà anche un errore di sintassi ... Dovrò capire se questo è supportato nella versione più recente! – Johsm

+0

Ho appena provato questo e funziona benissimo in Sesame versione 2.6.5 con un repository OWLIM-Lite. – Johsm

5

L'utilizzo di replace sembra corretto AFAICT secondo il spec. Credo che lo REPLACE sia stato aggiunto all'ultimo ultimo della specifica relativamente di recente - forse Sesame non lo supporta ancora?

Se si esegue solo la query restituisce le righe?

+0

Grazie per quella rassicurazione che dovrebbe funzionare come ho immaginato! La query regex funziona davvero bene. Riporterò qui non appena riuscirò ad aggiornare a una versione più recente di Sesame. – Johsm

+0

Ora ho provato con la versione 2.6.5 di Sesame e si scopre che mentre la query funziona, il comando di inserimento non funziona e produce un errore di sintassi. L'approccio suggerito da RobV sotto l'utilizzo di BIND funziona con Sesame 2.6.5. – Johsm