Извлечь тройки, содержащие определенную подстроку, используя SPARQL

Я хочу извлечь тройку, содержащую слово say "alice" в своем предмете. Я использовал следующий запрос:

SELECT ?s ?p ?o  WHERE { ?s ?p ?o .FILTER regex(?s, \"alice\") .}

Это не дает мне никаких результатов, несмотря на тройку, которая удовлетворяет этому ограничению.

С другой стороны, когда я использую тот же запрос, чтобы извлечь тройку, которая содержит слово brillant в своем объекте. Он возвращает только одно из двух возможных совпадений.

Используемый запрос:

SELECT ?s ?p ?o  WHERE { ?s ?p ?o .FILTER regex(?o, \"brillant\") .}

Пожалуйста, дайте мне знать, где я ошибаюсь и в чем причина такого поведения.

Ответ 1

Я предполагаю, что экранирование вокруг кавычек - это всего лишь остаток от копирования и вставки. Первый аргумент regex должен быть литералом, но литералы не могут быть субъектами троек в RDF, поэтому неправда, что у вас есть данные которые должны соответствовать этому шаблону. Тем не менее, у вас есть темы, URI которых содержит строку "alice", и вы можете получить строковое представление URI, используя str. Например,

SELECT ?s ?p ?o  WHERE { ?s ?p ?o .FILTER regex(str(?s), "alice") .}

Чтобы проиллюстрировать, используйте два значения <http://example.org> и "string containing example" и отфильтруйте, как в исходном запросе:

select ?x where {
  values ?x { <http://example.org> "string containing example" }
  filter( regex(?x, "exam" ))
}
-------------------------------
| x                           |
===============================
| "string containing example" |
-------------------------------

Мы получили только "string containing example", потому что другое значение не было строкой и поэтому не было подходящим аргументом для regex. Однако, если мы добавим вызов к str, тогда это строковое представление URI, которое будет рассматривать регулярное выражение:

select ?x where {
  values ?x { <http://example.org> "string containing example" }
  filter( regex(str(?x), "exam" ))
}
-------------------------------
| x                           |
===============================
| <http://example.org>        |
| "string containing example" |
-------------------------------