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")) } возвращает ли ваш запрос строки?