Краткое введение в WikiData и язык запросов SPARQL
Как специалисты по анализу данных, люди склонны думать, что они разрабатывают и экспериментируют со сложными и сложными алгоритмами и получают самые современные результаты. Во многом это правда. Это то, чем больше всего гордятся специалисты по данным, и это самая инновационная и полезная часть. Но то, что люди обычно не замечают, - это пот, который они тратят, чтобы собрать, обработать и обработать данные, которые приводят к отличным результатам. Вот почему вы можете видеть, что SQL появляется в большинстве требований к должности специалиста по данным.
Что такое SPARQL?
Существует еще один язык запросов, который может оказаться очень полезным при получении данных из множества источников и баз данных, самая большая из которых - Википедия. Язык запросов называется SPARQL. Согласно Википедии:
SPARQL (произносится искра, рекурсивная аббревиатура [2] для протокола SPARQL и языка запросов RDF) - это язык запросов RDF, то есть является семантическим языком запросов для баз данных - способным извлекать и управлять данными, хранящимися в формате Resource Description Framework (RDF)
Что ж, это не очень хорошее определение. Он вряд ли говорит вам, на что он способен. Чтобы перевести его на понятный человеку язык:
SPARQL - это язык запросов, похожий на SQL по синтаксису, но работает с базой данных графа знаний, такой как Википедия, что позволяет извлекать знания и информацию, определяя серию фильтров и ограничений.
Если для вас это все еще слишком абстрактно, посмотрите на изображение ниже:
Это хронология присужденных Нобелевских премий по химии, созданная веб-сайтом WikiData Query Service с использованием приведенного ниже кода:
#Awarded Chemistry Nobel Prizes #defaultView:Timeline SELECT DISTINCT ?item ?itemLabel ?when (YEAR(?when) as ?date) ?pic WHERE { ?item p:P166 ?awardStat . # … with an awarded(P166) statement ?awardStat ps:P166 wd:Q44585 . # … that has the value Nobel Prize in Chemistry (Q35637) ?awardStat pq:P585 ?when . # when did he receive the Nobel prize SERVICE wikibase:label { bd:serviceParam wikibase:language "en" . } OPTIONAL { ?item wdt:P18 ?pic } }
Любой, кто знаком с SQL, найдет приведенный выше код интуитивно понятным. Я воспользуюсь другим примером, чтобы в основном объяснить, как формулировать похожие запросы для достижения интересующих вас результатов.
Отправная точка: страница в Википедии
SPARQL работает с несколькими базами данных графа знаний. Чтобы узнать, что такое граф знаний, давайте начнем с того, с чем все знакомы: с Википедии. Википедия - лучшее место для большинства людей, когда они хотят исследовать тему / предмет. Если вы перейдете на страницу создателя Python Гвидо ван Россума, вы увидите подробную страницу со всеми видами полезной информации.
Организованная страница: WikiData
Проблема с этой страницей в том, что она не организована. Вы можете выполнять поиск по ключевым словам, но не можете легко определить взаимосвязь между информационными узлами. Вот где в игру вступает граф знаний. Красный прямоугольник на приведенной выше странице означает «Элемент Викиданных», щелкните его, чтобы перейти к представлению графа знаний на той же странице:
Начать запрос
Здесь мы видим, что вся информация о Гвидо хорошо организована по категориям, в каждой категории есть несколько элементов. Используя SPARQL, вы можете легко запросить эту информацию. Для этого в Википедии есть еще одна страница, удобная служба запросов под названием Служба запросов Викиданных:
Здесь мы можем поэкспериментировать со SPARQL. На странице WikiData мы заметили, что Гвидо - программист (очевидно!). Что, если мы хотим узнать других программистов, у которых есть запись в Википедии? Посмотрим на код SPARQL:
SELECT ?person WHERE { ?person wdt:P106 wd:Q5482740 . }
Здесь мы определили ?person
как интересующую тему, которая также будет отображаться в виде столбца в результатах нашего запроса. Затем мы указываем некоторые ограничения с помощью WHERE
. Ограничения wdt:P106
должны быть wd:Q5482740
. Какие? Ты говоришь. Позвольте мне объяснить это более подробно. wdt
- это префикс «предиката» или «атрибута» субъекта, а wd
- префикс значения (объект в терминах SPARQL, но это не важно) атрибута. wdt:
означает, что я собираюсь указать здесь атрибут субъекта, а wd:
означает, что я укажу значение этого атрибута. Так что такое P106
и Q5482740
? Это просто код для конкретного атрибута и значения. P106
означает «род занятий», а Q5482740
означает «программист». Эта строка кода означает, что я хочу, чтобы субъект ?person
имел атрибут «профессия» «программист». Уже не так страшно, правда? Вы можете легко найти эти коды на упомянутой выше странице WikiData.
Запустите запрос, и вы получите следующие результаты:
От кода к имени
У нас есть куча person
элементов с разными wd:value
. Если вы присмотритесь к значениям, то на самом деле это код для другого человека. Например, первый wd:Q80
- это Тим Бернерс-Ли, изобретатель WWW. Это не интуитивно понятно, мы хотим иметь возможность видеть имена напрямую. Для этого мы добавляем службу меток WikiData, которая помогает нам переводить код в имя, например:
SELECT ?person ?personLabel WHERE { ?person wdt:P106 wd:Q5482740 . ?person rdfs:label ?personLabel . FILTER ( LANGMATCHES ( LANG ( ?personLabel ), "fr" ) ) }
Подобный синтаксис, мы хотим, чтобы person
имел атрибут «label», и мы определяем переменную personLabel
value для хранения этих значений, чтобы мы могли отображать их в результатах запроса. Кроме того, мы добавили personLabel
в нашу SELECT
фразу, чтобы она отображалась. Обратите внимание, что я также добавил ФИЛЬТР ниже, чтобы отображать только метку французского языка, в противном случае будет отображаться несколько языковых меток для одного человека, что нам не нужно:
Сужается
Из приведенных выше результатов мы видим, что у нас есть около 790 результатов. Это слишком много. Давайте сузим их до тех, которые являются «кем-то» в отрасли. Кто-то, у кого есть атрибут «выдающаяся работа»:
SELECT ?person ?personLabel ?notableworkLabel WHERE { ?person wdt:P106 wd:Q5482740 . ?person rdfs:label ?personLabel . FILTER ( LANGMATCHES ( LANG ( ?personLabel ), "fr" ) ) ?person wdt:P800 ?notablework . ?notablework rdfs:label ?notableworkLabel . FILTER ( LANGMATCHES ( LANG ( ?notableworkLabel ), "fr" ) ) }
Опять же, wdt:P800
означает атрибут «выдающаяся работа», все остальное аналогично. Затем мы получаем следующие результаты:
Группировать несколько ярлыков
Теперь у нас есть только 175 результатов, в том числе значимые работы каждого человека. Но подождите, а почему у нас пятеро Ричарда Столлманов? Оказывается, у Ричарда есть несколько заметных работ, поэтому он неоднократно упоминался в результатах. Давайте исправим это, сгруппировав все заметные работы в один атрибут:
SELECT ?person ?personLabel ( GROUP_CONCAT ( DISTINCT ?notableworkLabel; separator="; " ) AS ?works ) WHERE { ?person wdt:P106 wd:Q5482740 . ?person rdfs:label ?personLabel . FILTER ( LANGMATCHES ( LANG ( ?personLabel ), "fr" ) ) ?person wdt:P800 ?notablework . ?notablework rdfs:label ?notableworkLabel . FILTER ( LANGMATCHES ( LANG ( ?notableworkLabel ), "fr" ) ) } GROUP BY ?person ?personLabel
Здесь используется «GROUP BY
». Кроме того, функция GROUP_CONCAT
используется для объединения нескольких notableworkLabel
в новый столбец works
(Я не буду объяснять, как работают эти функции, просто хочу быстро показать вам, на что способен SPARQL. Если вы хотите узнать больше, обратитесь в Google, есть много обучающих статей и видео):
Лица
Теперь у нас есть список из 90 результатов, в котором есть все «кто есть кто» в мире разработки программного обеспечения. Но SPARQL может больше. Добавим к именам лица:
SELECT ?person ?personLabel ( GROUP_CONCAT ( DISTINCT ?notableworkLabel; separator="; " ) AS ?works ) ?image WHERE { ?person wdt:P106 wd:Q5482740 . ?person rdfs:label ?personLabel . FILTER ( LANGMATCHES ( LANG ( ?personLabel ), "fr" ) ) ?person wdt:P800 ?notablework . ?notablework rdfs:label ?notableworkLabel . FILTER ( LANGMATCHES ( LANG ( ?notableworkLabel ), "fr" ) ) OPTIONAL {?person wdt:P18 ?image} } GROUP BY ?person ?personLabel ?image
По той же схеме, мы только что добавили OPTIONAL
ключевое слово, так как мы не хотим исключать кого-то, если у него нет изображения в его профиле. Мы также переключаем вид на «сетку изображений»:
Где они?
Ух ты! Это намного лучше. Я видел довольно знакомые лица! Может быть, вам интересно, где находятся эти ребята? Давайте разберемся:
#defaultView:ImageGrid SELECT ?person ?personLabel ( GROUP_CONCAT ( DISTINCT ?notableworkLabel; separator="; " ) AS ?works ) ?image ?countryLabel ?cood WHERE { ?person wdt:P106 wd:Q5482740 . ?person rdfs:label ?personLabel . FILTER ( LANGMATCHES ( LANG ( ?personLabel ), "fr" ) ) ?person wdt:P800 ?notablework . ?notablework rdfs:label ?notableworkLabel . FILTER ( LANGMATCHES ( LANG ( ?notableworkLabel ), "fr" ) ) OPTIONAL {?person wdt:P18 ?image} OPTIONAL {?person wdt:P19 ?country . ?country rdfs:label ?countryLabel . ?country wdt:P625 ?cood . FILTER ( LANGMATCHES ( LANG ( ?countryLabel ), "fr" ) ) } } GROUP BY ?person ?personLabel ?image ?countryLabel ?cood
Возможно, вы сами сможете расшифровать приведенный выше код. По сути, в нем говорится, что я хочу, чтобы у этого человека был атрибут country
, поместил его в переменную country
, затем узнал coordinates
страны и поместил в переменную cood
. С помощью координат мы можем активировать вид «карты»:
Мы видим, что у нас их много в США, некоторые в Европе, а другие разбросаны по другим частям мира.
Больше примеров
С помощью нескольких строк кода мы выяснили, какие влиятельные лица в индустрии программного обеспечения известны, чем они известны, где они находятся и как выглядят. Как видите, потенциал здесь безграничен.
Вы можете нажать кнопку «Пример» на странице WikiData, чтобы узнать больше забавных и интересных примеров, которые вы можете использовать.
Можете ли вы в качестве задания для этой статьи придумать, как добавить атрибут «дата рождения» и сгенерировать график временной шкалы, подобный приведенному в начале этой статьи?
Заключение
В этой статье мы использовали WikiData в качестве примера графа знаний для знакомства с языком запросов SPARQL. Существуют и другие графы знаний, такие как DBpedia и т. Д. Эта статья ни в коем случае не является исчерпывающим руководством. Я просто хочу познакомить с языком больше людей, чтобы знания и извлечение информации можно было делать немного более эффективно.
Эта статья оказалась полезной? Следуйте за мной (Майкл Ли) на Medium, или вы можете найти меня в Twitter @lymenlee или в моем блоге wayofnumbers.com. Вы также можете ознакомиться с моими самыми популярными статьями ниже!
« Это CS50 : приятный способ начать ваше образование в области науки о данных»
Почему CS50 особенно хорош для укрепления вашей основы разработки программного обеспечения в сторонуdatascience.com »
Две стороны одной монеты: fast.ai Джереми Ховарда и deeplearning.ai Эндрю Нга
Как не« переобучить ваше обучение искусственному интеллекту, взяв и fast.ai, и глубокое обучение .ai курсы todatascience.com »
Что вам нужно знать о Netflix« Убийца Jupyter : Polynote 📖
Пора Jupyter Notebook найти достойного конкурента по направлению кdatascience.com»