Извлечение ресурса DBpedia по его строковому имени с помощью SPARQL и без знания его типа

Как показано в этом вопросе, который имеет похожее название, я хотел бы получить ресурс dbpedia, зная часть его имени. Я начинающий, когда дело доходит до SPARQL и тому подобного, но пример в вопросе мне очень помог, так как автор искал "Румыния", и отвечающий отвечал на него запросом Sparql о выполнении работы. Это хорошо, но вот в чем дело.

В этом примере они уже "знали", что Румыния является страной, поэтому

    ?c a dbpedia-owl:Country ;

в предложении WHERE. Полный запрос sparql

    SELECT ?c
    WHERE {
    ?c a dbpedia-owl:Country ;
    foaf:name "Romania"@en .
    FILTER NOT EXISTS {?c dbpedia-owl:dissolutionYear ?y}
    } 

Но этот вопрос не совсем полностью отвечает нашим потребностям, поэтому ищем ЛЮБОЙ ресурс по его имени, причем "имя" - это фактическое имя ресурса или его части, независимо от его типа (rdf:). Цель состоит в том, чтобы искать "что-нибудь", просто зная имя или его часть.

Я провел некоторое исследование, прежде чем задать вам, ребята, этот вопрос, и я уже знаю, что проблема "части имени" может быть решена с помощью функции bif (плохой способ, поскольку она не соответствует sparql), или предложением CONTAINS, но я не смог найти ни одного примера, показывающего, как его использовать.

Теперь давайте предположим, что среди ресурсов dbpedia есть "слово" для поиска, которое будет входным для какого-то пользователя. И давайте назовем это "ВХОД".

Запрос, я думаю, будет выглядеть так:

   SELECT ?something WHERE
   {
    ?something a (dbpedia Resource).
    CONTAINS(?something,"INPUT")
   }

Мой главный вопрос касается двух основных аспектов:

  1. Есть что-нибудь, что описывает тип Dbpedia Resource? Я не думаю, что это в онтологии или что-то еще. Зная, что я хотел бы найти среди всех ресурсов, чтобы найти один соответствующий...
  2. Конкретное имя, которое я бы назвал, или некоторую строку. Я рассмотрел вариант FILTER, но это означало бы получить ВСЕ ресурсы, а затем отфильтровать их по их имени после их получения, что, я думаю, было бы не столь оптимальным.

Итак, кто-нибудь знает этот "Главный запрос", чтобы получить ресурс, указав его имя или его часть? (Примером является предоставление "Обамы" и получение результатов не только для Барака, но и для Мишель).

Заранее спасибо.

1 ответ

Решение

Я предполагаю, что в вашем первом вопросе вы заинтересованы в рассмотрении только ресурсов экземпляра. Я не знаю, можете ли вы явно запросить ресурсы, например, в общем случае, так как в RDF все является ресурсом. Если вам это особенно нужно для набора данных DBpedia, вы можете запросить ресурсы с dcterms:subject как свойством (в DBPedia только ресурсы экземпляра имеют dcterms:subject). Таким образом, у вас может быть такой запрос:

SELECT DISTINCT ?s ?label WHERE {
            ?s rdfs:label ?label . 
            FILTER (lang(?label) = 'en'). 
            ?label bif:contains "Obama" . 
            ?s dcterms:subject ?sub 
}

Аналогично для вашего второго вопроса - если вы используете только набор данных DBpedia, вы можете использовать "bif: Содержит", хотя он не совместим с SPARQL. Я не думаю, что есть другой оптимальный способ сделать это, и, как вы сказали, использование FILTER будет неоптимальным, особенно если вам нужно быстро выполнять запросы. Я думаю, что поиск и индексация по ключевым словам обрабатываются ad-hoc каждым тройным магазином, пока нет стандартизированного способа полнотекстового поиска.

Итак, подведем итог: если вы работаете с dbpedia, просто используйте возможности магазина и особенности набора данных для решения вашей проблемы.

Другие вопросы по тегам