Извлечение ресурса DBpedia по его строковому имени с помощью SPARQL и без знания его типа - PullRequest
11 голосов
/ 26 декабря 2011

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

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

    ?c a dbpedia-owl:Country ;

.Полный запрос sparql:

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

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

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

Давайте теперь предположим, что среди ресурсов dbpedia есть «слово» для поиска, это слово будет входнымкакой-то пользователь.И давайте назовем это «INPUT».

Запрос, я бы предположил, выглядел бы так:

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

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

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

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

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

1 Ответ

15 голосов
/ 27 декабря 2011

Я предполагаю, что в вашем первом вопросе вы заинтересованы в рассмотрении только ресурсов экземпляра.Я не знаю, можете ли вы явно запросить ресурсы, например, в общем случае, так как в 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: contains», хотя он не совместим с SPARQL.Я не думаю, что есть другой оптимальный способ сделать это, и, как вы сказали, использование FILTER будет неоптимальным, особенно если вам нужно быстро выполнять запросы.Я думаю, что поиск и индексация по ключевым словам обрабатываются ad-hoc каждым тройным магазином, пока нет стандартизированного способа поиска полнотекстовых поисковиков.

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

...