2012-04-09 15 views
7

Mi pregunta es similar a lo que se pedía en este hilo Is it possible to combine those 2 SPARQL INSERT into one?SPARQL múltiple "INSERT donde" las consultas en una sola petición

Quiero tener múltiples INSERT donde las declaraciones en una consulta, pero por diferentes temas. Me gustaría probar un valor particular ("testValueN") y si está presente quisiera insertar un nuevo triple para ese tema.

Un ejemplo de ello sería,

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' . 
      } 
}; 

sé la consulta anterior es erróneo. Me gustaría saber si algo similar es posible en SPARQL.

Respuesta

8

Sí, esto es posible. De hecho, su ejemplo es casi completamente bien, sólo perderá los corchetes de cada 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' . 
} 

es una secuencia de actualización SPARQL válida.

+0

¡Funcionó! Gracias Jeen Ejecuté una actualización masiva de 100, luego 1000 triples con la consulta anterior. Las actualizaciones se vuelven realmente lentas a medida que sigo aumentando el número de triples. Para 100 INSERTAR DONDE las actualizaciones demoran 4.2 segundos y 1000 INSERTAR DONDE las actualizaciones demoran 40.7 segundos ¿Es esta la forma correcta y más eficiente de realizar actualizaciones de INSERT WHERE a granel? – Nikhil

+0

No lo creo, supongo que es mucho más eficiente hacer eso en una sola actualización, en lugar de una secuencia con una actualización para cada valor individual. Pero esa es una pregunta aparte y requiere un poco más de detalles sobre cómo se ven sus datos y qué es exactamente lo que está tratando de lograr :) –

+0

Estoy tratando de insertar a granel las lecturas del sensor en una tienda RDF que cumple con SPARQL 1.1. Recibo un flujo de lecturas y la identificación del sensor correspondiente. Necesito buscar la identificación del sensor para obtener el URI para ese sensor y, de estar presente, insertar las medidas del sensor. Así que primero necesito hacer una búsqueda y luego un Insertar. Es posible que los URI del sensor de precaptura no sean buenos porque las actualizaciones serán de diferentes máquinas y se supone que la cantidad de sensores se ampliará a un millón o más. por favor avíseme si estoy en la pista correcta. – Nikhil

0

Quiero tener varias instrucciones INSERT WHERE en una consulta, pero para diferentes temas. Me gustaría probar un valor particular ("testValueN") y si está presente quisiera insertar un nuevo triple para ese tema.

Usted puede hacer esto utilizando valores para especificar los pares oldValue/NewValue que desee, y sólo se requiere una única inserción . También se adapta mejor a los pares nuevos, ya que solo tiene que agregar una línea a la consulta.

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