Извлечение ресурса 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")
}
Мой главный вопрос касается двух основных аспектов:
- Есть что-нибудь, что описывает тип Dbpedia Resource? Я не думаю, что это в онтологии или что-то еще. Зная, что я хотел бы найти среди всех ресурсов, чтобы найти один соответствующий...
- Конкретное имя, которое я бы назвал, или некоторую строку. Я рассмотрел вариант 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, просто используйте возможности магазина и особенности набора данных для решения вашей проблемы.