Подтвердить что ты не робот

SPARQL 1.1: как использовать функцию replace?

Как использовать функцию замены в SPARQL 1.1, особенно в командах обновления?

Например, если у меня есть несколько троек? s? p? o где? o - строка и для всех троек, где? o содержит строку "gotit", я хочу вставить дополнительную тройку, где "gotit" заменен на "hadit", как я мог это сделать? Я пытаюсь достичь этого - это Sesame 2.6.0.

Я пробовал этот наивный подход:

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

но это вызвало синтаксическую ошибку.

Я также не смог использовать замену в списке результатов запроса следующим образом:

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

В документе SPARQL, к сожалению, нет примера использования этой функции.

Возможно ли вообще использовать функции для создания новых значений, а не только для проверки существующих значений, и если да, то как?

4b9b3361

Ответ 1

Вы не можете использовать выражение непосредственно в своем предложении INSERT, как вы пытались сделать. Также вы привязываете ?name к первому тройному шаблону, но затем фильтруете на ?o в FILTER, который не даст вам никаких результатов (фильтрация по несвязанной переменной не даст вам результатов для большинства выражений фильтра).

Вместо этого вам нужно использовать BIND в вашем предложении WHERE, чтобы сделать новую версию значения доступной в предложении INSERT следующим образом:

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

BIND присваивает результат выражения новой переменной, поэтому вы можете использовать это значение в другом месте вашего запроса/обновления.

Соответствующая часть интересующей вас спецификации SPARQL - это раздел Assignment

Ответ 2

Использование replace выглядит корректным afaict в соответствии с спецификацией. Я полагаю, что replace был добавлен только к последнему обзору спецификации относительно недавно - возможно, Sesame еще не поддерживает его?

Если вы просто выполняете SELECT ?s ?p ?o WHERE { ?s ?p ?name . FILTER(regex(?name,"gotit","i")) }, ваш запрос возвращает строки?