SPARQL (произносится как «sparkle», рекурсивная аббревиатура [2] для SPARQL Protocol и RDF Query Language ) — это язык запросов RDF , то есть семантический язык запросов для баз данных , способный извлекать и обрабатывать данные, хранящиеся в формате Resource Description Framework (RDF) . [3] [4] Он был принят в качестве стандарта рабочей группой RDF Data Access Working Group (DAWG) Консорциума Всемирной паутины и признан одной из ключевых технологий семантической паутины . 15 января 2008 года SPARQL 1.0 был признан W3C в качестве официальной рекомендации, [5] [6] а SPARQL 1.1 — в марте 2013 года. [7]
SPARQL позволяет создавать запросы, состоящие из тройных шаблонов , конъюнкций , дизъюнкций и дополнительных шаблонов . [8]
Существуют реализации для нескольких языков программирования . [9] Существуют инструменты, которые позволяют подключаться и полуавтоматически конструировать запрос SPARQL для конечной точки SPARQL, например ViziQuer. [10] Кроме того, существуют инструменты для перевода запросов SPARQL на другие языки запросов, например на SQL [11] и на XQuery . [12]
SPARQL позволяет пользователям писать запросы, которые следуют спецификации RDF W3C . Таким образом, весь набор данных представляет собой тройки "субъект-предикат-объект". Субъекты и предикаты всегда являются идентификаторами URI, но объекты могут быть URI или литеральными значениями. Эта единая физическая схема из 3 "столбцов" гиперденормализована в том смысле, что то, что было бы 1 реляционной записью с 4 полями, теперь является 4 тройками, в которых субъект повторяется снова и снова, предикат по сути является именем столбца, а объект — значением поля. Хотя это кажется громоздким, синтаксис SPARQL предлагает следующие возможности:
1. Субъекты и объекты могут быть использованы для поиска друг друга, в том числе рекурсивно.
Ниже представлен набор триплетов. Должно быть ясно, что ex:sw001
и ex:sw002
ссылка на ex:sw003
, которая сама по себе имеет ссылки:
ex : sw001 ex : linksWith ex : sw003 . ex : sw002 ex : linksWith ex : sw003 . ex : sw003 ex : linksWith ex : sw004 , ex : sw006 . ex : sw004 ex : linksWith ex : sw005 .
В SPARQL, когда переменная встречается в конвейере выражений в первый раз, она заполняется результатом. Во второй и последующие разы она используется как входные данные. Если мы назначаем («привязываем») URI ex:sw003
к ?targets
переменной, то она направляет результат в ?src
; это сообщает нам все, что ссылается на ex:sw003
(зависимость вверх по течению):
SELECT * WHERE { BIND ( ex : sw003 AS ?targets ) ?src ex : linksWith ?targets . }
Но с простым переключением переменной привязки поведение меняется на противоположное. Это произведет все то, от чего ex:sw003
зависит (нисходящая зависимость):
SELECT * WHERE { BIND ( ex : sw003 AS ?src ) ?src ex : linksWith ?targets . # ВНИМАНИЕ! Синтаксис не изменился! }
Еще более привлекательным является то, что мы можем легко указать SPARQL рекурсивно следовать по пути:
SELECT * WHERE { BIND ( ex : sw003 AS ?src ) ?src ex : linksWith + ?targets . # Обратите внимание на +; теперь SPARQL найдет ex:sw005 через ex:sw004 }
Связанные переменные, следовательно, также могут быть списками и будут работать без сложного синтаксиса. Эффект этого аналогичен следующему:
Если ?S привязан к ( ex : A , ex : B ), то ?S ex : linksWith ?O ведет себя следующим образом : для каждого s в ?S : извлечь s ex : linksWith , захватить o и добавить o к ?O Если ?O привязан к ( ex : A , ex : B ), то ?S ex : linksWith ? O ведет себя следующим образом : для каждого o в ?O : fetch ex : linksWith o , capture s добавляет s к ?S
2. Выражения SPARQL представляют собой конвейер
В отличие от SQL, в котором есть подзапросы и CTE, SPARQL гораздо больше похож на MongoDB или SPARK. Выражения оцениваются точно в том порядке, в котором они объявлены, включая фильтрацию и объединение данных. Модель программирования становится тем, чем был бы оператор SQL с несколькими предложениями WHERE. Сочетание субъектов и объектов, поддерживающих списки, и конвейерного подхода может дать чрезвычайно выразительные запросы, охватывающие множество различных доменов данных.
В отличие от реляционных баз данных, столбец объекта неоднороден: тип данных объекта, если не URI, обычно подразумевается (или указывается в онтологии ) значением предиката . Литеральные узлы несут информацию о типе, согласующуюся с базовым пространством имен XSD, включая короткие и длинные целые числа со знаком и без знака, числа с плавающей точкой одинарной и двойной точности, дату и время, точные десятичные числа, логические значения и строки. Реализации тройного хранилища в традиционных реляционных базах данных обычно сохраняют значение в виде строки, а четвертый столбец определяет реальный тип. Полиморфные базы данных, такие как MongoDB и SQLite, могут сохранять собственное значение непосредственно в поле объекта.
Таким образом, SPARQL предоставляет полный набор аналитических операций запроса, таких как JOIN
, SORT
, AGGREGATE
для данных, схема которых является неотъемлемой частью данных, а не требует отдельного определения схемы. Однако информация о схеме (онтология) часто предоставляется извне, чтобы обеспечить однозначное объединение различных наборов данных . Кроме того, SPARQL предоставляет определенный синтаксис обхода графа для данных, которые можно рассматривать как граф.
В приведенном ниже примере демонстрируется простой запрос, использующий определение онтологииfoaf
(«друг друга»).
В частности, следующий запрос возвращает имена и адреса электронной почты каждого человека в наборе данных :
ПРЕФИКС foaf : <http://xmlns.com/foaf/0.1/> ВЫБРАТЬ ?имя ?email ГДЕ { ?person a foaf : Персона . ?person foaf : имя ?имя . ?person foaf : mbox ?email . }
Этот запрос объединяет все триплеты с соответствующим субъектом, где предикат типа « a
» — это человек ( foaf:Person
), а у человека есть одно или несколько имен ( foaf:name
) и почтовых ящиков ( foaf:mbox
).
Для удобства чтения автор этого запроса решил ссылаться на субъект, используя имя переменной " ?person
". Поскольку первым элементом триплета всегда является субъект, автор мог бы с таким же успехом использовать любое имя переменной, например " ?subj
" или " ?x
". Какое бы имя ни было выбрано, оно должно быть одинаковым в каждой строке запроса, чтобы обозначить, что механизм запроса должен объединить триплеты с одним и тем же субъектом.
Результатом соединения является набор строк – ?person
, ?name
, ?email
. Этот запрос возвращает ?name
и , ?email
поскольку ?person
часто является сложным URI, а не понятной человеку строкой. Обратите внимание, что any ?person
может иметь несколько почтовых ящиков, поэтому в возвращаемом наборе ?name
строка может появляться несколько раз, по одному разу для каждого почтового ящика.
Этот запрос может быть распределен по нескольким конечным точкам SPARQL (службам, которые принимают запросы SPARQL и возвращают результаты), вычислен и собраны результаты; эта процедура известна как федеративный запрос .
Независимо от того, используется ли он в федеративном или локальном режиме, дополнительные тройные определения в запросе могут позволить выполнять объединения с различными типами субъектов, такими как автомобили, чтобы простые запросы, например, возвращали список имен и адресов электронной почты людей, которые водят автомобили с высокой топливной экономичностью.
В случае запросов, считывающих данные из базы данных, язык SPARQL определяет четыре различных варианта запросов для разных целей.
SELECT
запросCONSTRUCT
запросASK
запросDESCRIBE
запросКаждая из этих форм запроса принимает WHERE
блок для ограничения запроса, хотя в случае DESCRIBE
запроса WHERE
это необязательно.
SPARQL 1.1 определяет язык для обновления базы данных с несколькими новыми формами запросов. [13]
Еще один пример запроса SPARQL, моделирующий вопрос «Каковы столицы всех стран Африки?»:
ПРЕФИКС например : <http://example.com/exampleOntology#> ВЫБРАТЬ ?столица ?страна ГДЕ { ?x например : название города ?столица ; например : isCapitalOf ?y . ?y например : название страны ?страна ; например : isInContinent например : Африка . }
Переменные обозначаются префиксом ?
или $
. Привязки для ?capital
и ?country
будут возвращены. Когда тройка заканчивается точкой с запятой, субъект из этой тройки неявно завершит следующую пару до целой тройки. Так, например, ex:isCapitalOf ?y
сокращение от ?x ex:isCapitalOf ?y
.
Процессор запросов SPARQL будет искать наборы триплетов, которые соответствуют этим четырем шаблонам триплетов, связывая переменные в запросе с соответствующими частями каждого триплета. Важно отметить здесь «ориентацию свойств» (соответствия классов могут проводиться исключительно через атрибуты классов или свойства – см. Утиная типизация ).
Чтобы сделать запросы краткими, SPARQL позволяет определять префиксы и базовые URI способом, похожим на Turtle . В этом запросе префикс " ex
" означает " http://example.com/exampleOntology#
".
GeoSPARQL определяет функции фильтрации для запросов географических информационных систем (ГИС), используя общеизвестные стандарты OGC ( GML , WKT и т. д.).
SPARUL — это еще одно расширение SPARQL. Оно позволяет обновлять хранилище RDF с помощью этого декларативного языка запросов, добавляя INSERT
и DELETE
методы.
XSPARQL — это интегрированный язык запросов, объединяющий XQuery и SPARQL для одновременного запроса источников данных XML и RDF. [14]
Открытый исходный код, справочные реализации SPARQL
Более полную информацию см. в разделе Список реализаций SPARQL , включая TripleStore , API и другие хранилища, в которых реализован стандарт SPARQL.