SPARQL 1.1: Как использовать функцию replace?
Как можно использовать функцию replace в SPARQL 1.1, особенно в командах обновления?
например, если у меня много троек ?s ?п ?О, где ?o-это строка и для всех троек, где ?o содержит строку " gotit "я хочу вставить дополнительную тройку, где" gotit "заменяется на" haveit", как я могу это сделать? Я пытаюсь достичь этого-Сезам 2.6.0.
я попробовал этот наивный подход:
INSERT { ?s ?p replace(?o,"gotit","haveit","i") . }
WHERE { ?s ?p ?o . FILTER(regex(?o,"gotit","i")) }
но это вызвало синтаксис ошибка.
Я также не смог использовать replace в списке результатов запроса, например:
SELECT ?s ?p (replace(?o,"gotit","haveit","i") as ?r) WHERE { .... }
документ SPARQL, к сожалению, не содержит примера использования этой функции.
можно ли вообще использовать функции для создания новых значений, а не только для проверки существующих значений, и если да, то как?
2 ответов
вы не можете использовать выражение непосредственно в ваш INSERT
статья, Как вы пытались сделать. Также вы связываете ?name
С первым тройным шаблоном, но затем фильтрация на ?o
на FILTER
который не даст вам никаких результатов (фильтрация по несвязанной переменной не даст вам никаких результатов для большинства выражений фильтра).
вместо этого вам нужно использовать BIND
в своем WHERE
предложение, чтобы сделать новую версию значения доступной в INSERT
предложение like Итак:
INSERT
{
?s ?p ?o2 .
}
WHERE
{
?s ?p ?o .
FILTER(REGEX(?o, "gotit", "i"))
BIND(REPLACE(?o, "gotit", "haveit", "i") AS ?o2)
}
BIND
присваивает результат выражения новой переменной, чтобы вы могли использовать это значение в другом месте запроса / обновления.
соответствующая часть спецификации SPARQL, которая вас интересует, - это раздел задание
использование replace
выглядит правильно afaict в соответствии с spec. Я верю REPLACE
был добавлен к последнему обороту спецификации относительно недавно - возможно, Сезам просто еще не поддерживает его?
Если вы просто сделать SELECT ?s ?p ?o WHERE { ?s ?p ?name . FILTER(regex(?name,"gotit","i")) }
возвращает ли ваш запрос строки?