Краткое введение в 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»