Мастер-класс по SPARQL

Материал из Российская школа по Semantic Web
Перейти к: навигация, поиск
Мастер-класс по SPARQL
Номер 5
Лектор Катков Ю.В.
Prerequisites RDF, SQL, регулярные выражения, HTTP, HTTP-заголовки, RESTful API
Замечание пока что это скрипт лекции, а не конспект
Аннотация Первые 15 минут лекции рассказывается о том, что такое SPARQL: почему его называют graph-pattern, для каких целей его применяют, как выглядит запрос в общем виде, что такое SPARQL-endpoint. Затем лекция плавно перетекает в мастер-класс, где показываются различные конструкции языка на примерах возрастающего уровня сложности. Используются примеры из банков данных data.gov, NASA, BBC.

СМОТРИ ТАКЖЕ Пример последовательного построения SPARQL-запроса


Содержание

План лекции

  1. Введение. Определение SPARQL. Понятие о SPARQL-endpoint
  2. Понятие о SPARQL
    1. Как устроены graph-pattern языки? Двигаемся от простейшего: поиск тройки, где я не знаю первого объекта.
    2. Несколько полезных приемов при работе с источниками данных.
    3. Общая схема SPARQL-запроса, секции внутри него.
    4. Иллюстрация этой схемы с помощью запроса невысокой сложности против одного-единственного источника данных. Обращаем внимание на слово FROM.
  3. Выразительные средства SPARQL. Серия примеров на различные датасеты
  4. Как отлаживать SPARQL-запросы? Рекомендации по составлению хорошего запроса и его отладке.
  5. SPARQL 1.1 и его отличия
  6. Entailment regimes в SPARQL 1.1
  7. Источники данных со SPARQL-доступом
    1. Поиск источников данных
    2. Инструменты, облегчающие поиск: marbles, swoogle и sig.ma . Связь с лекцией по инструментам
  8. Связь SPARQL с другими языками запросов? SQL. Язык Smart-M3 запросов. GreQL. Ask-запросы в Semantic media wiki. MQL.

Лекция

Введение

Данный мастер-класс посвящен SPARQL - SPARQL Protocol and RDF Query Language.

Как можно судить по его названию, стандарт SPARQL определяет две вещи:

На этом мастер-классе мы будем уделять основное внимание последним трем буквам в этой аббревиатуре - RDF Query Language. В результате мастер класса участники должны научиться строить несложные SPARQL-запросы и овладеть базовой терминологией.

SPARQL очень тесно связан с языком RDF. Фактически SPARQL-запросы являются фрагментами RDF-графов, в которых кроме URI и литералов есть еще и переменные.

SPARQL-endpoint

Важный термин - SPARQL-endpoint или точка доступа. Точка доступа или SPARQL процессор - это сервис, позволяющий пользователю вводить его запросы, обрабатывающий эти запросы и возвращающий результат в различных форматах. Различают два вида точек доступа - общего назначения и локальные. Точки доступа общего назначения могут производить запросы по любым указанным RDF-документам, находящимся в Сети, в то время как локальные endpoint'ы способны получать данные только от одного ресурса. Примеры локальных точек доступа: NASA endpoint, BBC wildlife endpoint, DBPedia endpoint.

Полезные приемы при работе со SPARQL-endpoin'ами

Прежде чем начать прицельное изучение SPARQL, мы попробуем шапочно с ним познакомиться и рассмотрим несколько полезных типов запросов.

Edubase logo.gif

Мы начнем с датасета под названием Edubase - в нем собрано очень много информации о школах в Объединенном королевстве. Edubase - часть data.gov.uk. Заходим на адрес http://services.data.gov.uk/education/sparql и готовимся к вгрызанию в их данные.

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

SELECT COUNT(?x) WHERE 
{
?x a ?z .
}


Другой запрос, который используется довольно часто:

SELECT DISTINCT *
WHERE 
{
?x ?y ?z .
}
LIMIT 100

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

Теория

Общая схема SPARQL-запроса выглядит так:

# prefix declarations
PREFIX foo: <http://example.com/resources/>
...
# result clause
SELECT ...
# dataset definition
FROM ...
# query pattern
WHERE {
    ...
}
# query modifiers
ORDER BY ...

Типы запросов

ASK - правда ли, что

Идем на: http://api.talis.com/stores/space/items/tutorial/spared.html

Запрос:

PREFIX nasa: <http://nasa.dataincubator.org/spacecraft/> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
ASK
{ 
  nasa:1968-089A foaf:name "Apollo 7" .
}

SELECT - заполни недостающее

Идем на http://dbpedia.org/sparql

PREFIX dbpo: <http://dbpedia.org/ontology/> SELECT *

 WHERE
   {
     ?e dbpo:series         <http://dbpedia.org/resource/The_Sopranos>  .
     ?e dbpo:releaseDate   ?date                                       .
     ?e dbpo:episodeNumber  ?number                                     .
     ?e dbpo:seasonNumber   ?season
   }
 ORDER BY DESC(?date)

Ожидаемый результат:

DESCRIBE - опиши ресурс так как тебя учили

Расскажите мне что-нибудь о Пушкине! DESCRIBE


CONSTRUCT - конструирует новые RDF-графы

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

Конструкции SPARQL

Ограничиваем вывод

Заходим на http://dbpedia.org/sparql

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?a
WHERE
{ ?a a foaf:Person } 
LIMIT 10

Также можно указать OFFSET - сдвик, с какого элемента начинать отсчет.

Сортируем

Заходим на http://dbpedia.org/sparql

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?a
WHERE
{ ?a a foaf:Person } 
ORDER BY (?a)

Упражнение

Задача: Выведите страну с наибольшим количеством жителей!

Датасет: http://dbpedia.org/sparql

кол-во жителей - это свойство http://dbpedia.org/property/populationEstimate

Назваине страны обозначается как http://www.w3.org/2000/01/rdf-schema#label

Страна - это объект со следующим URI: http://dbpedia.org/ontology/Country


Решение

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>        
PREFIX prop: <http://dbpedia.org/property/>
PREFIX ont: <http://dbpedia.org/ontology/>

SELECT ?country_name ?population
WHERE {
    ?country a ont:Country ;
             rdfs:label ?country_name ;
             prop:populationEstimate ?population .
    FILTER (?population > 15000000) .
}
ORDER BY DESC (?population)
LIMIT 1
OFFSET 1

Модификаторы в графовх шаблонах

OPTIONAL

Идем сюда: http://api.talis.com/stores/space/items/tutorial/spared.html Пусть есть много косм кораблей. Я хочу вывести URI и картинку

PREFIX space: <http://purl.org/net/schemas/space/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT ?name ?image
WHERE {
  ?spacecraft foaf:name ?name.
  ?spacecraft foaf:depiction ?image.
}

Но это не выдаст мне тех, кого нет картинки! Сделаем её опциональной:

PREFIX space: <http://purl.org/net/schemas/space/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT ?name ?image
WHERE {

	#This pattern must be bound
	?spacecraft foaf:name ?name.
#Anything in this block doesn't have to be bound
   OPTIONAL 
   {
        ?spacecraft foaf:depiction ?image.
   }
}

Устанавливаем фильтры

Все страны, не имеющие доступа к морю с населением более 15 млн.

Идем на http://dbpedia.org/snorql/

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>        
PREFIX type: <http://dbpedia.org/class/yago/>
PREFIX prop: <http://dbpedia.org/property/>
SELECT ?country_name ?population
WHERE {
    ?country a type:LandlockedCountries ;
             rdfs:label ?country_name ;
             prop:populationEstimate ?population .
    FILTER (?population > 15000000) .
}
Еще фильтры

PREFIX prop: <http://dbpedia.org/property/> ASK {

 <http://dbpedia.org/resource/Amazon_River> prop:length ?amazon .
 <http://dbpedia.org/resource/Nile> prop:length ?nile .
 FILTER(?amazon > ?nile) .

}

Использование регулярных выражений

Получим, например, все имена, в которых встречается putnik

Идем на: http://api.talis.com/stores/space/items/tutorial/spared.html

 PREFIX space: <http://purl.org/net/schemas/space/>
 PREFIX foaf: <http://xmlns.com/foaf/0.1/>
 PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
 SELECT ?name
 WHERE {
   ?spacecraft foaf:name ?name.
   FILTER( regex(?name, "putnik", "i" ) )
 }

Новые возможности SPARQL 1.1

SPARQL Update

SPARQL Update позволяет делать следующие виды запросов.

Попробовать эти возможности в онлайне, похоже, невозможно. Однако развернуть дома RDF Storage и настроить SPARQL-endpoint довольно несложно. Мы рекомендуем хранилище Sesame.

Аггрегаты

SPARQL включает аггрегирующие функции. Мы поглядим на функции SUM, COUNT и . Попробуем некоторые запросы на британской точке доступа по школам (Edubase).

Сумматор SUM
PREFIX sch-ont: <http://education.data.gov.uk/def/school/>
SELECT (SUM(?object) AS ?sum) WHERE
{
 ?subject <http://education.data.gov.uk/def/school/schoolCapacity> ?object.
}
Подсчет значений COUNT
PREFIX sch-ont: <http://education.data.gov.uk/def/school/>
SELECT (COUNT(?object) AS ?cnt) WHERE
{
 ?subject <http://education.data.gov.uk/def/school/schoolCapacity> ?object.
}

Группировка объектов

Давайте подведем статистику по тому, какого рода дороги есть в Объединенном Королевстве и сколько есть каждых из них. Пробуем на точке доступа данных британского правительства.

PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX roads: <http://transport.data.gov.uk/0/ontology/roads#>
SELECT ?cat_name (COUNT(DISTINCT ?thing) AS ?roads)
WHERE {
   ?thing  a roads:Road ; roads:category ?cat .
   ?cat skos:prefLabel ?cat_name
}
GROUP BY ?cat_name

Новые форматы вывода

Вот пример вывода результатов запроса в виде JSON: уже введенный пример. Также в новый стандарт войдут форматы CSV и TCV.

Entailment regimes

тут можно попробовать запрос с RDFS Entailment regimes, однако нормального примера придумать не удалось. :(

Обращение к удаленным сервисам (федеративные запросы)

Идем на http://sparql.org/sparql.html

PREFIX movie: <http://data.linkedmdb.org/resource/movie/>
PREFIX dbpedia: <http://dbpedia.org/ontology/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?actor_name ?birth_date
FROM <http://www.w3.org/People/Berners-Lee/card> # placeholder graph
WHERE {
  SERVICE <http://data.linkedmdb.org/sparql> {
    <http://data.linkedmdb.org/resource/film/675> movie:actor ?actor .
    ?actor movie:actor_name ?actor_name
  }
  SERVICE <http://dbpedia.org/sparql> {
    ?actor2 a dbpedia:Actor ; foaf:name ?actor_name_en ; dbpedia:birthDate ?birth_date .
    FILTER(STR(?actor_name_en) = ?actor_name)
  }
}

Поддержка поиска

Попробовать запрос с поиском вот здесь.

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>        
PREFIX type: <http://dbpedia.org/class/yago/>
PREFIX prop: <http://dbpedia.org/property/>
SELECT DISTINCT ?lbl 
WHERE {
  ?country rdfs:label ?lbl .
  FILTER(bif:contains(?lbl, "Republic")) .
  ?country rdf:type dbpedia-owl:Country .
}

Вложенные запросы

Попробуйте вложенные запрос на ARQ-точке доступа общего назначения

PREFIX foaf:  <http://xmlns.com/foaf/0.1/>
SELECT ?name ?email
FROM <http://dig.csail.mit.edu/2008/webdav/timbl/foaf.rdf>
WHERE {
    {      SELECT DISTINCT ?person ?name WHERE { 
        ?person foaf:name ?name 
      } ORDER BY ?name LIMIT 10 OFFSET 10    }
    OPTIONAL { ?person foaf:mbox ?email }
}

Дополнительный материал

Русский язык

  1. Потребление Linked data

Английский язык

  1. SPARQL by example
  2. Making things with data.gov.uk от Guardian
  3. Semantic web programming, Chapter 6
  4. SPARQL Tutorial
  5. Подборка туториалов по SPARQL
  6. последовательное постепенное построение запроса
Личные инструменты
Пространства имён
Варианты
Действия
Навигация
Инструменты