answer_42 (answer_42) wrote,
answer_42
answer_42

Category:

Запросы к Википедии, как к базе данных

Пардон за ретроградство, но недавно я осознал, что википедия это не только энциклопедия, но и огромная база данных. После посещения конференции тамошний доклад про семантический веб как-то сильно меня затронул. Я конечно слышал про linkeddata и до этого, но никогда не воспринимал его всерьез и почему-то в этот раз это сильно задело, на википедию и на веб вцелом я стал смотреть по другому.

Например есть задачка, получить список стран и их площадь. Казалось бы, все просто, лезем, гуглим ищем, находим какой-нибудь приличный источник...Это подход прошлого и настоящего, в будущем мы будем осуществлять запрос к некой вселенской базе данных и получать инфу. Чем это отличается от настоящего, тоже базы данных и т.д.? Тем что из себя представляет эта вселенская БД - связанное множество источников знающих друг о друге и транслирующих себя в интернет.

Вернусь к задаче. Википедия это не структурированная база данных к которой можно делать запросы. Ее структурированной версией является DBPedia. Чтобы решить нашу задачку надо составить правильный запрос на SPARQL - языке запросов который может запрашивать данных хранимые в формате RDF.

Наш будет выглядеть так:
select distinct * where
 ?country dbpprop:areaKm  ?area .
}
Читается он так, выбери все неповторяющиеся (distinct) сущности Country и их площади в километрах. Чтобы понять какие есть параметры у сущностей, надо просто перейти по ссылке и посмотреть что есть в списке. Вместо dbpprop:area можно писать ссылкой: http://dbpedia.org/property/areaKm
select distinct * where
}
Так как нам нужно на самом название страны, а не ее сущность, то расширим так. Вместо звездочки поставим названия переменных которые нам нужны, добавим еще одно свойство commonName (а - это сокращение для rdf:type).
select ?name ?area where
{?country rdf:type <http://dbpedia.org/ontology/Country> . 
}
И наконец отфильтруем всякую фигню не на английском добавив FILTER:
select ?name ?area where
{?country rdf:type <http://dbpedia.org/ontology/Country> . 
 FILTER langMatches( lang(?name), "EN" )
}
Результат копируем и засовываем в Virtuoso SPARQL Query Editor.  Обратите внимание, что можно выбрать вывод сразу в CSV.

Еще подробные примеры можно найти тут.
Tags: dbpedia, linkeddata, sparql, wikipedia
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 5 comments