Получение ресурса 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? Я не думаю, что дело в онтологии или чем-то еще. Зная, что я хотел бы провести поиск среди всех ресурсов, чтобы найти один подходящий ...
  2. Конкретное имя, которое я бы предоставил, или какая-то строка. Я рассматривал вариант ФИЛЬТР, но это означало бы получение ВСЕХ ресурсов, а затем их фильтрацию по имени после их извлечения, что было бы, я думаю, не так оптимально.

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

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


person Ged ort    schedule 26.12.2011    source источник


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

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

person ip.    schedule 26.12.2011
comment
На самом деле очень жаль, что нам приходится идти на хитрость (dcterms:subject), но эй, мои запросы касаются только ресурсов dbpedia. Так что ваш ответ просто потрясающий и избавил меня от НАГРУЗКИ головной боли. Большое спасибо. Что касается функций bif, я знаю, что они несовместимы со SPARQL, поэтому я искал CONTAINS, хотя я думаю, что все еще буду искать примеры, где они используют это предложение. Так что еще раз спасибо за ваш ответ, мое путешествие с dbpedia и rdf только началось, но вы только что дали мне необходимый старт. - person Ged ort; 27.12.2011
comment
У этого подхода есть некоторые болезненные ограничения. Он не допускает пробелов. Поэтому, если вы пытаетесь получить каноническое представление объекта для Барака Обамы (или программно любую строку имени, с которой вы столкнулись, как в моем случае), вы не можете использовать bif:contains. И тут я подумал, может быть URL кодирует строку? ?label bif:contains "barak%20obama" . Здесь нет игральных костей. Может быть, два отдельных утверждения для захвата составных частей? Неа. :( Virtuoso 37000 Error SP031: SPARQL compiler: More than one bif:contains() or similar predicate for '$label' variable in a single group Есть идеи? - person sands; 16.03.2013
comment
@sands вы можете сделать ?label bif:содержит 'barak obama' (обратите внимание на дополнительные кавычки) - person MrM; 12.02.2015
comment
@MrM хорошая мысль, мы также можем использовать подчеркивание для объединения, например 'barak_obama' . - person user1583465; 04.04.2015