Свободный текстовый поиск в sparql, когда у вас есть мультислово и scaping символ
Мне интересно, как я могу использовать в запросе sparql, когда у меня есть такое слово, как: Роберт Дж. О'Нил Я ищу ресурс, который имеет единицу из нескольких слов с символом квоты или юникода в свойстве Label.
SELECT DISTINCT ?resource ?abstract
WHERE {?resource rdfs:label ?s.
?s <bif:contains> "'Robert J. O'Neill'"
?resource dbo:abstract ?abstract
}
'''
2 ответа
Решение
Вот запрос, который вернет все элементы, которые имеют "Robert J. O'Neill" в качестве метки.
SELECT DISTINCT ?s WHERE
{
?s rdfs:label ?label .
FILTER(regex(?label, "Robert J. O'Neill", "i"))
}
Если вы уверены, что вам нужно конкретное соответствие строк. Это быстрее:
SELECT DISTINCT ?s WHERE
{
?s rdfs:label ?label .
?label bif:contains "Robert J. O'Neill"
}
Но учтите, что Virtuoso, например, не поддерживает такой запрос из-за пробелов в строке. Таким образом, альтернатива состоит в том, чтобы избежать этого как:
SELECT DISTINCT * WHERE
{
?s rdfs:label ?label .
?label bif:contains "Robert" .
FILTER (CONTAINS(?label, " J. O'Neill"))
}
Я нашел следующий код быстрее, чем регулярное выражение:
SELECT ?s WHERE { ?s rdfs:label ?o FILTER ( bif:contains ( ?o, '"Robert" AND "J." AND "Neill"' ) ) }