Большинство разработчиков знакомы с такими языками запросов, как SQL, для запросов к реляционным базам данных. В течение последних нескольких лет мы много слышали о графах знаний. В этой статье основное внимание уделяется запросу открытого графа знаний под названием Викиданные с использованием SPARQL.

Прежде чем перейти к объяснению SPARQL, нам нужно поговорить о форматах данных, таких как RDF. Данные RDF состоят из утверждений в виде троек субъект-предикат-объект. Возьмем, к примеру, у нас есть три языка программирования, C, Python и C++, которые хранятся в нашей базе данных со следующими идентификаторами.

          <https://example.com/C>
	  <https://example.com/C++>
	  <https://example.com/Python>

Мы используем ‹, › для встраивания идентификаторов для этих языков и используем пример домена https://example.com/, который можно заменить любым другим доменом, указанным пользователем.

Давайте также предположим, что у нас есть еще одна сущность, называемая языком программирования, представленная следующим образом.

<https://example.com/ProgrammingLanguage>

Нам нужно представить взаимосвязь между нашими примерами языков программирования и сущностью с именем ProgrammingLanguage. Для этой цели нам может понадобиться ввести отношение с именем IsA, которое идентифицируется следующим образом:

<https://example.com/IsA>

Теперь наша цель состоит в том, чтобы сформулировать следующие утверждения:

C is a Programming language. 
C++ is a Programming language. 
Python is a Programming language.

Это можно сделать следующим образом:

          <https://example.com/C> <https://example.com/IsA> <https://example.com/ProgrammingLanguage>

	  <https://example.com/C++> <https://example.com/IsA> <https://example.com/ProgrammingLanguage>

	  <https://example.com/Python> <https://example.com/IsA> <https://example.com/ProgrammingLanguage>

Разница между приведенными выше операторами, использующими идентификаторы, и операторами, написанными на естественном языке (английском), заключается в том, что первые могут быть легко поняты машинами и могут быть запрошены.

И это подводит нас к запросам SPARQL. Что, если я захочу задать следующие вопросы?

  • Дайте мне все языки программирования.
  • Сколько языков программирования в моей базе данных?
  • Что такое С? или питон?

SPARQL — это язык запросов, который можно использовать для запроса семантических веб-данных в формате RDF. Запросы SPARQL также используют тройные шаблоны. Приведенные выше вопросы можно перевести в SPARQL следующим образом.

Дайте мне все языки программирования.

SELECT ?proglang {
  ?proglang <https://example.com/IsA> <https://example.com/ProgrammingLanguage>
}

Здесь мы используем тройной шаблон, показанный выше, но заменяем первое значение переменной proglang. Таким образом, наш механизм запросов SPARQL должен найти все возможные значения этой переменной, которые могут соответствовать этому шаблону.

Сколько языков программирования в моей базе данных?

SELECT (count(?proglang) as ?count) {

   ?proglang <https://example.com/IsA> <https://example.com/ProgrammingLanguage>

}

Как видите, хотя мы повторно используем запрос, показанный выше, мы также используем специальную агрегатную функцию count, которая подсчитывает количество возможных значений, соответствующих нашему шаблону с различными значениями для переменной proglang.

Что такое C++?

SELECT ?type {
    <https://example.com/C++> <https://example.com/IsA> ?type 
}

Мы меняем позицию нашей переменной и используем новый тип имени переменной, чтобы получить тип C++.

Однако вместо того, чтобы повторять пример домена https://example.com/, можно создать пространство имен, используя ключевое слово PREFIX. Приведенный выше запрос теперь выглядит так:

PREFIX example: <https://example.com/>
SELECT ?type {
    example:C++ example:IsA ?type 
}

Но SPARQL может обрабатывать гораздо более сложные запросы. В реальной жизни у нас может быть много информации о языках программирования, например, дата первого выпуска, имена создателей и дизайнеров и т. д. И наши базы данных не ограничиваются только языками программирования. У них может быть информация о людях, естественных языках, реках, горах и т. д. Часть этой информации может отсутствовать в нашей базе данных, и нам может понадобиться запросить внешние базы данных. Эти варианты использования подробно обсуждаются в этой статье.

Викиданные

Чтобы продемонстрировать SPARQL с реальными данными, мы теперь используем Викиданные, которое является открытым хранилищем данных для информации, относящейся к большому количеству предметных областей, а не только к языкам программирования. Он также имеет специальную конечную точку SPARQL, где вы можете запускать запросы, указанные ниже, и просматривать ответы.

Основные запросы SPARQL

Давайте повторно используем некоторые из приведенных выше примеров.

Дайте мне список языков программирования

PREFIX wdt: <http://www.wikidata.org/prop/direct/>

PREFIX wd: <http://www.wikidata.org/entity/>


SELECT ?proglang {

    ?proglang wdt:P31 wd:Q9143

}

Взгляните на два префикса, которые мы использовали в приведенном выше запросе. wdt: используется для указания отношений и wd: для сущностей. В этом случае wdt:P31 можно использовать для указания отношения IsA, показанного выше, или типа. wd:Q9143 используется для указания объекта «Язык программирования».

До сих пор мы использовали в запросе только один тройной шаблон. Что делать, если в запросе более двух тройных шаблонов. Возьмем, к примеру, wdt:P571, который может указать дату первого выпуска языка программирования. Итак, теперь наш механизм запросов должен будет соответствовать обоим шаблонам в нашем хранилище данных, как показано в следующем запросе.

Дайте мне список языков программирования вместе с датами их создания?

SELECT ?proglang ?year {

   ?proglang wdt:P31 wd:Q9143.

   ?proglang wdt:P571 ?year.

 }

Однако нам не нужно каждый раз повторять ?proglang. Мы можем просто удалить последующие появления, используя ;.

SELECT ?proglang ?year {

    ?proglang wdt:P31 wd:Q9143;

              wdt:P571 ?year.

}

Запросы SPARQL с использованием выражений

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

Дайте мне список языков программирования, выпущенных после 2000 года, с датами их создания?

SELECT ?proglang ?year {

   ?proglang wdt:P31 wd:Q9143;

             wdt:P571 ?year.

   FILTER (year(?year) > 2000).

}

Теперь наш механизм запросов SPARQL не только попытается сопоставить два тройных шаблона, но и проверит, превышает ли начальный год 2000. В приведенном выше примере мы используем ключевое слово FILTER для фильтрации результатов. Функция year извлечет год из даты начала.

Совокупные запросы SPARQL

Что, если нас не интересует перечисление примеров языков программирования, но мы хотим изучить количество доступной информации. Для этой цели языки предоставляют несколько агрегатных функций, таких как count и т. д., которые используются в следующих двух примерах.

Подсчитайте количество доступных языков программирования?

SELECT (count(?proglang) as ?count) {

    ?proglang wdt:P31 wd:Q9143.

}

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

Назовите мне количество языков программирования, выпущенных после 2000 года, и даты их создания?

SELECT (count(?proglang) as ?count) {

    ?proglang wdt:P31 wd:Q9143;

              wdt:P571 ?year.

    FILTER (year(?year) > 2000).

}

Приведенный выше код даст количество языков программирования, хранящихся в Викиданных, которые были созданы после 2000 года.

Расширенные запросы SPARQL

Но с помощью SPARQL мы также можем попробовать некоторые сложные запросы, например запросить у Викиданных, есть ли какие-либо языки программирования, хранящиеся в хранилище данных.

Есть ли язык программирования?

ASK {

    ?proglang wdt:P31 wd:Q9143.

}

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

Есть ли информация о языках программирования и их зарождении?

ASK {

   ?proglang wdt:P31 wd:Q9143;

             wdt:P571 ?year.

}

Ответы на эти запросы могут быть true или false, в зависимости от доступности данных.

Запросы SPARQL с использованием федерации

В реальной жизни ни одно хранилище данных не может хранить всю информацию. Возможно, нам придется использовать несколько хранилищ данных, чтобы получить (вероятно) полное представление о различных объектах. В нашем последнем примере мы запрашиваем другое хранилище данных под названием DBPedia, чтобы узнать, можем ли мы получить дополнительную информацию. Например, по языку программирования Си в DBPedia много информации, которой может не быть в Викиданных.

Есть ли дополнительная информация о языках программирования в DBPedia?

SELECT ?proglang ?resource ?val{

    ?proglang wdt:P31 wd:Q9143.

    SERVICE <http://dbpedia.org/sparql> {

         ?resource rdf:type wd:Q9143;

                   owl:sameAs ?proglang;

                   foaf:homepage ?homepage.

    }

}
LIMIT 10

См. использование ключевого слова SERVICE, которое указывает конечную точку SPARQL DBPedia для получения соответствующей информации. Интересная часть таких запросов заключается в том, что их можно запускать на конечной точке Wikidata SPARQL, и механизм запросов будет вызывать другие службы, такие как DBPedia, для получения данных. Такие запросы называются федеративными запросами.

В этой статье представлено введение в несколько ключевых аспектов языка запросов SPARQL. Хотя мы использовали wd:Q9143 для получения информации, связанной с языками программирования, некоторые из приведенных выше запросов можно использовать для получения информации, связанной с программным обеспечением (wd:Q7397), горами (wd:Q8502), парками (wd:Q22698) и т. д.

Первоначально опубликовано на https://johnsamuel.info.