Свободный текстовый поиск в 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"' ) ) }
Другие вопросы по тегам