2012-04-09 8 views
7

La mia domanda è simile a quello che è stato chiesto su questo thread Is it possible to combine those 2 SPARQL INSERT into one?SPARQL multipla "INSERT WHERE" query in una singola richiesta

voglio avere inserire più Se le dichiarazioni in una query, ma per i soggetti diversi. Mi piacerebbe testare un valore particolare ("testValueN") e se presente vorrei inserire una nuova tripla per quel soggetto.

Un esempio sarebbe,

PREFIX Sensor: <http://example.com/Equipment.owl#> 
{ 
    INSERT { 
     ?subject1 Sensor:test2 'newValue1' . 
      } 
    WHERE { 
     ?subject1 Sensor:test1 'testValue1' . 
      } 
}; 
{ 
    INSERT { 
     ?subject2 Sensor:test2 'newValue2' . 
      } 
    WHERE { 
     ?subject2 Sensor:test1 'testValue2' . 
      } 
}; 

so la domanda di cui sopra è sbagliato. Mi piacerebbe sapere se qualcosa di simile è possibile in SPARQL.

risposta

8

Sì, questo è possibile. Infatti, il vostro esempio è quasi del tutto bene, basta perdere le staffe intorno ad ogni inserto:

PREFIX Sensor: <http://example.com/Equipment.owl#> 
INSERT { 
    ?subject1 Sensor:test2 'newValue1' . 
} 
WHERE { 
    ?subject1 Sensor:test1 'testValue1' . 
}; 
INSERT { 
    ?subject2 Sensor:test2 'newValue2' . 
} 
WHERE { 
    ?subject2 Sensor:test1 'testValue2' . 
} 

è una sequenza di aggiornamento SPARQL valido.

+0

Ha funzionato! Grazie Jeen Ho eseguito un aggiornamento di massa di 100, quindi 1000 triple utilizzando la query precedente. Gli aggiornamenti diventano molto lenti man mano che continuo ad aumentare il numero di triple. Per 100 INSERT cui gli aggiornamenti ci vogliono 4.2 sec e 1000 INSERT cui gli aggiornamenti ci vogliono 40,7 sec E 'questo il modo corretto e più efficace per farlo inserimento di massa in cui gli aggiornamenti? – Nikhil

+0

Non credo, suppongo che sia molto più efficiente farlo in un singolo aggiornamento, piuttosto che una sequenza con un aggiornamento per ogni singolo valore. Ma questa è una domanda separata e richiede un po 'più di dettaglio su come sono i tuoi dati e cosa, esattamente, stai cercando di raggiungere :) –

+0

Sto cercando di inserire in blocco le letture dei Sensori in un archivio RDF che è compatibile con SPARQL 1.1. Ricevo un flusso di letture e il corrispondente ID sensore. Devo cercare l'ID del sensore per ottenere l'URI per quel sensore e se presente inserire le misure del sensore. Quindi ho bisogno di fare prima una ricerca e poi un inserimento. L'URI del sensore pre-fetch potrebbe non essere buono perché gli aggiornamenti saranno da macchine diverse e il numero di sensori dovrebbe ridursi a un milione e oltre. per favore fatemi sapere se sono sulla pista corretta. – Nikhil

0

Desidero avere più istruzioni INSERIRE WHERE in una query, ma per soggetti diversi. Mi piacerebbe testare un valore particolare ("testValueN") e se presente vorrei inserire una nuova tripla per quel soggetto.

È possibile farlo usando valori per specificare le coppie oldValue/newValue che si desidera, e richiede solo un singolo inserto. Inoltre, si adatta meglio alle nuove coppie, poiché è sufficiente aggiungere una riga alla query.

PREFIX Sensor: <http://example.com/Equipment.owl#> 
INSERT { 
    ?subject Sensor:test2 ?newValue 
} 
WHERE { 
    values (?oldValue ?newValue) { 
     ('testValue1' 'newValue1') 
     ('testValue2' 'newValue2') 
    } 
    ?subject Sensor:test1 ?oldValue 
} 
Problemi correlati