virtuoso tutorial query online example replace sparql sesame

replace - tutorial - SPARQL 1.1: ¿cómo usar la función de reemplazo?



sparql tutorial (2)

¿Cómo se puede usar la función de reemplazo en SPARQL 1.1, especialmente en los comandos de actualización?

Por ejemplo, si tengo un número de triples? S? P? O donde? O es un string y para todos los triples donde? O contiene el string "gotit" quiero insertar un triple adicional donde "gotit" es reemplazado por " haveit ", ¿cómo podría hacer esto? Estoy tratando de lograr esto es Sesame 2.6.0.

Intenté este enfoque ingenuo:

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

pero esto causó un error de sintaxis.

Tampoco pude usar reemplazar en la lista de resultados de una consulta como esta:

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

Desafortunadamente, el documento SPARQL no contiene un ejemplo de cómo usar esta función.

¿Es posible utilizar funciones para crear nuevos valores y no solo probar valores existentes y, en caso afirmativo, cómo?


El uso de replace ve correcto afaict de acuerdo con la especificación . Creo que REPLACE se acaba de agregar a la última versión de la especificación relativamente reciente, ¿quizás Sesame simplemente no lo admite todavía?

Si solo hace SELECT ?s ?p ?o WHERE { ?s ?p ?name . FILTER(regex(?name,"gotit","i")) } SELECT ?s ?p ?o WHERE { ?s ?p ?name . FILTER(regex(?name,"gotit","i")) } ¿su consulta devuelve filas?


No puede usar una expresión directamente en su cláusula INSERT como lo ha intentado hacer. También está vinculando el ?name con el primer patrón triple pero luego filtrando en ?o en el FILTER que no le dará ningún resultado (filtrar en una variable independiente no le dará ningún resultado para la mayoría de las expresiones de filtro).

En su lugar, debe usar un BIND en su cláusula WHERE para que la nueva versión del valor esté disponible en la cláusula INSERT manera:

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

BIND asigna el resultado de una expresión a una nueva variable para que pueda usar ese valor en otra parte de su consulta / actualización.

La parte relevante de la especificación SPARQL que le interesa es la sección sobre Asignación