69052

Язык OWL (Web Ontology Language)

Лекция

Информатика, кибернетика и программирование

Язык онтологий для Web – OWL (Web Ontology Language), так же как RDF и RDFS разработан для описания данных и метаданных, а также отношений между ними и предназначен для использования в компьютерной обработке данных семантического Web.

Русский

2014-09-29

563 KB

16 чел.

 51

Лекция 4-18

6.3.5. Язык OWL 

 6.3.5.1. Виды OWL

 6.3.5.2. Структура документа OWL

 6.3.5.3. Классы OWL

 6.3.5.3.1. Описания класса

  6.3.5.3.1.1. Описание класса с помощью идентификатора

  6.3.5.3.1.2. Описание класса с помощью перечисления

  6.3.5.3.1.3. Описание класса с помощью ограничения свойств

  6.3.5.3.1.4. Описание класса с помощью объединения

  6.3.5.3.1.5. Описание класса с помощью пересечения

  6.3.5.3.1.6. Описание класса с помощью дополнения

 6.3.5.3.2. Аксиомы классов

 6.3.5.4. Свойства OWL

 6.3.5.4.1. Отношения к другим свойствам

 6.3.5.4.2. Глобальные ограничения мощности

 6.3.5.4.3. Характеристики логических свойств

 6.3.5.5. Представители классов в OWL

 6.3.5.6. Перечислимые данные в OWL

6.3.6. Язык SPARQL

 6.3.6.1. Элементы языка SPARQL

 6.3.6.2. Запросы в SPARQL

 6.3.6.2.1. Структура и выполнение запроса

 6.3.6.2.2. Запрос SELECT

  6.3.6.2.2.1. Синтаксис и вывод результатов запроса

  6.3.6.2.2.2. Условие в запросе

  6.3.6.2.2.3. Использование фильтра в запросе

  6.3.6.2.2.4. Задание исходных документов в запросе

  6.3.6.2.2.5. Уточнение в запросе

  6.3.6.2.2.6. Модификатор результата в запросе

 6.3.6.2.3. Запрос CONSTRUCT

 6.3.6.2.4. Запрос ASK

 6.3.6.2.5. Запрос DESCRIBE

 6.3.6.3. Протокол SPARQL

 6.3.6.3.1. Описание протокола SPARQL

 6.3.6.3.2. Связывание с протоколом HTTP

 6.3.6.3.3. Связывание с протоколом SOAP

6.3.5. Язык OWL

Язык онтологий для Web – OWL (Web Ontology Language), так же как RDF и RDFS разработан для описания данных и метаданных,  а также отношений между ними и предназначен для использования в компьютерной обработке данных семантического Web.

Язык OWL определен в группе из шести рекомендаций, принятой консорциумом W3 в феврале 2004 года.

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

В Web онтология  содержит описания классов, свойств и их реализацию в виде экземпляров классов. Формальная семантика OWL описывает, как с помощью такой онтологии сделать логические выводы, т.е. получить факты, которые не представлены в онтологии напрямую, но следуют из ее семантики. Эти выводы могут быть основаны на одном документе или множестве распределенных документов, связанных между собой определенным образом.

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

Для языка OWL определено следующее пространство имен:

http://www.w3.org/2002/07/owl#.

Обычно для этого пространства используется префикс owl.

6.3.5.1. Виды OWL

По степени реализации возможностей язык OWL имеет следующие три вида:

  •  OWL Lite (упрощенный OWL) – самый простой (для разработчиков как программных продуктов, так и приложений с использованием OWL) вид языка;
  •  OWL DL (OWL Description LogicsOWL с описательной логикой) – вид, разработанный для использования в бизнес-приложениях на основе логики первого порядка (описательной логики);
  •  OWL Full  (полный OWL) – вид для высококвалифицированных разработчиков приложений, обеспечивающий полную реализацию выразительность и синтаксическую свободу RDF но без гарантий того, что компьютерная обработка данных привет к определенному результату (кроме того, этот вид очень труден для реализации разработчиками программных продуктов).

Виды OWL не являются независимыми языками, а построены на принципе расширения возможностей, т.е. вид OWL DL включает в себя вид OWL Lite с расширением существующих возможностей и некоторыми дополнительными возможностями, а вид OWL Full – это версия OWL DL с дополнительными возможностями. Соответственно правильное логическое заключение, сделанное с использованием OWL Lite, является правильным логическим заключением в OWL DL, а правильное логическое заключение, сделанное в OWL DL, является правильным логическим заключением в OWL Full.  

Разработчики приложений, использующих OWL, должны решить, какой из видов лучше подходит к стоящим перед ним задачам. Выбор между OWL Lite и OWL DL зависит от того, насколько пользователям требуются более выразительные логические структуры для ограничений, предоставляемые OWL DL. Однако реализация в OWL DL требует большего времени как на разработку, так и на получение результата при обработке на компьютере. Выбор между OWL DL и OWL Full зависит, главным образом, от того, насколько пользователям требуются средства RDFS. Кроме того, при использовании OWL Full результат логического вывода требует большего времени вычисления, и результат не является гарантированным.

6.3.5.2. Структура документа OWL

Документ OWL – это документ на языке RDF/XML, который может содержать заголовок OWL, а также содержит определения классов, свойств и сведений о представителях классов. Представители классов (individuals) по терминологии OWL – это реализации (экземпляры) классов.

В качестве расширения файла с документом OWL можно использовать расширения .owl или .rdf. Значение MIME-типа данных для такого файла задается как

"application/rdf+xml".

Класс owl:Ontology используется для описания заголовка OWL, который в языке RDF/XML имеет следующий синтаксис:

<owl:Ontology rdf:about="ресурс">

 

</ >

В атрибуте rdf:about задается наименование онтологии или ссылка на онтологию. Если значение атрибута – пустая строка (""), то наименованием онтологии служит базовый URI экземпляра класса owl:Ontology. Как правило, это URI документа, содержащего онтологию. Исключение является случай, когда в элементе rdf:RDF задан атрибут xml:base, явно устанавливающий базовый URI документа.

Классами, определяющими  семантические свойства классов OWL, являются owl:AnnotationProperty  и owl:OntologyProperty. Оба этих класса являются подклассами класса rdf:Property (см. 6.3.3.1).

В элементе owl:Ontology могут быть заданы следующие информационные свойства RDFS (см. 6.3.3.1): rdfs:label и rdfs:comment, а также вспомогательные свойства RDFS (см. 6.3.3.7): rdfs:seeAlso и rdfs:isDefinedBy. Эти свойства одновременно являются экземплярами класса owl:AnnotationProperty.

Также в элементе owl:Ontology могут быть заданы следующие свойства OWL: owl:imports, owl:versionInfo, owl:priorVersion, owl:incompatibleWith и owl:backwardCompatibleWith.

Свойство owl:imports является экземпляром класса owl:OntologyProperty. Он определяет URI документа, импортируемого в данный документ. В результате импорта  в данный документ будет вставлено  содержимое импортируемого документа. Импорт документов может быть вложенным, т.е. импортируемый документ, в свою очередь, может содержать   другой импортируемый документ.

Значениями свойств rdfs:range и rdfs:domain для свойства owl:imports является owl:Ontology.

Свойство owl:versionInfo является экземпляром класса owl:AnnotationProperty. Обычно его объектом является строка, содержащая сведения о версии данной онтологии.

Свойство owl:priorVersion является экземпляром класса owl:OntologyProperty. Это свойство содержит ссылку на другую онтологию, которая таким образом рассматривается как предыдущая версия данной онтологии.

Значениями свойств rdfs:range и rdfs:domain для свойства owl:priorVersion является owl:Ontology.

Свойство owl:incompatibleWith является экземпляром класса owl:OntologyProperty. Это свойство содержит ссылку на другую онтологию, которая таким образом рассматривается как предыдущая версия данной онтологии, несовместимая с данной онтологией.

Значениями свойств rdfs:range и rdfs:domain для свойства owl:incompatibleWith является owl:Ontology.

Свойство owl:backwardCompatibleWith является экземпляром класса owl:OntologyProperty. Это свойство содержит ссылку на другую онтологию, которая таким образом рассматривается как предыдущая версия данной онтологии, совместимая с данной онтологией.

Значениями свойств rdfs:range и rdfs:domain для свойства owl:backwardCompatibleWith является owl:Ontology.

Если в классе owl:Ontology задано свойство owl:backwardCompatibleWith, то документ OWL может содержать классы owl:DeprecatedClass и owl:DeprecatedProperty, описывающие классы  и свойства предыдущей версии, которые в данной версии отменены или заменены другими классами и свойствами.

Класс owl:DeprecatedClass является подклассом класса rdfs:Class, а класс owl:DeprecatedProperty – подклассом класса rdf:Property.

Пример 6.3.26. Документ OWL с заголовком на языке RDF/XML:

<?xml version="1.0"?>

<!-- Описание сущностей документа -->

<!DOCTYPE rdf:RDF [

    <!ENTITY rdf  

"http://www.w3.org/1999/02/22-rdf-syntax-ns#" >

    <!ENTITY rdfs

"http://www.w3.org/2000/01/rdf-schema#" >

    <!ENTITY xsd  "http://www.w3.org/2001/XMLSchema#" >

    <!ENTITY owl  "http://www.w3.org/2002/07/owl#" >

  ]>

<rdf:RDF

  <!-- Задание префиксов пространств имен -->

  xmlns:owl ="&owl;"

  xmlns:rdf ="&rdf;"

  xmlns:rdfs="&rdfs;"

 <!-- Задание базового URI -->

xml:base  ="http://myOntology.edu/version1-1"

>

<owl:Ontology rdf:about="">

 <!-- Импортирование документа версии 1.0 --> 

   <owl:imports rdf:resource=

"http://myOntology.edu/version1-0"/>

    <!-- Ссылка на документацию -->

<rdfs:isDefinedBy rdf:resource=

"http://myOntology.edu/version1-1/doc"/>

  <rdfs:comment>

  <!-- Комментарий -->

Версия 1.1 онтологии myOntology</rdfs:comment>

 <!-- Описание версии -->

   <owl:versionInfo>myOntology, v1.1</versionInfo>

    <!-- Ссылка на предыдущую версию -->

<owl:priorVersion rdf:resource=

"http://myOntology.edu/version1-0"/>

  <!-- Несовместимость с версией 0.9 -->

<owl:incompatibleWith rdf:resource=

"http://myOntology.edu/version0-9"/>

  <!-- Обратная совместимость с версией 1.0 -->

< owl:backwardCompatibleWith rdf:resource=

"http://myOntology.edu/version1-0"/>

</Ontology>

 <!-- Описание отмененного класса Student -->

<owl:DeprecatedClass rdf:ID="Student">

   <!-- Комментарий -->

<rdfs:comment>Вместо класса Student рекомендуется

использовать класс Learner</rdfs:comment>

 <!-- Ссылка на эквивалентный класс

(см. ниже описание owl:equivalentClass) --> 

  <owl:equivalentClass rdf:resource="#Learner"/>        

</owl:DeprecatedClass>

<owl:Class rdf:ID="Learner">

<!-- Описание класса Learner -->

</owl:Class>

 <!-- Описание отмененного свойства hasParents -->

<owl:DeprecatedProperty rdf:ID="hasParents">

 <!-- Комментарий -->

  <rdfs:comment>Свойство hasParents

в версии 1.1 отменено</rdfs:comment>

</owl:DeprecatedProperty>

 </rdf:RDF>

6.3.5.3. Классы OWL

Как и классы RDF, классы OWL обеспечивают группирование ресурсов со сходными характеристиками. Каждый класс связан с набором представителей класса, называемым расширением класса. Представители класса в расширении класса называются экземплярами класса. Каждый класс имеет некоторый содержательный смысл, который связан, но не эквивалентен расширению класса, т.е. два класса могут имеет одинаковые расширения, но являться разными классами.

В языках OWL Lite и OWL DL представитель класса не может в то же время классом. Язык OWL Full может использовать возможность RDFS: класс может функционировать как экземпляр другого класса.

Классы OWL описываются с помощью описаний класса, которые затем комбинируются в аксиомы класса.

6.3.5.3.1. Описания класса

В языке OWL определены шесть типов описаний классов:

  •  с помощью идентификатора класса;
  •  с помощью перечисления представителей класса;
  •  с помощью ограничения свойств;
  •  с помощью пересечения двух и более описаний классов;
  •  с помощью объединения двух и более описаний классов;
  •  с помощью дополнения описания класса.

При использовании первого типа определения класс задается с определенным именем. В остальных типах класс задается как пустой узел со свойством rdf:type, чье значение равно owl:Class.  

6.3.5.3.1.1. Описание класса с помощью идентификатора

Описание класса с помощью идентификатора в нотации N3 задается следующим образом:

префикс:имя-класса rdf:type owl:Class,

где префикс – это префикс пространство имен, в котором определен новый класс с именем имя-класса.

В RDF/XML класс задается с помощью элемента owl:Class с атрибутом rdf:ID.

Класс owl:Class является подклассом класса rdfs:Class. Класс owl:Class в OWL Lite и OWL DL имеет одно существенное ограничение по сравнению с классом rdfs:Class: класс не может одновременно являться экземпляром своего класса.   В OWL Full этого ограничения нет, и оба класса считаются эквивалентными.

Два класса с идентификаторами Thing и Nothing в языке OWL являются предопределенными.

Расширением класса для owl:Thing является набор всех представителей этого класса, а расширением класса owl:Nothing является пустой набор. Соответственно каждый класс OWL является подклассом owl:Thing, а класс owl:Nothing является подклассом каждого класса.

Пример 6.3.27. Объявление класса OWL в языке RDF/XML:

Объявление класса OWL с именем Office:

<owl:Class rdf:ID="Office"/>.

6.3.5.3.1.2. Описание класса с помощью перечисления

Описание класса с помощью перечисления выполняется с помощью свойства owl:oneOf. Значением этого свойства является список представителей класса (его экземпляров).

Значениями свойств rdfs:range и rdfs:domain для свойства owl:oneOf являются соответственно rdf:List и owl:Class.

Список представителей класса задается в RDF/XML с помощью атрибута rdf:parseType="Collection".

Объявить класс по перечислению можно только в языках OWL DL и OWL Full.

Пример 6.3.28. Объявление класса OWL по перечислению в языке RDF/XML:

Объявление класса OWL, представителями которого являются цвета RGB:

<owl:Class>

 <owl:oneOf rdf:parseType="Collection">

   <owl:Thing rdf:about="#Red"/>

   <owl:Thing rdf:about="#Green"/>

   <owl:Thing rdf:about="#Blue"/>

 </owl:oneOf>

</owl:Class>.

6.3.5.3.1.3. Описание класса с помощью ограничения свойств

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

Ограничения определяются с помощью класса owl:Restriction, являющегося подклассом класса owl:Class.

Значение ограничения (ресурс или литерал) задаются с помощью свойства owl:onProperty. Значениями свойств rdfs:range и rdfs:domain для этого свойства являются соответственно rdf:Property и owl:Restriction.

Для ограничения может быть задано только одно свойство owl:onProperty.

В RDF/XML ограничение задается с помощью элемента owl:Restriction, в который вложен элемент owl:onProperty.

В OWL определены два вида ограничения свойств: ограничения по значению (value constraints) и ограничения по мощности (cardinality constraints).

Ограничения по значению задают диапазон свойства, используемого в описании данного класса. В OWL определены следующие свойства ограничения по значению: owl:allValuesFrom, owl:someValuesFrom, и owl:hasValue.

Значениями свойств rdfs:range и rdfs:domain для этих свойств являются соответственно rdf:Class и owl:Restriction.

В OWL Lite единственным типом описания класса, допустимым в качестве объекта в свойствах ограничения по значению является имя класса.

Свойство owl:allValuesFrom связывает ограничиваемый класс либо с описанием класса, либо с диапазоном данных. Это свойство используется для описания класса всех представителей, для которых все значения свойства либо описания классов, либо значения данных в заданном диапазоне.

Пример 6.3.29. Использование свойства owl:allValuesFrom в языке RDF/XML:

Описание ограничения класса hasColor, представителями которого являются только  значения класса RGBColor (цвета RGB):

<owl:Restriction>

  <owl:onProperty rdf:resource="#hasColor"/>

  <owl:allValuesFrom rdf:resource="#RGBColor"/>

</owl:Restriction>.

Свойство owl:someValuesFrom связывает ограничиваемый класс либо с описанием класса, либо с диапазоном данных. Это свойство используется для описания класса всех представителей, для которых по крайней мере одно значение свойства – экземпляр либо описания класса, либо значения данных в заданном диапазоне.

Пример 6.3.30. Использование свойства owl:someValuesFrom в языке RDF/XML:

Описание ограничения класса hasColor, среди представителей которого имеется, по крайней мере, один представитель для белого цвета (whiteColor):

<owl:Restriction>

  <owl:onProperty rdf:resource="#hasColor"/>

  <owl:allValuesFrom rdf:resource="#whiteColor"/>

</owl:Restriction>.

Свойство owl:hasValue связывает ограничиваемый класс с заданным значением, которое является либо представителем класса, либо значением данных. Это свойство используется для описания класса всех представителей, для которых по крайней мере одно значение свойства – экземпляр либо описания класса, либо значения данных в заданном диапазоне.

Пример 6.3.31. Использование свойства owl:hasValue в языке RDF/XML:

Описание ограничения класса hasColor, среди представителей которого имеется ссылка на представитель класса для черного цвета (blackColor):

<owl:Restriction>

  <owl:onProperty rdf:resource="#hasColor"/>

  <owl:hasValue rdf:resource="#blackColor"/>

</owl:Restriction>.

Ограничение по мощности задает количество значений, которое может иметь свойство. В OWL определены следующие свойства ограничения по мощности: owl:maxCardinality, owl:minCardinality, и owl:Cardinality.

Значениями свойств rdfs:range и rdfs:domain для этих свойств являются соответственно xsd:nonNegativeInteger и owl:Restriction.

В OWL Lite свойства ограничения по мощности могут иметь только значения "0" и "1".

Свойство owl:maxCardinality связывает ограничиваемый класс со значением данных, принадлежащим к пространству значений типа  nonNegativeInteger схемы XML. Свойство описывает класс всех представителей, который имеет самое большее N различных значений, где N – значение ограничения мощности.

В RDF/XML ограничение задается как значение элемента owl:maxCardinality с атрибутом rdf:datatype, который имеет значение "&xsd;nonNegativeInteger".

 

Пример 6.3.32. Использование свойства owl:maxCardinality в языке RDF/XML:

Описание ограничения класса SmallOfficeStaff, который имеет самое большее 10 представителей:

<owl:Restriction>

  <owl:onProperty rdf:resource="#SmallOfficeStaff"/>

  <owl:maxCardinality rdf:datatype=

"&xsd;nonNegativeInteger">10</owl:maxCardinality>

</owl:Restriction>.

Свойство owl:minCardinality связывает ограничиваемый класс со значением данных, принадлежащим к пространству значений типа  nonNegativeInteger схемы XML. Свойство описывает класс всех представителей, который имеет самое меньшее N различных значений, где N – значение ограничения мощности.

В RDF/XML ограничение задается так же, как для элемента owl:maxCardinality.

 

Пример 6.3.33. Использование свойства owl:minCardinality в языке RDF/XML:

Описание ограничения класса BigOfficeStaff, который имеет самое меньшее 100 представителей:

<owl:Restriction>

  <owl:onProperty rdf:resource="#SmallOfficeStaff"/>

  <owl:minCardinality rdf:datatype=

"&xsd;nonNegativeInteger">100</owl:minCardinality>

</owl:Restriction>.

Свойство owl:cardinality связывает ограничиваемый класс со значением данных, принадлежащим к пространству значений типа  nonNegativeInteger схемы XML. Свойство описывает класс всех представителей, который имеет точно N различных значений, где N – значение ограничения мощности.

В RDF/XML ограничение задается так же, как для элемента owl:maxCardinality.

 

Пример 6.3.34. Использование свойства owl:cardinality в языке RDF/XML:

Описание ограничения класса SomeOfficeStaff, который имеет точно 8 представителей:

<owl:Restriction>

  <owl:onProperty rdf:resource="#SmallOfficeStaff"/>

  <owl:cardinality rdf:datatype=

"&xsd;nonNegativeInteger">8</owl:cardinality>

</owl:Restriction>.

6.3.5.3.1.4. Описание класса с помощью пересечения

Описание класса с помощью пересечения (операция AND – логическое И) выполняется с помощью свойства owl:intersectionOf, связывающего класс со списком описаний классов. Это свойство описывает безымянный класс, в котором расширение содержит только те представители, которые содержатся во всех расширениях в описании классов в списке.

Значениями свойств rdfs:range и rdfs:domain для свойства owl:intersectionOf являются соответственно rdf:List и owl:Class.

В OWL Lite значения свойство owl:intersectionOf  могут быть только идентификаторами класса и/или ограничениями свойств.

Пример 6.3.36. Использование свойства owl:intersectionOf в языке RDF/XML:

Описание ограничений, являющихся пересечением двух коллекций цветов, для класса:

<owl:Class>

  <owl:intersectionOf rdf:parseType="Collection">

     <owl:Class>

   <!-- Коллекция из двух элементов:

черного и красного цвета -->

       <owl:oneOf rdf:parseType="Collection">

          <owl:Thing rdf:about="#blackColor"/>

          <owl:Thing rdf:about="#redColor"/>

       </owl:oneOf>

     </owl:Class>

     <owl:Class>

   <!-- Коллекция из четырех элементов:

красного, зеленого, синего

и белого цветов -->

       <owl:oneOf rdf:parseType="Collection">

          <owl:Thing rdf:about="#redColor"/>

          <owl:Thing rdf:about="#greenColor"/>

   <owl:Thing rdf:about="#blueColor"/>

   <owl:Thing rdf:about="#whiteColor"/>

       </owl:oneOf>

     </owl:Class>

  </owl:intersectionOf>

</owl:Class>.

Этот класс будет иметь только одного представителя – redColor (красный цвет), поскольку только этот представитель содержится в обоих списках.

6.3.5.3.1.5. Описание класса с помощью объединения

Описание класса с помощью объединения (операция OR – логическое ИЛИ) выполняется с помощью свойства owl:unionOf, связывающего класс со списком описаний классов. Это свойство описывает безымянный класс, в котором расширение содержит все представители, которые содержатся хотя бы в одном из расширений класса в описании классов в списке.

Значениями свойств rdfs:range и rdfs:domain для свойства owl:unionOf являются соответственно rdf:List и owl:Class.

Свойство owl:unionOf можно использовать только в OWL DL и OWL Full.

Пример 6.3.36. Использование свойства owl:unionOf в языке RDF/XML:

Описание ограничений, являющихся объединением двух коллекций цветов, для класса:

<owl:Class>

  <owl:unionOf rdf:parseType="Collection">

     <owl:Class>

   <!-- Коллекция из двух элементов:

черного и красного цвета -->

       <owl:oneOf rdf:parseType="Collection">

          <owl:Thing rdf:about="#blackColor"/>

          <owl:Thing rdf:about="#redColor"/>

       </owl:oneOf>

     </owl:Class>

     <owl:Class>

   <!-- Коллекция из четырех элементов:

красного, зеленого, синего

и белого цветов -->

       <owl:oneOf rdf:parseType="Collection">

          <owl:Thing rdf:about="#redColor"/>

          <owl:Thing rdf:about="#greenColor"/>

   <owl:Thing rdf:about="#blueColor"/>

   <owl:Thing rdf:about="#whiteColor"/>

       </owl:oneOf>

     </owl:Class>

  </owl:unionOf>

</owl:Class>.

Этот класс содержит пять представителей: blackColor (черный цвет), redColor (красный цвет), greenColor (зеленый цвет), blueColor (синий цвет) и whiteColor (белый цвет), т.е. представителями класса является сумма представителей обоих списков (представитель redColor есть в обоих списках, но в суммарном списке он будет представлен только один раз).

6.3.5.3.1.6. Описание класса с помощью дополнения

Описание класса с помощью дополнения (операция NOT – логическое НЕ) выполняется с помощью свойства owl:complementOf, описывающего класс, для которого  содержит только те представители, которые не принадлежат к расширению класса, являющегося объектом предложения.

Значениями свойств rdfs:range и rdfs:domain для свойства owl:complementOf являются соответственно rdf:List и owl:Class.

Свойство owl:complementOf можно использовать только в OWL DL и OWL Full.

Пример 6.3.37. Использование свойства owl:complementOf в языке RDF/XML:

Описание ограничения, являющегося дополнением для класса:

<owl:Class>

 <owl:complementOf>

   <owl:Class rdf:about="#greyColor"/>

 </owl:complementOf>

</owl:Class>.

Расширение этого класса содержит всех тех представителей, которые не принадлежат классу greyColor.

6.3.5.3.2. Аксиомы классов

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

Для комбинирования описания класса в аксиому класса используются следующие свойства: rdfs:subClassOf, owl:equivalentClass и owl:disjointWith.

Свойство rdfs:subClassOf, определенное в RDFS (см. 6.3.3.2), задает, что расширение класса в описании класса является подмножеством расширения класса в описании другого класса.

Пример 6.3.38. Использование свойства rdfs:subClassOf в аксиоме класса: 

<owl:Class rdf:ID="RGBColor">

   <!-- Класс RGBColor является подклассом

класса Color -->

<rdfs:subClassOf rdf:resource="#Color"/>

 <!-- Ограничения на свойство hasValue

класса RGBColor: один из трех цветов:

красный, зеленый или синий -->

  <rdfs:subClassOf>

     <owl:Restriction>

       <owl:onProperty rdf:resource="#hasValue"/>

       <owl:someValuesFrom>

          <owl:Class>

            <owl:oneOf rdf:parseType=

"Collection">

               <owl:Thing rdf:about=

"#RedColor"/>

     <owl:Thing rdf:about=

"#GreenColor"/>

<owl:Thing rdf:about=

"#BlueColor"/>

                      </owl:oneOf>

          </owl:Class>

       </owl:someValuesFrom>

     </owl:Restriction>

  </rdfs:subClassOf>

 <!-- Класс RGBColor является дополнением 

к классу CMYKColor -->

  <rdfs:subClassOf>

     <owl:Class>

       <owl:complementOf rdf:resource="#CMYKColor"/>

     </owl:Class>

  </rdfs:subClassOf>

</owl:Class>

Свойство owl:equivalentClass связывает описание данного класса с описанием другого класса. Использование этого свойства в аксиоме означает, что оба класса имеют одинаковое расширение, т.е. оба расширения класса содержат одинаковый набор представителей.

Значением свойств rdfs:range и rdfs:domain для свойства owl:equivalentClass является owl:Class.

Пример 6.3.39. Использование свойства owl:equivalentClass в аксиоме класса:

1. Объявление именованного класса BaseColor эквивалентным именованному классу RGBColor:

<owl:Class rdf:about="#BaseColor">

  <owl:equivalentClass rdf:resource="#RGBColor"/>

</owl:Class>

2. Объявление именованного класса CMYKColor эквивалентным безымянному вложенному классу, содержащему расширение из четырех представителей: CyanColor (циановый цвет), MagentaColor (фиолетовый цвет), YellowColor (желтый цвет) и BlackColor (черный цвет):

<owl:Class rdf:ID="CMYKColor">

  <owl:equivalentClass>

     <owl:Class>

       <owl:oneOf rdf:parseType="Collection">

          <owl:Thing rdf:about="#CyanColor"/>

          <owl:Thing rdf:about="#MagentaColor"/>

          <owl:Thing rdf:about="#YellowColor"/>

   <owl:Thing rdf:about="#BlackColor"/>

       </owl:oneOf>

     </owl:Class>

  </owl:equivalentClass>

</owl:Class>

3. В RDF/XML можно задать эквивалентность определяемого класса и вложенного класса в сокращенной форме (без использования элемента owl:equivalentClass). Предыдущий пример при использовании сокращенной формы будет иметь следующий вид:

<owl:Class rdf:ID="CMYKColor">

  <owl:oneOf rdf:parseType="Collection">

        <owl:Thing rdf:about="#CyanColor"/>

        <owl:Thing rdf:about="#MagentaColor"/>

        <owl:Thing rdf:about="#YellowColor"/>

 <owl:Thing rdf:about="#BlackColor"/>

     </owl:oneOf>

</owl:Class>

Свойство owl:disjointWith связывает описание данного класса с описанием другого класса. Использование этого свойства в аксиоме означает, что расширения двух  классов не имеют общих представителей.

Значением свойств rdfs:range и rdfs:domain для свойства owl:disjointWith является owl:Class.

Пример 6.3.40. Использование свойства owl:disjointWith в аксиоме класса:

Объявление об отсутствии общих представителей в классах  CMYKColor и RGBColor:

<owl:Class rdf:about="#CMYKColor">

  <owl:disjointWith rdf:resource="#RGBColor"/>

</owl:Class>.

6.3.5.4. Свойства OWL

В языке OWL определены следующие категории свойств:

  •  свойства онтологий (ontology properties);
  •  свойства аннотаций (annotation properties);
  •  свойства объектов (object properties);
  •  свойства типизированных данных (datatype properties).

Классами, определяющими  свойства онтологий и аннотаций, являются owl:AnnotationProperty  и owl:OntologyProperty, рассмотренные в разд. 6.3.5.2.

Свойства объектов в OWL определяются как экземпляры класса owl:ObjectProperty, а свойства типизированных данных – как экземпляры класса owl:DatatypeProperty. Оба этих класса являются подклассами класса rdf:Property (см. 6.3.3.1).

В языке OWL Full свойства объектов и свойства типизированных данных не являются взаимоисключающими, поскольку значения данных можно рассматривать как представления. Поэтому в OWL Full класс owl:ObjectProperty эквивалентен классу rdf:Property.

Аксиома свойства определяет характеристики свойства.

В простейшем случае аксиома свойства просто задает существование свойства, например

<owl:ObjectProperty rdf:ID="hasValue"/>.

Однако чаще аксиомы свойства задают дополнительные характеристики свойств. В языке OWL поддерживаются следующие конструкции для характеристик свойств:

  •  свойства RDFS;
  •  отношения к другим свойствам;
  •  глобальные ограничения мощности;
  •  характеристики логических свойств.

Свойства RDFS – rdfs:subPropertyOf, rdfs:domain и rdfs:range рассмотрены в разд. 6.3.3.1.

В OWL DL субъект и объект подсвойства должны быть оба либо свойствами типизированных данных, либо свойствами объектов.

В  OWL Lite значением свойства rdfs:domain и rdfs:range должен быть только идентификатор класса.

Остальные конструкции для характеристик свойств рассматриваются ниже.

6.3.5.4.1. Отношения к другим свойствам

Для задания отношения к другим свойствам в языке OWL используются свойства owl:equivalentProperty и owl:inverseOf.

Свойство owl:equivalentProperty используется для указания того, что два свойства имеют одинаковое расширение.

Значением свойств rdfs:range и rdfs:domain для свойства owl:equivalentProperty является rdf:Property.

Пример 6.3.41. Использование свойства owl:equivalentProperty:

Объявление об эквивалентности свойств   hasColorValue и hasValue:

<owl:ObjectProperty rdf:ID="hasColorValue">

  < owl:equivalentProperty rdf:resource="#hasValue"/>

</owl:ObjectProperty>.

Свойство имеет направление – от домена к диапазону. Иногда необходимо определить отношения в обоих направления. Например, для отношения человек владеет автомашиной обратным является отношение автомашина принадлежит человеку.

Свойство owl:inverseOf формирует обратное отношение для свойства или, более строго, аксиома

P1 owl:inverseOf P2

утверждает, что для каждой пары (x,y) в расширении P1существует пара (y,x) в расширении P2, и наоборот, т.е. свойство owl:inverseOf является симметричным

Значением свойств rdfs:range и rdfs:domain для свойства owl:inverseOf является owl:ObjectProperty.

Пример 6.3.41. Использование свойства owl:inverseOf:

Объявление об том, что у свойства hasDescendant (имеет потомка) существует обратное свойство hasAncestor (имеет предка):

<owl:ObjectProperty rdf:ID="hasDescendant">

  <owl:inverseOf rdf:resource="#hasAncestor"/>

</owl:ObjectProperty>.

6.3.5.4.2. Глобальные ограничения мощности

Глобальные ограничения мощности задаются с помощью классов owl:FunctionalProperty и owl:InverseFunctionalProperty.

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

Класс owl:FunctionalProperty определяет так называемое функциональное свойство, т.е. свойство, которое имеет одно (уникальное) значение y для каждого значения x, т.е. нет такой пары значений y1 и y2, таких, что пары (x,y1) и  (x,y2) обе являются экземплярами свойства. Функциональным свойством может быть как свойство объекта, так и свойство типизированного данного. Класс owl:FunctionalProperty является специальным подклассом класса rdf:Property.

Пример 6.3.42. Использование класса owl:FunctionalProperty:

1. Объявление об том, что свойство объекта  fillColor (цвет фона) является функциональным, т.е. для ресурса свойство может принимать одно из значений, определенных в классе  RGBColor:

<owl:ObjectProperty rdf:ID="fillColor">

  <rdf:type    rdf:resource="&owl;FunctionalProperty"/>

  <rdfs:domain rdf:resource="#Shape"/>

  <rdfs:range  rdf:resource="#RGBColor"/>

</owl:ObjectProperty>.

2. Более краткая запись предыдущего примера:

<owl:ObjectProperty rdf:ID="fillColor">

  <rdfs:domain rdf:resource="#Shape" />

  <rdfs:range  rdf:resource="#RGBColor" />

</owl:ObjectProperty>

<owl:FunctionalProperty rdf:about="#fillColor" />.

Если свойство объявляется обратно функциональным, то объект в утверждении для свойства однозначно определяет субъект (некоторое представление класса). Более точно, если задано утверждение, что P – это обратное функциональное свойство, оно предполагает, что значение y может быть значением P для одного экземпляра x, т.е. не может быть двух различных экземпляров x1 и x2 таких, что обе пары (x1,y) и (x2,y) являются экземплярами P.  Обратное функциональное свойство соответствует понятию ключа в базе данных.

Аксиома обратного функционального свойства задается объявлением свойства как экземпляра класса owl:InverseFunctionalProperty, который является подклассом класса owl:ObjectProperty. По своему определению обратными функциональными свойствами могут быть только свойства объектов.

Поскольку в OWL Full свойства типизированных данных являются подклассами свойств объектов, обратное функциональное свойство может быть определено и для свойств типизированных данных. Такое определение недопустимо в OWL Lite и OWL DL.

Пример 6.3.43. Использование класса owl:InverseFunctionalProperty:

Объявление об том, что каждый объект предложений birthRegion (представитель класса Person) может однозначно идентифицировать субъект (представитель класса Region):

<owl:InverseFunctionalProperty rdf:ID="birthRegion">

  <rdfs:domain rdf:resource="#Region"/>

  <rdfs:range rdf:resource="#Person"/>

</owl:InverseFunctionalProperty>.

6.3.5.4.3. Характеристики логических свойств

Характеристики логических свойств (транзитивное или симметричное свойство) задаются с помощью классов owl:TransitiveProperty и owl:SymmetricProperty.

Если свойство P задается как транзитивное, это означает, что если пара (x,y) является экземпляром P и пара (y,z) также является экземпляром P, то пара (x,z) – тоже экземпляр P.

Аксиома транзитивного свойства задается объявлением свойства как экземпляра класса owl:TransitiveProperty, который является подклассом класса owl:ObjectProperty.

В OWL DL для транзитивного свойства нельзя задавать ограничения мощности (ни локальные, ни глобальные) ни для свойств или их суперсвойств, ни для обратных свойств или их суперсвойств.

Пример 6.3.44. Использование класса owl:TransitiveProperty:

1. Объявление транзитивного свойства descendantOf (потомок):

<owl:TransitiveProperty rdf:ID="descendantOf">

  <rdfs:domain rdf:resource="#Person"/>

  <rdfs:range  rdf:resource="#Person"/>

</owl:TransitiveProperty>.

Пусть Иванов Иван Петрович, Иванов Петр Александрович и Иванов Александр Николаевич являются представителями класса Person. Тогда, если для Иванова Петра Александровича значение свойства descendantOf (потомок) равно  Иванов Иван Петрович, и для Иванова Александра Николаевича значение свойства descendantOf (потомок) равно  Иванов Петр Александрович, то тогда, в силу транзитивности свойства descendantOf при семантической обработке документа можно сделать вывод, что Иванов Иван Петрович является потомком Иванова Александра Николаевича.    

2. Поскольку owl:TransitiveProperty является подклассом owl:ObjectProperty, предыдущий пример можно записать в следующей эквивалентной форме:

<owl:ObjectProperty rdf:ID="descendantOf">

  <rdf:type rdf:resource="&owl;TransitiveProperty"/>

  <rdfs:domain rdf:resource="#Person"/>

  <rdfs:range  rdf:resource="#Person"/>

</owl:ObjectProperty>.

Симметричное свойство – это свойство, для которого предполагается, что если пара (x,y) является экземпляром P, тогда пара  (y,x) – также экземпляр P.

Аксиома симметричного свойства задается объявлением свойства как экземпляра класса owl:SymmetricProperty, который является подклассом класса owl:ObjectProperty.

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

Пример 6.3.45. Использование класса owl:SymmetricProperty:

1. Объявление транзитивного свойства brotherOf (брат):

<owl:SymmetricProperty rdf:ID="brotherOf">

  <rdfs:domain rdf:resource="#Person"/>

  <rdfs:range  rdf:resource="#Person"/>

</owl:SymmetricProperty>.

Пусть для Иванов Иван Петрович значение свойства brotherOf равно  Иванов Константин Петрович, т.е.  Иванов Иван Петрович является братом Иванова Константина Петровича. Тогда, в силу симметричности свойства brotherOf при семантической обработке документа можно сделать вывод, что и  Иванов Константин Петрович является братом Иванова Ивана Петровича.

6.3.5.5. Представители классов в OWL

Представители классов в языке OWL определяются с помощью специальных аксиом, также называемых фактами. В OWL для представителей определены два типа фактов:

  •  факты о принадлежности к классу и значениях свойств;
  •  факты о тождественности представителей.

Факты о принадлежности к классу и значении свойств просто задают имя представителя, класс, экземпляром которого является представитель и набор значений свойств представителя, аналогично заданию экземпляров класса в RDFS (см. пример 6.3.13 и пример 6.3.14).  

Представитель класса не обязательно может иметь имя, он может быть и безымянным. В этом случае в элементе определения представителя не задается атрибут rdf:ID.

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

В языке OWL определены три конструкции для задания факта тождественности представителей: owl:sameAs, owl:differentFrom и owl:AllDifferent.

Свойство owl:sameAs связывает двух представителей отношением тождественности, т.е. ссылки URI в них указывают на один и тот же ресурс.

Значением свойств rdfs:range и rdfs:domain для свойства owl:sameAs является rdf:Thing.

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

В OWL Full класс рассматривается одновременно и как свой представитель, поэтому в нем можно задавать тождественность классов, т.е. два класса считаются тождественными, если они реализованы по-разному, но имеют одинаковое содержательное значение.

Пример 6.3.46. Использование свойства owl:sameAs:

1. Объявление тождественности ссылки на ресурс Kiev и ссылки на ресурс CapitalOfUkraine, поскольку Киев является столицей Украины:

<rdf:Description rdf:about="#Kiev">

  <owl:sameAs rdf:resource="#CapitalOfUkraine"/>

</rdf:Description>.

2. Объявление тождественности классов Employee и Person (только в OWL Full):

<owl:Class rdf:ID="Employee">

  <owl:sameAs rdf:resource=

"http://www.officeComp.com/office#Person"/>

</owl:Class>.  

Свойство owl:differentFrom указывает, что два представителя не тождественны друг другу, т.е. ссылки URI в них указывают на разные ресурсы.

Значением свойств rdfs:range и rdfs:domain для свойства owl:differentFrom является rdf:Thing.

Пример 6.3.47. Использование свойства owl:differentFrom:

Задания представителя класса с именем studIvanov1, отличного от представителей studIvanov2 и studIvanov3: (см. пример 6.3.14).

<!-- Задание представителя класса Student 

c именем studIvanov1 -->

<inst:Student rdf:ID="studIvanov1">

 <!-- Задание полного имени -->

<inst:fullName>

 <inst:firstName rdf:datatype="&xsd;token">

 Иван</inst:firstName>

<inst:surName rdf:datatype="&xsd;token">

 Иванович</inst:surName>

<inst:secondName rdf:datatype="&xsd;token">

 Иванов</inst:secondName>

</inst:fullName>

 <!-- Задание даты рождения -->

<inst:birthDate rdf:datatype="&xsd;date">

1991-05-17</birthDate>

 <!-- Представитель studIvanov1 отличается

от представителей studIvanov2 и studIvanov3 -->

<owl:differentFrom rdf:resource="#studIvanov2"/>

<owl:differentFrom rdf:resource="#studIvanov3"/>

</inst:Student>.

В тех онтологиях, где предполагается уникальность имен, использование свойства owl:differentFrom может привести к большому количеству предложениях, задающих отличие одного представления от другого.  Для таких случаев в OWL введен класс owl:AllDifferent, для которого определено свойство owl:distinctMembers, связывающее экземпляр owl:AllDifferent со списком представителей (это свойство может использоваться только как субъект owl:AllDifferent). В этом списке указываются все представители, отличающиеся друг от друга.

Значениями свойств rdfs:range и rdfs:domain для свойства owl:distinctMembers являются соответственно rdf:List и owl:AllDifferent.

Пример 6.3.48. Использование класса owl:AllDifferent и свойства owl:distinctMembers:

Зададим всех отличных друг от друга представителей класса Student, указанных в примере 6.3.47,   в одном списке в элементе owl:AllDifferent:

<owl:AllDifferent>

  <owl:distinctMembers rdf:parseType="Collection">

     <inst:Student rdf:about="#studIvanov1"/>

     <inst:Student rdf:about="#studIvanov2"/>

 <inst:Student rdf:about="#studIvanov3"/>

  </owl:distinctMembers>

</owl:AllDifferent>.

6.3.5.6. Перечислимые данные в OWL

В OWL можно использовать все типы данных, определенные в RDF. Кроме этого, в OWL DL и OWL Full можно использовать перечислимые данные, т.е. данные, задающиеся списками своих значений. Эти данные задаются в OWL с помощью свойства owl:oneOf (см. 6.3.5.3.1.2) и класса rdf:List (см. 6.3.3.5).

Пример 6.3.49. Использование перечислимых данных в OWL DL и OWL Full:

Задание  свойства типизированного данного (экзаменационные оценки), содержащего список из трех оценок: 4, 4 и 5:

<owl:DatatypeProperty rdf:ID="examMarks">

 <rdfs:range>

   <owl:DataRange>

 <!-- Задание списка оценок -->

     <owl:oneOf>

   <!-- Задание первой оценки -->

       <rdf:List>

         <rdf:first rdf:datatype=

    "&xsd;positiveInteger">4</rdf:first>

         <rdf:rest>

           <rdf:List>

      <!-- Задание второй оценки -->

             <rdf:first rdf:datatype=

   "&xsd;positiveInteger">4</rdf:first>

             <rdf:rest>

   <!-- Задание последней (третьей)

оценки -->

               <rdf:List>

            <rdf:first rdf:datatype=

                 "&xsd;positiveInteger">5</rdf:first>

                 <rdf:rest rdf:resource="&rdf;nil"/>

               </rdf:List>

             </rdf:rest>

           </rdf:List>

         </rdf:rest>

       </rdf:List>

     </owl:oneOf>

   </owl:DataRange>

 </rdfs:range>

</owl:DatatypeProperty>.

6.3.6. Язык SPARQL

Протокол SPARQL и язык запросов RDF – SPARQL (SPARQL Protocol and RDF Query Language), разработанный консорциумом W3C, определяет протокол для передачи запросов клиентов обработчикам запросов и язык (типа языка SQL) формирования запросов на выборку и модификацию данных в RDF, RDFS и OWL. Рекомендации по языку SPARQL были приняты консорциумом W3C в январе 2008 года.

6.3.6.1. Элементы языка SPARQL

Запрос SPARQL является текстовым документом в кодировке Unicode, либо в другой кодировке, поддерживаемым программным средством обработки запросов.

Файлы с запросами SPARQL имеют расширение .rq. Значение MIME-типа данных для такого файла задается как

"application/sparql-query".

Для языка SPARQL определены следующие элементы:

  •  IRI;
  •  уточненные имена;
  •  пробельные символы;
  •  литералы;
  •  переменные запроса;
  •  пустые узлы;
  •  шаблоны триплетов;
  •  базовые шаблоны графов;
  •  ключевые слова;
  •  комментарии.

В языке SPARQL используется интернационализированный идентификатор ресурса – IRI (Internationalized Resource Identifier), позволяющий, в отличие от универсального идентификатора ресурса – URI (Uniform Resource Identifier), задавать в идентификаторе не только латинские буквы, цифры и некоторое другие символы, но и символы кодировки Unicode (в частности, буквы кириллицы). В SPARQL определено следующее ограничение для IRI: в идентификаторе не должны использоваться символы "<", ">", '"', пробел, "{", "}", "|", "\", "^" и "`".

В языке SPARQL IRI заключаются в угловые скобки "<" и ">", например:

<http://purl.org/dc/elements/1.1/>.

Ссылки IRI в запросе SPARQL могут быть как абсолютными, так и относительными.

Уточненные имена задаются в виде:

префикс-пространства-имен:локальное-имя,

например, dc:creator.

Если для локального имени задано пространство имен по умолчанию, префикс пространства имен не указывается, например, :name.

В SPARQL используются следующие пробельные символы: символ пробела (код "20"), символ горизонтальной табуляции (код "09"), символ возврата каретки (код "0D") и символ перехода на новую строку (код "0A").

Литералы в SPARQL заключаются в двойные или одиночные апострофы, за которыми может следовать метка языка, образуемая символом "@", за которым задается код языка.

Примеры литералов: "abcd", 'Строка 1'@ru, "String 1"@en.

Если литералы содержат апострофы или символ перевода на новую строку, то они заключаются в три двойных или одиночных апострофа, например:

'''Символ '<' задает начало IRI,

а символ '>' – его окончание.'''.

В литералах можно задавать следующие специальные символы:

  •  '\t' – горизонтальная табуляция (код "U+0009");
  •  '\n' – переход на новую строку (код "U+000A");
  •  '\n' – возврат каретки (код "U+000D");
  •  '\b' – удаление предыдущего символа (код "U+0008");
  •  '\f' – переход к новой странице (код "U+000C");
  •  '\"' – двойной апостроф (код "U+0022");
  •  "\'" – одиночный апостроф (код "U+0027");
  •  '\\' – обратный слеш (код "U+005C").

В SPARQL можно также задавать типизированные литералы, т.е. литералы, содержащие данные определенного типа. Для этого после литерала вставляются символы "^^", после которых либо задается ссылка на IRI для типа данных, либо задается уточненное имя типа данных, например:

"ТИ-81"^^<http://www.someInstitute.edu/ns/groupDatatype> 

или

"2008-09-01"^^xsd:date.

В SPARQL в качестве типов литералов можно использовать следующие типы схемы XML: xsd:integer, xsd:decimal, xsd:float, xsd:double, xsd:string, xsd:boolean, xsd:dateTime и xsd:date.

Кроме этого, при вызове функций и выполнении операторов в аргументах функций можно использовать следующие числовые типы схемы XML: xsd:nonPositiveInteger, xsd:negativeInteger, xsd:long, xsd:int, xsd:short, xsd:byte, xsd:nonNegativeInteger, xsd:unsignedLong, xsd:unsignedInt, xsd:unsignedShort, xsd:unsignedByte и xsd:positiveInteger.

Для целых чисел (тип xsd:integer), чисел с десятичной точкой (тип xsd:decimal), чисел в экспоненциальной форме (тип xsd:double), а также булевских значений  true or false (тип xsd:boolean) можно просто задать значение литерала без указания типа и без ограничивающих апострофов, например, 15, 2.72, 4.7e-3 или true.

В SPARQL определен также нулевой литерал (ресурс rdf:nil), который в сокращенной форме записывается как "()".  

Переменные запроса задаются в SPARQL как идентификаторы XML, перед которыми задается префикс  или префикс "?", например $x1 или ?x1 (это одна и та же переменная). Переменные в SPARQL имеют глобальную область видимости, т.е. доступны в любом месте запроса.

Пустые узлы задаются в виде _:метка-узла, например,

_:emptyNode1 dc:creator "Иванов И.И."^^xsd:token ..

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

[ dc:creator "Иванов И.И."^^xsd:token ] .,

либо указав скобки "[]" перед предикатом и объектом, например,

[] dc:creator "Иванов И.И."^^xsd:token ..

Пустой узел без метки может задаваться как субъект следующего шаблона триплета, например:

[ dc:creator "Иванов И.И."^^xsd:token ]

dc:contributor "Петров П.П."^^xsd:token .,

что эквивалентно следующим двум триплетам:

_:emptyNode1 dc:creator "Иванов И.И."^^xsd:token  

_:emptyNode1 dc:contributor "Петров П.П."^^xsd:token ..

Пустой узел без метки может также задаваться как объект предыдущего шаблона триплета, например:

prog:statProg dc:subject

[ dc:creator "Иванов И.И."^^xsd:token ] .,

что эквивалентно следующим двум триплетам: 

prog:statProg dc:subject _:emptyNode1

_:emptyNode1 dc:creator "Иванов И.И."^^xsd:token ..

В SPARQL используются следующие пробельные символы: символ пробела (код "U+0020"), символ горизонтальной табуляции (код "U+0009"), символ возврата каретки (код "U+000D") и символ перехода на новую строку (код "U+000A").

Шаблоны триплетов состоят из трех компонент: субъекта, предиката и объекта.

Субъект триплета может быть либо переменной, либо литералом, либо пустым узлом, либо ссылкой на IRI (IRIref).

Предикат триплета может быть либо переменной, либо ссылкой на IRI (IRIref).

Объект триплета может быть либо переменной, либо литералом, либо пустым узлом, либо ссылкой на IRI (IRIref).

При записи шаблонов триплетов можно использовать следующие сокращения:

  1.  Если несколько триплетов имеют общий субъект, то первый триплет записывается полностью, а для остальных триплетов записывается только предикат и объект, при этом триплеты отделяются друг от друга точкой с запятой (символ ";");
  2.  Если несколько триплетов имеют общий субъект и предикат, то первый триплет записывается полностью, а для остальных триплетов записывается только объект, при этом триплеты отделяются друг от друга запятой (символ ",");  
  3.  Коллекции RDF можно записать в форме списка элементов коллекции, заключенного в круглые скобки ("(" и ")"), при этом элементы коллекции отделяются друг от друга пробелами, а элементы коллекции также могут быть коллекциями;
  4.  Вместо предиката rdf:type можно использовать сокращение a.

Пример 6.3.50. Использование сокращений при записи шаблонов триплетов:

1. При использовании сокращения 1 триплеты

prog:statProg dc:creator "Иванов И.И."^^xsd:sting  

prog:statProg dc:contributor "Петров П.П."^^xsd:sting ..

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

prog:statProg dc:creator "Иванов И.И."^^xsd:sting;  

dc:contributor "Петров П.П."^^xsd:sting ..

2. При использовании сокращения 2 триплеты

prog:statProg dc:creator "Иванов И.И."^^xsd:sting .  

prog:statProg dc:creator "Сидоров С.С."^^xsd:sting ..

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

prog:statProg dc:creator "Иванов И.И."^^xsd:sting,  

"Петров П.П."^^xsd:sting ..

3. При использовании сокращения 3 триплеты

_:n0   rdf:first   1 ;

          rdf:rest    _:n1 .

    _:n1   rdf:first   _:n2 .

    _:n2   const:two    2 .

    _:n1   rdf:rest    _:n3 .

    _:n3   rdf:first   _:n4 .

    _:n4   rdf:first   3 ;

          rdf:rest    _:n5 .

_:n5   rdf:first   4 ;

          rdf:rest    rdf:nil .

   _:n3   rdf:rest    rdf:nil .

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

(1 [const:two 2] (3 4)).

4. При использовании сокращения 4 триплет

?x1    rdf:type  :MyClass

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

?x1    a  :MyClass.

Набор шаблонов триплетов образует базовый шаблон графа.

В SPARQL определены следующие ключевые слова:

BASE

SELECT

ORDER BY

FROM

GRAPH

STR

isURI

PREFIX

CONSTRUCT

LIMIT

FROM NAMED

OPTIONAL

LANG

isIRI

DESCRIBE

OFFSET

WHERE

UNION

LANGMATCHES

isLiteral

ASK

DISTINCT

FILTER

DATATYPE

REGEX

REDUCED

a

BOUND

true

sameTERM

false

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

Назначение этих ключевых слов рассмотрено ниже.

Комментарии в SPARQL начинаются с символа "#" и заканчиваются концом строки.

6.3.6.2. Запросы в SPARQL

6.3.6.2.1. Структура и выполнение запроса

Документ SPARQL имеет следующую структуру:

пролог

запрос-SPARQL

Пролог, если он есть в документе, содержит одно или несколько предложений объявлений префиксов для пространств имен, а также может содержать одно предложение объявления базового IRI.

Объявление префиксов для пространств имен сопоставляет префикс заданному пространству имен и имеет следующий синтаксис:

PREFIX префикс: <IRI>,

например,

PREFIX dc: <http://purl.org/dc/elements/1.1/>.

Если параметр префикс не задан, объявление задает префикс пространства имен, используемый по умолчанию, например:

PREFIX : <http://www.someInstitute.edu/groupId#>.

Объявление базового IRI определяет IRI, относительно которого будут задаваться  IRI в документе, например,

BASE <http://www.someInstitute.edu/>.

Запрос-SPARQL может быть одним из следующих видов запросов:

  •  запрос SELECT;
  •  запрос CONSTRUCT;
  •  запрос ASK;
  •  запрос DESCRIBE.

Исходными данными для запроса (файл с расширением .rq) являются файлы документов RDF, RDFS или OWL, записанные с использованием либо нотации N3 (файлы с расширением .n3), либо нотации Turtle (файлы с расширением .ttl), либо на языке RDF/XML  (файлы с расширениями .rdf или .owl).

Форма вывода результата запроса зависит от вида запроса.

6.3.6.2.2. Запрос SELECT

6.3.6.2.2.1. Синтаксис и вывод результатов запроса

Запрос SELECT имеет следующий синтаксис:

SELECT уточнение список-переменных исходные-данные условие

модификаторы-результата

В запросе обязательно должен быть задан список-переменных, состоящий либо  из одной и более переменной, либо содержащий символ "*" (все переменные запроса), а также либо условие, либо исходные-данные.

Для переменных, заданных в списке, либо для всех переменных запроса (если задан символ "*") результатом запроса является набор соответствий переменных запроса связанными с ними ресурсами исходного документа.   

Результат запроса может быть выведен либо в текстовом виде, либо в формате XML.

При выводе в текстовом виде результат представляется в виде таблицы соответствия, в которой в заголовке выводятся имена переменных запроса (без символа "?" или "$" в начале имени), а в столбцах выводятся значения связанных с этими переменными ресурсов. Количество строк для переменной равно количеству найденных соответствий (для разных переменных количество строк может быть разным). Если для какой-либо переменной соответствий не найдено, количество строк для нее равно 0.

При выводе в формате XML таблица соответствия выводится в виде документа XML следующей структуры:

<?xml version="1.0"?>

<sparql xmlns="http://www.w3.org/2005/sparql-results#">

  <head>

     <variable name="имя-переменной-1"/>

     <variable name="имя-переменной-2"/>

  

  <variable name="имя-переменной-n"/>

 <link href="имя-файла"/>

  </head>

  <results>

     <result>

        <binding name="имя-переменной-1">значение-1-1</binding>

        <binding name="имя-переменной-2">значение-1-2</binding>

    

     <binding name="имя-переменной-n">значение-1-n</binding>

     </result>

 <result>

        <binding name="имя-переменной-1">значение-2-1</binding>

        <binding name="имя-переменной-2">значение-2-2</binding>

    …

    <binding name="имя-переменной-n">значение-2-n</binding>

     </result>

 …

 <result>

        <binding name="имя-переменной-1">значение-m-1</binding>

        <binding name="имя-переменной-2">значение-m-2</binding>

    …

    <binding name="имя-переменной-n">значение-m-n</binding>

     </result>

  </results>

</sparql>

Как видно из приведенной структуры, корневым элементом документа является элемент sparql, в котором задана ссылка на пространство имен элементов и атрибутов документа.   В элемент sparql вложены элементы head (заголовок) и results (результаты). В атрибутах name (имя) вложенных в head элементов variable (переменная) задаются имена всех переменных. В head могут быть также вложены элементы link (связь), в атрибуте href (ссылка) которых задаются ссылки на файлы, содержащие дополнительные метаданные о результатах запроса. Элементы link могут быть заданы после любого элемента variable.

Вложенные в элемент results элементы result (результат) описывают строки таблицы. Во вложенных в элемент элементах binding (связывание) в атрибуте name (имя) задается имя переменной, соответствующее значение которой задается в содержимом элемента binding.

В зависимости от типа значения в содержимом элемента binding задаются следующие элементы:

  •  <uri>значение-URI</uri> – содержимым является URI;
  •  <literal>литерал</literal> – содержимым является литерал;
  •  <literal xml:lang="код-языка">литерал</literal> – содержимым является литерал на заданном языке;
  •  <literal datatype="тип-данного">литерал</literal> – содержимым является литерал заданного типа (типизированный литерал); 
  •  <bnode>метка-узла</bnode> – содержимым является метка пустого узла.

Примеры вывода результатов запроса в текстовом виде и формате XML приведены ниже.

6.3.6.2.2.2. Условие в запросе

Условие поиска соответствия в запросе имеет следующий синтаксис:

WHERE шаблон-группы-графов

где шаблон-группы-графов заключен в фигурные скобки ("{" и "}") и может содержать следующие компоненты:

  •  пустой шаблон;
  •  базовый шаблон графа;
  •  вложенные шаблоны группы графов;
  •  дополнительный шаблон группы графов;
  •  объединение шаблонов группы графов;
  •  шаблон GRAPH;
  •  фильтр.

Ключевое слово WHERE в условии может быть пропущено.

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

SELECT $book

{}

выведет следующую таблицу результата:

.

Базовый шаблон графа содержит один или несколько шаблонов триплетов, сформированных в соответствии с правилами, приведенными в 6.3.6.1.

Пример 6.3.51. Использование базового шаблона графа в условии запроса SELECT:

1. Исходный документ на языке RDF/XML для запросов имеет следующий вид (для сокращения комментарии к свойствам книг приведены только для экземпляра книги book1):

<?xml version="1.0" encoding="UTF-8"?>

<rdf:RDF

  <!-- Задание префиксов пространств имен -->

xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"  

 xmlns:dc="http://purl.org/dc/elements/1.1/"

xmlns:xsd="http://www.w3.org/2001/XMLSchema#"

xmlns="http://www.libRegistry.org/ns/lib#">

 <!-- Экземпляр  book1 класса Book -->

<Book rdf:ID="book1">

  <!-- Идентификатор  ISBN книги -->

 <dc:identifier>02419-0</dc:identifier>

  <!-- Название книги -->

 <dc:title xml:lang="ru">Десять негритят</dc:title>

  <!-- Автор книги -->

 <dc:creator xml:lang="ru">

Кристи Агата</dc:creator>

  <!-- Жанр книги -->

 <dc:type rdf:datatype="xsd:string">

детектив</dc:type>

  <!-- Издатель книги -->

 <dc:publisher xml:lang="ru">Эксмо</dc:publisher>

  <!-- Дата издания книги -->

 <dc:date rdf:datatype="xsd:date">

2003-03-09</dc:date>

</Book>

 <!-- Экземпляр  book2 класса Book -->

<Book rdf:ID="book2">

 <dc:identifier>966-00-0785-5</dc:identifier>

 <dc:title xml:lang="uk">Кобзар</dc:title>

 <dc:creator xml:lang="uk">

Шевченко Тарас</dc:creator>

 <dc:type rdf:datatype="xsd:string">

классика</dc:type>

 <dc:publisher xml:lang="uk">

Наукова думка</dc:publisher>

   <dc:date rdf:datatype="xsd:date">

2002-10-16</dc:date>

</Book>

 <!-- Экземпляр  book3 класса Book -->

<Book rdf:ID="book3">

 <dc:identifier>0-14-062015-3</dc:identifier>

 <dc:title xml:lang="en">Robinson Crusoe</dc:title>

 <dc:creator  xml:lang="en">

Defoe Daniel</dc:creator>

 <dc:type rdf:datatype="xsd:string">

классика</dc:type>

 <dc:publisher xml:lang="en">Penguin</dc:publisher>

 <dc:date rdf:datatype="xsd:date">

2005-06-19</dc:date>

</Book>

 <!-- Экземпляр  book4 класса Book -->

<Book rdf:ID="book4">

   <dc:identifier>5-367-00019-3</dc:identifier>

 <dc:title xml:lang="ru">

Убийство в доме викария</dc:title>      <dc:creator xml:lang="ru">

Кристи Агата</dc:creator>

 <dc:type rdf:datatype="xsd:string">

детектив</dc:type>

 <dc:publisher xml:lang="ru">Амфора</dc:publisher>

 <dc:date rdf:datatype="xsd:date">

2006-01-28</dc:date>

</Book>

 <!-- Экземпляр  book5 класса Book -->

<Book rdf:ID="book5">

 <dc:identifier>966-7047-42-3</dc:identifier>

 <dc:title xml:lang="ru">

Приключения Робинзона Крузо</dc:title>

 <dc:creator  xml:lang="ru">

Дефо Даниэл</dc:creator>

 <dc:type rdf:datatype="xsd:string">

классика</dc:type>

 <dc:publisher xml:lang="ru">

Эксмо</dc:publisher>

 <dc:date rdf:datatype="xsd:date">

2007-03-28</dc:date>

</Book>

</rdf:RDF> 

2. Исходный документ в нотации Turtle, эквивалентный документу в примере 6.3.51(1), имеет следующий вид (для сокращения комментарии к свойствам книг приведены только для экземпляра книги book1):

   @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .  

   @prefix dc: <http://purl.org/dc/elements/1.1/> .

   @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

   @prefix : <http://www.libRegistry.org/ns/lib#> .

 # Экземпляр  book1 класса Book

:book1  a <http://www.libRegistry.org/ns/lib#Book>;

  # Идентификатор  ISBN книги

 dc:identifier "02419-0";

  # Название книги

 dc:title "Десять негритят"@ru;

  # Автор книги

 dc:creator "Кристи Агата"@ru;

  # Жанр книги

 dc:type "детектив"^^xsd:string;

  # Издатель книги

 dc:publisher "Эксмо"@ru;

  # Дата издания книги

 dc:date "2003-03-09"^^xsd:date .

 # Экземпляр  book2 класса Book

:book2  a <http://www.libRegistry.org/ns/lib#Book>;

 dc:identifier "966-00-0785-5";

 dc:title "Кобзар"@uk;

 dc:creator "Шевченко Тарас"@uk;

 dc:type "классика"^^xsd:string;

 dc:publisher "Наукова думка"@uk;

 dc:date "2002-10-16"^^xsd:date .

 # Экземпляр  book3 класса Book

:book3  a <http://www.libRegistry.org/ns/lib#Book>;

 dc:identifier "0-14-062015-3";

 dc:title "Robinson Crusoe"@en;

 dc:creator "Defoe Daniel"@en;

 dc:type "классика"^^xsd:string;

 dc:publisher "Penguin"@en;

 dc:date "2005-06-19"^^xsd:date .

 # Экземпляр  book4 класса Book

:book4  a <http://www.libRegistry.org/ns/lib#Book>;

 dc:identifier "5-367-00019-3";

 dc:title "Убийство в доме викария"@ru;

 dc:creator "Кристи Агата"@ru;

 dc:type "детектив"^^xsd:string;

 dc:publisher "Амфора"@ru;

 dc:date "2006-01-28"^^xsd:date .

 # Экземпляр  book5 класса Book

:book5  a <http://www.libRegistry.org/ns/lib#Book>;

 dc:identifier "966-7047-42-3";

 dc:title "Приключения Робинзона Крузо"@ru;

 dc:creator "Дефо Даниэл"@ru;

 dc:type "классика"^^xsd:string;

 dc:publisher "Эксмо"@ru;

 dc:date "2007-03-28"^^xsd:date .

3. Результат запроса

PREFIX dc:   <http://purl.org/dc/elements/1.1/>

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

PREFIX : <http://www.libRegistry.org/ns/lib#>

SELECT ?bookTitle  ?bookAuthor

WHERE  {

 :book5 dc:creator ?bookAuthor;

 dc:title ?bookTitle;

 dc:type ?bookGenre .

   }

к исходным документам в 6.3.51(1) и 6.3.51(2) в текстовом представлении имеет следующий вид:

В таблице представлены найденные связи для переменных в списке (в том порядке, в котором они заданы в запросе).  

4. Результат запроса

PREFIX dc:   <http://purl.org/dc/elements/1.1/>

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

PREFIX : <http://www.libRegistry.org/ns/lib#>

SELECT * 

WHERE  {

 :book5 dc:creator ?bookAuthor;

 dc:title ?bookTitle;

 dc:type ?bookGenre .

  }

к исходным документам в 6.3.51(1) и 6.3.51(2) в текстовом представлении имеет следующий вид:

В таблице представлены найденные связи для всех переменных в условии (в том порядке, в котором они заданы в условии).

5. Результат запроса

PREFIX dc:   <http://purl.org/dc/elements/1.1/>

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

PREFIX : <http://www.libRegistry.org/ns/lib#>

SELECT ?book ?bookTitle

WHERE  {

  ?book dc:title ?bookTitle .

   }

к исходным документам в 6.3.51(1) и 6.3.51(2) в текстовом представлении имеет следующий вид:

В таблице представлены найденные связи для заданных переменных для субъекта и объекта при фиксированном значении предиката.

6. Результат запроса

PREFIX dc:   <http://purl.org/dc/elements/1.1/>

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

PREFIX : <http://www.libRegistry.org/ns/lib#>

SELECT ?bookChar ?bookValue

WHERE  {

  :book1 ?bookChar ?bookValue .

   }

к исходным документам в 6.3.51(1) и 6.3.51(2) в текстовом представлении имеет следующий вид:

В таблице представлены найденные связи для всех предикатов и объектов фиксированного субъекта.

Результат запроса в формате XML имеет следующий вид:

<?xml version="1.0"?>

<sparql xmlns="http://www.w3.org/2005/sparql-results#">

 <head>

   <variable name="bookChar"/>

   <variable name="bookValue"/>

 </head>

 <results>

   <result>

     <binding name="bookChar">

       <uri>http://purl.org/dc/elements/1.1/date</uri>

     </binding>

     <binding name="bookValue">

       <literal datatype="http://www.w3.org/2001/XMLSchema#date">2003-03-09</literal>

     </binding>

   </result>

   <result>

     <binding name="bookChar">

      <uri>http://purl.org/dc/elements/1.1/publisher</uri>

     </binding>

     <binding name="bookValue">

       <literal xml:lang="ru">Эксмо</literal>

     </binding>

   </result>

   <result>

     <binding name="bookChar">

       <uri>http://purl.org/dc/elements/1.1/type</uri>

     </binding>

     <binding name="bookValue">

       <literal datatype="http://www.w3.org/2001/XMLSchema#string">детектив</literal>

     </binding>

   </result>

   <result>

     <binding name="bookChar">

       <uri>http://purl.org/dc/elements/1.1/creator</uri>

     </binding>

     <binding name="bookValue">

       <literal xml:lang="ru">Кристи Агата</literal>

     </binding>

   </result>

   <result>

     <binding name="bookChar">

       <uri>http://purl.org/dc/elements/1.1/title</uri>

     </binding>

     <binding name="bookValue">

       <literal xml:lang="ru">Десять негритят</literal>

     </binding>

   </result>

   <result>

     <binding name="bookChar">

       <uri>http://purl.org/dc/elements/1.1/identifier</uri>

     </binding>

     <binding name="bookValue">

       <literal>02419-0</literal>

     </binding>

   </result>

   <result>

     <binding name="bookChar">

<uri>http://www.w3.org/1999/02/22-rdf-syntax-ns#type</uri>

     </binding>

     <binding name="bookValue">

       <uri>http://www.libRegistry.org/ns/lib#Book</uri>

     </binding>

   </result>

 </results>

</sparql> 

7. Результат запроса 

PREFIX dc:   <http://purl.org/dc/elements/1.1/>

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

PREFIX : <http://www.libRegistry.org/ns/lib#>

SELECT ?book ?bookTitle

WHERE  {

  ?book dc:creator "Кристи Агата"@ru;

  dc:title ?bookTitle .

   }

к исходным документам в 6.3.51(1) и 6.3.51(2) в текстовом представлении имеет следующий вид:

В таблице представлены найденные связи для заданных в запросе переменных и фиксированного объекта "Кристи Агата"@ru.

8. Результат запроса

PREFIX dc:   <http://purl.org/dc/elements/1.1/>

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

PREFIX : <http://www.libRegistry.org/ns/lib#>

SELECT ?book ?bookTitle ?bookType

WHERE  {

  ?book dc:title ?bookTitle .

  ?book dc:type ?bookType .

   }

к исходным документам в 6.3.51(1) и 6.3.51(2) в текстовом представлении имеет следующий вид:

В таблице представлены найденные связи для заданных в запросе переменных и фиксированных предикатах.

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

Пример 6.3.52. Использование вложенного шаблона группы графов в условии запроса SELECT:

Результат запроса

PREFIX dc:   <http://purl.org/dc/elements/1.1/>

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

PREFIX : <http://www.libRegistry.org/ns/lib#>

SELECT ?book ?bookID ?bookTitle

WHERE  {

  {?book dc:identifier ?bookID .}

  {?book dc:title ?bookTitle .}

   }

к исходным документам в 6.3.51(1) и 6.3.51(2) в текстовом представлении имеет следующий вид:

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

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

шаблон OPTIONAL {шаблон}.

Пример 6.3.53. Использование дополнительного шаблона группы графов в условии запроса SELECT:

Если в исходном документе 6.3.51(2) закомментировать строку

dc:type "детектив"^^xsd:string;

для экземпляра book1 и строку

dc:publisher "Наукова думка"@uk;

для экземпляра book2, то для запроса

PREFIX dc:   <http://purl.org/dc/elements/1.1/>

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

PREFIX : <http://www.libRegistry.org/ns/lib#>

SELECT ?book ?bookTitle ?bookType

WHERE  {

 ?book dc:title ?bookTitle;

 dc:type ?bookType;

 dc:publisher ?bookPublisher .

   }

результат в текстовом представлении имеет следующий вид:

 

Как видно из результата, экземпляры book1 и book2 не вошли в таблицу, поскольку они не полностью соответствуют шаблону запроса.

Если все же требуется включить эти экземпляры в результат, необходимо задать отсутствующие в них триплеты в дополнительных шаблонах группы графов, изменив запрос следующим образом:

PREFIX dc:   <http://purl.org/dc/elements/1.1/>

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

PREFIX : <http://www.libRegistry.org/ns/lib#>

SELECT ?book ?bookTitle ?bookType ?bookPublisher

WHERE  {

 ?book dc:title ?bookTitle .

  OPTIONAL {?book dc:type ?bookType}

  OPTIONAL {?book dc:publisher ?bookPublisher}

 }

В этом случае будет получен следующий результат:

Как видно из таблицы, ячейка таблицы, для которой отсутствует связь, является пустой.

 

Объединение шаблонов группы графов позволяет получить соответствие шаблона графа в том случае, если получено соответствие хотя бы для одного из заданных альтернативных шаблонов.

Для задания альтернативных шаблонов используется следующий синтаксис

{шаблон-1} UNION {шаблон-2} UNION {шаблон-3} … .

Заданные в объединении шаблоны последовательно проверяются на соответствие до тех пор, пока один из шаблонов не соответствует триплету исходного документа, либо пока последовательность шаблонов не завершится.

 

Пример 6.3.54. Использование объединения шаблонов группы графов в условии запроса SELECT:

В исходном документе 6.3.51(2) используется версия, заданная в пространстве имен

http://purl.org/dc/elements/1.1/

с префиксом dc.

Предположим, что экземпляр  задан с использованием версии Dublin Core 1.0 в пространстве имен

http://purl.org/dc/elements/1.0/.

Добавим в прологе документа предложение

@prefix dc10:  <http://purl.org/dc/elements/1.0/>

и заменим все префиксы dc для экземпляра book1 префиксами dc10.

Тогда запрос

PREFIX dc:   <http://purl.org/dc/elements/1.1/>

PREFIX dc10:   <http://purl.org/dc/elements/1.0/>

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

PREFIX : <http://www.libRegistry.org/ns/lib#>

SELECT ?book ?bookTitle ?bookPubDate

WHERE  {

 ?book dc:title ?bookTitle;

dc:date ?bookPubDate .

  }

не будет содержать связей для экземпляра book1.

Однако, если задать запрос с использованием альтернативных шаблонов

PREFIX dc:   <http://purl.org/dc/elements/1.1/>

PREFIX dc10:   <http://purl.org/dc/elements/1.0/>

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

PREFIX : <http://www.libRegistry.org/ns/lib#>

SELECT ?book ?bookTitle ?bookPubDate

WHERE  {

 {{?book dc:title ?bookTitle}

UNION {?book dc10:title ?bookTitle}}

 {{?book dc:date ?bookPubDate} UNION

{?book dc10:date ?bookPubDate}}  

  }

то в таблицу результата будут включены связи и для экземпляра book1:

Шаблон GRAPH задается в условии только в том случае, если в запросе задан параметр исходные-данные, поэтому данный шаблон будет рассмотрен в 6.3.6.2.2.4.

Использование фильтра в запросе рассматривается ниже.

6.3.6.2.2.3. Использование фильтра в запросе

Фильтр определяет дополнительные ограничения на выводимые данные и имеет следующий синтаксис:

FILTER ограничения.

Параметр ограничения может принимать одну из следующих форм:

  •  выражение;
  •  вызов встроенной функции;
  •  вызов внешней функции.

Выражение заключается в круглые скобки ("(" и ")") и может содержать в качестве компонент переменные, литералы, ссылки на IRI (IRIref), уточненные имена, вызовы встроенных функций, а также выражения.

В выражениях можно использовать операции отношения: равно ("="), не равно ("!="), больше (">"), меньше ("<"), больше или равно (">="), меньше или равно ("<="), а также логические операции: И ("&&"), ИЛИ ("||") и НЕ ("!").

Для числовых литералов определены также одноместные арифметические операции: плюс ("+") и минус ("-"), а также двуместные арифметические операции: сложение ("+"), вычитание ("-"), умножение ("*") и деление ("/").

В языке SPARQL определены встроенные функции следующих типов:

  •  функции проверки;
  •  функция преобразования;
  •  функция определения типа данных;
  •  языковые функции;
  •  функции выполнения логических операций;
  •  функция поиска с использованием регулярного выражения.

К функциям проверки относятся следующие функции: bound(), isIRI(), isURI(), isBlank(), isLiteral(),RDFterm-equal() и sameTerm().

Функция bound(переменная) проверяет, является ли переменная, заданная в качестве аргумента функции, связанной.  Если это условие выполняется, функция возвращает true, иначе возвращает false.

Функции isIRI(аргумент) и isURI(аргумент) проверяют, является ли аргумент  IRI(URI). Если это условие выполняется, функция возвращает true, иначе возвращает false. В качестве аргумента могут быть заданы IRI(URI), литерал, переменная или пустой узел.

Функция isBlank(аргумент) проверяет, является ли аргумент  пустым узлом. Если это условие выполняется, функция возвращает true, иначе возвращает false. В качестве аргумента могут быть заданы IRI(URI), литерал, переменная или пустой узел.

Функция isLiteral(аргумент) проверяет, является ли аргумент  литералом. Если это условие выполняется, функция возвращает true, иначе возвращает false. В качестве аргумента могут быть заданы IRI(URI), литерал, переменная или пустой узел.

Функция RDFterm-equal(аргумент-1, аргумент-2) возвращает true, если оба аргумента являются эквивалентными, иначе возвращает false. В качестве аргументов могут быть заданы литерал, переменная, пустой узел или IRI(URI). Два литерала являются эквивалентными при выполнении следующих условий: они посимвольно равны; у обоих либо есть, либо нет меток языков; если метки языков есть, то они одинаковые; у обоих либо есть, либо нет типов данных. Два пустых узла считаются эквивалентными, если они указывают на один и тот же узел. Два IRI(URI) считаются эквивалентными, если они посимвольно равны.

Функция sameTerm(аргумент-1, аргумент-2) возвращает true, если оба аргумента являются одним и тем же данным, иначе возвращает false. В качестве аргументов могут быть заданы литерал, переменная, пустой узел или IRI(URI).

Функция преобразования str(аргумент) возвращает строковое представление аргумента. В качестве аргумента могут быть заданы литерал, переменная или IRI(URI).

Функция определения типа datatype(аргумент) возвращает уточненный тип данных схемы XML для аргумента. Если аргумент задает простое (нетипизированное) данное, возвращается тип данных xsd:string. В качестве аргумента могут быть заданы простой или типизированный литерал, а также переменная.

К языковым функциям относятся функции lang() и langMatches().

Функция lang(аргумент) возвращает строку кода языка аргумента. Если код языка для аргумента не задан, возвращается пустая строка. В качестве аргумента могут быть заданы литерал или переменная.

Функция langMatches(метка-языка, диапазон-меток) возвращает true, если метка-языка входит в диапазон-меток, заданный во втором аргументе,  иначе возвращает false. Аргумент диапазон-меток содержит либо список меток языков, отделенных друг от друга символом "-", либо символ "*".

Логические функции logical-or() и logical-and()выполняют логические операции над аргументами.

Функция logical-or(аргумент-1, аргумент-2) возвращает результат выполнения операции аргумент-1 || аргумент-2 (true или false). Оба аргумента должны иметь булевский тип.

Функция logical-and(аргумент-1, аргумент-2) возвращает результат выполнения операции аргумент-1 && аргумент-2 (true или false). Оба аргумента должны иметь булевский тип.

Функция поиска с использованием регулярного выражения regex(строка, шаблон, флажки) вызывает функцию fn:matches()языка XPath 2.0 (см. 5.1.1.4.3.5). В аргументе строка задается строковый литерал или строковая переменная, а в аргументе шаблон – шаблон поиска в строке (в соответствии с правилами задания регулярных выражений). В необязательном аргументе задаются флажки "s", "m", "i" и "x" (один флажок или строка, содержащая комбинацию флажков). Функция возвращает true, если в строке найдено соответствие шаблону и false – в противном случае.

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

PREFIX fn: <http://www.w3.org/2005/xpath-functions#>.

После этого можно вызвать необходимую функцию  XPath 2.0 в фильтре, например:

FILTER fn:starts-with(&name,"И")

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

Пример 6.3.55. Использование фильтров в условии запроса SELECT:

1. Результат запроса

PREFIX dc:   <http://purl.org/dc/elements/1.1/>

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

PREFIX : <http://www.libRegistry.org/ns/lib#>

SELECT ?bookAuthor ?bookTitle

WHERE  {

  ?book dc:title ?bookTitle;

  dc:creator ?bookAuthor;

  dc:type ?bookGenre .

  FILTER (?bookGenre = ^^xsd:string)

   }

к исходным документам в 6.3.51(1) и 6.3.51(2) в текстовом виде имеет следующий вид:

В таблице выведены авторы и наименования книг жанра "классика".

2. Результат запроса

PREFIX dc:   <http://purl.org/dc/elements/1.1/>

PREFIX : <http://www.libRegistry.org/ns/lib#>

SELECT ?bookAuthor ?bookTitle

WHERE  {

  ?book dc:title ?bookTitle;

  dc:creator ?bookAuthor .

  FILTER (regex(str(?bookAuthor), "Defoe") ||

regex(str(?bookAuthor), "Дефо"))

    }

к исходным документам в 6.3.51(1) и 6.3.51(2) в текстовом представлении имеет следующий вид:

В таблице выведены авторы и наименования книг, у которых в наименовании автора книги встречается строка "Defoe"или "Дефо".

3. Результат запроса

PREFIX dc:   <http://purl.org/dc/elements/1.1/>

PREFIX : <http://www.libRegistry.org/ns/lib#>

SELECT ?bookAuthor ?bookTitle

WHERE  {

  ?book dc:title ?bookTitle;

  dc:creator ?bookAuthor .

  FILTER (lang(?bookTitle) = "uk")

    }

к исходным документам в 6.3.51(1) и 6.3.51(2) в текстовом представлении имеет следующий вид:

В таблице выведены авторы и наименования книг на украинском языке.

4. Результат запроса

PREFIX dc:   <http://purl.org/dc/elements/1.1/>

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

PREFIX : <http://www.libRegistry.org/ns/lib#>

SELECT ?bookAuthor ?bookTitle ?bookPubDate

WHERE  {

  ?book dc:title ?bookTitle;

  dc:creator ?bookAuthor;

  dc:publisher ?bookPublisher;

  dc:date ?bookPubDate .

  FILTER (?bookPublisher = "Эксмо"@ru &&

?bookPubDate > "2005-01-01"^^xsd:date)

    }

к исходным документам в 6.3.51(1) и 6.3.51(2) в текстовом представлении имеет следующий вид:

В таблице выведены авторы, наименования книг и дата издания для книг издательства Эксмо, выпущенных после 2004 года.

6.3.6.2.2.4. Задание исходных документов в запросе

В языке SPARQL исходными данными запроса являются графы, заданные в документах RDF, RDFS и OWL. В предыдущих примерах использовался только один граф (исходный документ), причем его местоположение в запросе не задавалось.

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

Этот компонент имеет одну из следующих форм:

FROM IRIref

или

FROM NAMED IRIref,

где IRIref – ссылка IRI (URI) на местоположение исходного документа.

Набор исходных документов (набор данных RDF) содержит один граф (исходный документ) без имени. Этот граф называется графом по умолчанию и должен обязательно присутствовать в наборе. Местоположение графа по умолчанию задается с помощью формы FROM IRIref.

В наборе могут быть заданы и другие графы (исходные  документы), называемые именованными графами. Если именованные графы есть в наборе, их местоположения задаются с помощью формы FROM NAMED IRIref.

Если заданы только местоположения именованных графов, предполагается, что граф по умолчанию – пустой граф.

При выполнении запроса граф, используемый для поиска соответствия, называется активным графом. В предыдущих примерах использовался только граф по умолчанию, поэтому этот граф и является активным графом. Если необходимо для части запроса необходимо сделать активным один или несколько именованных графов, в условии запроса (см. 6.3.6.2.2.1) необходимо задать шаблон GRAPH, который имеет следующий синтаксис:

GRAPH параметр шаблон-группы-графов 

где параметр – либо IRIref, либо переменная, диапазоном значений которой являются все именованные графы, заданные в запросе,  а шаблон-группы-графов определен в 6.3.6.2.2.2.

Пример 6.3.56. Использование исходных документов в запросе SELECT:

1. Дополнительно к документу в нотации Turtle в 6.3.51(2) (файл bookLib.ttl), введем второй и третий документы  Turtle. В этих документах добавлено свойство  dc:language, задающее язык, на котором написана книга.

Второй документ  Turtle (файл bookLib-1.ttl) содержит две книги и имеет следующий вид:

   @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .  

   @prefix dc: <http://purl.org/dc/elements/1.1/> .

   @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

   @prefix : <http://www.libRegistry.org/ns/lib#> .

 # Экземпляр  book1-1 класса Book

:book1-1 a <http://www.libRegistry.org/ns/lib#Book>;

dc:identifier "5-699-07331-0";

dc:title "Трое в одной лодке, не считая собаки"@ru;

 dc:creator "Джером Джером"@ru;   

dc:language "русский"^^xsd:string;   

dc:type "классика"^^xsd:string;

dc:publisher "Эксмо"@ru

dc:date "2004-11-09"^^xsd:date .

 # Экземпляр  book2-1 класса Book

:book1-2 a <http://www.libRegistry.org/ns/lib#Book>;

dc:identifier "966-7047-42-3";

dc:title "Гаррi Поттер i орден Фенiкса"@uk;

dc:creator "Джоан Ролінг"@uk;

dc:language "украинский"^^xsd:string;

dc:type "детская"^^xsd:string;

dc:publisher "А-Ба-Ба-Га-Ла-Ма-Га"@uk;

dc:date "2003-12-19"^^xsd:date .

Третий документ  Turtle (файл bookLib-2.ttl) содержит одну книгу и имеет следующий вид:

   @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .  

   @prefix dc: <http://purl.org/dc/elements/1.1/> .

   @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

   @prefix : <http://www.libRegistry.org/ns/lib#> .

 # Экземпляр  book2-1 класса Book

:book2-1 a <http://www.libRegistry.org/ns/lib#Book>;

dc:identifier "5-08-004015-7";

dc:title "Робинзон Крузо"@ru;

dc:creator "Дефо Даниэль"@ru;

dc:language "русский"^^xsd:string;

dc:type "детская"^^xsd:string;

dc:publisher "Детская литература"@ru;

dc:date "2006-05-17"^^xsd:date .

2. Результат запроса

PREFIX dc:   <http://purl.org/dc/elements/1.1/>

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

PREFIX : <http://www.libRegistry.org/ns/lib#>

SELECT ?bookAuthor ?bookTitle ?bookType

FROM <file:///D:/Library/ARQ/bookLib.ttl>

FROM NAMED <file:///D:/ARQ/bookLib-1.ttl>

WHERE  {

  GRAPH <file:///D:/ARQ/bookLib-1.ttl>

  {

   ?book dc:title ?bookTitle;

   dc:creator ?bookAuthor;

   dc:type ?bookType;

   dc:language ?bookLanguage .

  }

  FILTER (?bookLanguage = "украинский"^^xsd:string)

    }

к исходным документам в  6.3.51(2) и в 6.3.56(1) в текстовом представлении имеет следующий вид:

В таблице выведены авторы, наименования книг и жанр для графа в файле

file:///D:/Library/ARQ/bookTest-1.ttl.

3. Результат запроса

PREFIX dc:   <http://purl.org/dc/elements/1.1/>

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

PREFIX : <http://www.libRegistry.org/ns/lib#>

SELECT ?bookAuthor ?bookTitle ?bookLanguage

FROM NAMED <file:///D:/ARQ/bookLib.ttl>

FROM NAMED <file:///D:/ARQ/bookLib-1.ttl>

FROM NAMED <file:///D:/ARQ/bookLib-2.ttl>

WHERE  {

  GRAPH ?named

  {

   ?book dc:title ?bookTitle;

   dc:creator ?bookAuthor;

   dc:type ?bookType .

   OPTIONAL {?book dc:language ?bookLanguage}

  }

  FILTER (?bookType = "классика"^^xsd:string ||

?bookType = "детская"^^xsd:string)

        }

к исходным документам в  6.3.51(2) и в 6.3.56(1) в текстовом представлении имеет следующий вид:

В таблице выведены авторы, наименования книг и язык, на котором написана книга, для классики и детской литературы во всех трех файлах (bookTest.ttl, bookTest-1.ttl и bookTest-2.ttl).

6.3.6.2.2.5. Уточнение в запросе

Компонент уточнение в запросе (см. 6.3.6.2.2.1) задается либо как ключевое слово

DISTINCT,

либо как ключевое слово

REDUCED.

Если задано уточнение DISTINCT и в результате несколько одинаковых переменных связаны с одинаковыми значениями, то из результата удаляются все повторяющиеся значения, за исключением одного.

Если задано уточнение REDUCED и в результате несколько одинаковых переменных связаны с одинаковыми значениями, то из результата удаляются несколько повторяющихся значений. Количество удалений может меняться от нуля до n-1, где n – количество повторений.

Пример 6.3.57. Использование уточнения в запросе SELECT:

Результат запроса

PREFIX dc:   <http://purl.org/dc/elements/1.1/>

SELECT ?bookAuthor

WHERE  {

  ?book dc:creator ?bookAuthor .

  FILTER regex(str(?bookAuthor), "Кристи")

        }

к исходным документам в  6.3.51(1) и 6.3.51(2) в текстовом представлении имеет следующий вид:

В таблице автор книги выведен дважды, поскольку этот автор встречается в двух книгах.

Если изменить строку запроса

SELECT ?bookAuthor

на

SELECT DISTINCT ?bookAuthor,

то имя автора будет выведено только один раз:

 

Аналогичный результат будет получен в данном случае и при использовании уточнения REDUCED.

6.3.6.2.2.6. Модификатор результата в запросе

Компонент модификаторы-результата в запросе (см. 6.3.6.2.2.1) позволяет изменить выводимый результат с помощью следующих операций:

  •  упорядочение выводимых результатов;
  •  задание индекса, с которого начинается вывод результатов, в последовательности выводимых результатов;
  •  ограничение количества выводимых результатов в последовательности.

В запросе может быть задана одна или несколько операций из перечисленных операций.

Упорядочение выводимых результатов задается с помощью следующего выражения:

ORDER BY условия-упорядочения

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

ASC выражение

или

DESC выражение

или

ограничение

или

переменная.

Параметр выражение в первой и второй форме аналогичен выражению в фильтре Параметр ограничение в третьей форме аналогичен ограничению в фильтре (см. 6.3.6.2.2.3).

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

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

OFFSET число,

где число – целое неотрицательное число (значение 0 – вывод с первого элемента последовательности, значение 1 – со второго и т.д.).

Ограничение количества выводимых результатов в последовательности задается с помощью выражения

LIMIT число,

где число – целое положительное число (при значении 0 не выводится ни одного результата). Если заданное число больше количества полученных результатов, выводятся все результаты.

Пример 6.3.58. Использование модификаторов результата в запросе SELECT:

1. Результат запроса

PREFIX dc:   <http://purl.org/dc/elements/1.1/>

SELECT ?bookAuthor ?bookTitle

WHERE  {

  

  ?book dc:title ?bookTitle;

  dc:creator ?bookAuthor .

   }

ORDER BY ASC(?bookAuthor)

к исходным документам в  6.3.51(1) и 6.3.51(2) в текстовом представлении имеет следующий вид:

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

Если изменить строку запроса

ORDER BY ASC(?bookAuthor)

на

ORDER BY ASC(?bookAuthor) LIMIT 3 OFFSET 1,

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

 

2. Результат запроса

PREFIX dc:   <http://purl.org/dc/elements/1.1/>

SELECT ?bookAuthor ?bookTitle

WHERE  {

  

  ?book dc:title ?bookTitle;

  dc:creator ?bookAuthor .

   }

ORDER BY ?bookAuthor DESC(?bookTitle)

к исходным документам в  6.3.51(1) и 6.3.51(2) в текстовом представлении имеет следующий вид:

В этой таблице, в отличие от таблицы с пятью книгами выше, наименования книг для автора "Кристи Агата" упорядочены по убыванию.

6.3.6.2.3. Запрос CONSTRUCT

Запрос CONSTRUCT возвращает граф RDF, заданный шаблоном графа. Этот результирующий граф формируется (конструируется) следующим образом: для каждого результата в последовательности результатов запроса выполняется подстановка переменных из шаблона графа, а затем все триплеты объединяются в единый граф RDF.

Если в результате такого преобразования  получается триплет, содержащий несвязанную переменную или неправильную конструкцию RDF, например, литерал в позиции субъекта или предиката, такой триплет не включается в выходной граф RDF. Шаблон графа может содержать триплеты без переменных, которые выводятся в выходном графе RDF без изменений.

Запрос CONSTRUCT имеет следующий синтаксис:

CONSTRUCT шаблон-конструирования исходные-данные условие

модификаторы-результата

Параметр шаблон-конструирования содержит базовый шаблон графа (см. 6.3.6.1), заключенный в фигурные скобки ("{" и "}").

Остальные параметры – те же, что в запросе SELECT: исходные-данные (см. 6.3.6.2.2.4), условие (см. 6.3.6.2.2.2) и модификаторы-результата (см. 6.3.6.2.2.6).

Обязательными параметрами являются шаблон-конструирования и условие.

Пример 6.3.59. Использование запроса CONSTRUCT:

Создание нового графа RDF для списка книг в  6.3.51(1) и 6.3.51(2). В новом графе для каждой книги на русском или украинском языке будут заданы только свойства dc:creator и dc:title, а также добавлено свойство dc:language.

Первый запрос

PREFIX dc:   <http://purl.org/dc/elements/1.1/>

CONSTRUCT {?book dc:title ?bookTitle;

  dc:creator ?bookAuthor;

  dc:language "русский"}

WHERE  {

  

 ?book dc:title ?bookTitle;

 dc:creator ?bookAuthor .

 FILTER (lang(?bookAuthor) = "ru")

  }

формирует документ Turtle (в  файле bookLibru.ttl), в котором заданы книги на русском языке:

# ======== CONSTRUCT results

   @prefix dc:  <http://purl.org/dc/elements/1.1/> .

   @prefix :    <http://www.libRegistry.org/ns/lib#> .

   @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

   @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

:book1

     dc:creator    "Кристи Агата"@ru ;

     dc:language   "русский" ;

     dc:title      "Десять негритят"@ru .

:book4

     dc:creator    "Кристи Агата"@ru ;

     dc:language   "русский" ;

     dc:title      "Убийство в доме викария"@ru .

:book5

     dc:creator    "Дефо Даниэл"@ru ;

     dc:language   "русский" ;

     dc:title      "Приключения Робинзона Крузо"@ru .

# ========

Второй запрос

PREFIX dc:   <http://purl.org/dc/elements/1.1/>

CONSTRUCT {?book dc:title ?bookTitle;

  dc:creator ?bookAuthor;

  dc:language "украинский"}

WHERE  {

  

 ?book dc:title ?bookTitle;

 dc:creator ?bookAuthor .

 FILTER (lang(?bookAuthor) = "uk")

  }

формирует документ Turtle (в  файле bookLibuk.ttl), в котором задана книга на украинском языке:

# ======== CONSTRUCT results

   @prefix dc:  <http://purl.org/dc/elements/1.1/> .

   @prefix :    <http://www.libRegistry.org/ns/lib#> .

   @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

   @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

:book2

     dc:creator    "Шевченко Тарас"@uk ;

     dc:language   "украинский" ;

     dc:title      "Кобзар"@uk .

# ========

Третий запрос

PREFIX dc:   <http://purl.org/dc/elements/1.1/>

CONSTRUCT {?book dc:title ?bookTitle;

  dc:creator ?bookAuthor;

  dc:language ?bookLang}

FROM NAMED <file:///D:/ARQ/bookLibru.ttl>

FROM NAMED <file:///D:/ARQ/bookLibuk.ttl>

WHERE  {

  GRAPH ?named {

  ?book dc:title ?bookTitle;

  dc:creator ?bookAuthor;

  dc:language ?bookLang .

  }

  }

соединяет два документа в один документ Turtle:

# ======== CONSTRUCT results

@prefix dc:      <http://purl.org/dc/elements/1.1/> .

<http://www.libRegistry.org/ns/lib#book1>

     dc:creator    "Кристи Агата"@ru ;

     dc:language   "русский" ;

     dc:title      "Десять негритят"@ru .

<http://www.libRegistry.org/ns/lib#book2>

     dc:creator    "Шевченко Тарас"@uk ;

     dc:language   "украинский" ;

     dc:title      "Кобзар"@uk .

<http://www.libRegistry.org/ns/lib#book4>

     dc:creator    "Кристи Агата"@ru ;

     dc:language   "русский" ;

     dc:title      "Убийство в доме викария"@ru .

<http://www.libRegistry.org/ns/lib#book5>

     dc:creator    "Дефо Даниэл"@ru ;

     dc:language   "русский" ;

     dc:title      "Приключения Робинзона Крузо"@ru .

# ========

6.3.6.2.4. Запрос ASK

Запрос ASK проверяет, существует ли результат для заданного в запросе шаблона и имеет следующий синтаксис:

CONSTRUCT исходные-данные условие.

Параметры запроса – те же, что в запросе SELECT: исходные-данные (см. 6.3.6.2.2.4) и условие (см. 6.3.6.2.2.2). Обязательным параметром является условие.

Результат запроса может быть выведен либо в текстовом виде, либо в формате XML.

Вывод в текстовом виде – это строка, содержащее слово yes, если результат запроса существует и no – в противном случае.

Вывод в формате XML имеет следующий вид:

<?xml version="1.0"?>

<sparql xmlns="http://www.w3.org/2005/sparql-results#">

  <head></head>

  <results>

     <boolean>значение</boolean>

  </results>

</sparql>

Параметр значение в выводе равен true, если результат запроса существует и false – в противном случае.

Пример 6.3.60. Использование запроса ASK:

1. Запрос

PREFIX dc: <http://purl.org/dc/elements/1.1/>

ASK {?book dc:title "Приключения Робинзона Крузо"@ru}

к исходным документам в  6.3.51(1) и 6.3.51(2) в текстовом представлении имеет следующий вид:

В формате XML этот результат имеет следующий вид:

<?xml version="1.0"?>

<sparql xmlns="http://www.w3.org/2005/sparql-results#">

  <head>

  </head>

  <boolean>true</boolean>

</sparql>.

2. Запрос

PREFIX dc: <http://purl.org/dc/elements/1.1/>

ASK {?book dc:title "Приключения Тома Сойера"@ru}

к исходным документам в  6.3.51(1) и 6.3.51(2) в текстовом представлении имеет следующий вид:

6.3.6.2.5. Запрос DESCRIBE

Запрос DESCRIBE для заданного шаблона возвращает как результат граф RDF, содержащие данные о ресурсах в формате RDF.

Запрос DESCRIBE имеет следующий синтаксис:

DESCRIBE список исходные-данные условие

модификаторы-результата

В запросе обязательно должен быть задан список, а также либо условие, либо исходные-данные. Элементами списка являются либо переменные, либо ссылки на IRI (URI) – IRIref. Список может также содержать только символ "*", что подразумевает список всех переменных, заданных в запросе.

Остальные параметры – те же, что в запросе SELECT: исходные-данные (см. 6.3.6.2.2.4), условие (см. 6.3.6.2.2.2) и модификаторы-результата (см. 6.3.6.2.2.6).

Пример 6.3.61. Использование запроса DESCRIBE:

Запрос

PREFIX dc: <http://purl.org/dc/elements/1.1/>

DESCRIBE ?book

WHERE {?book dc:creator "Кристи Агата"@ru}

к исходным документам в  6.3.51(1) и 6.3.51(2) выводит документ Turtle, содержащий описание ресурсов (книг), для которых автором является "Кристи Агата":

# ======== DESCRIBE results

@prefix dc:      <http://purl.org/dc/elements/1.1/> .

@prefix :        <http://www.libRegistry.org/ns/lib#> .

@prefix xsd:     <http://www.w3.org/2001/XMLSchema#> .

@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

:book1

     rdf:type      :Book ;

     dc:creator    "Кристи Агата"@ru ;

     dc:date       "2003-03-09"^^xsd:date ;

     dc:identifier  "02419-0" ;

     dc:publisher  "Эксмо"@ru ;

     dc:title      "Десять негритят"@ru ;

     dc:type       "детектив"^^xsd:string .

:book4

     rdf:type      :Book ;

     dc:creator    "Кристи Агата"@ru ;

     dc:date       "2006-01-28"^^xsd:date ;

     dc:identifier  "5-367-00019-3" ;

     dc:publisher  "Амфора"@ru ;

     dc:title      "Убийство в доме викария"@ru ;

     dc:type       "детектив"^^xsd:string .

# ========

6.3.6.3. Протокол SPARQL

6.3.6.3.1. Описание протокола SPARQL

Протокол SPARQL содержит один интерфейс SparqlQuery, который содержит, в свою очередь, операцию query. Этот протокол описан абстрактно с помощью средств языка WSDL 2.0 (см. 6.2.3.1) в терминах Web-службы, реализующей свой интерфейс, свои типы данных, ошибки и операции, а также связи с протоколом HTTP и SOAP.

Интерфейс и его операция описываются с помощью следующего фрагмента на языке WSDL 2.0 (см. 6.2.3.2.2):

<!-- Абстрактный интерфейс SparqlQuery -->

<interface name="SparqlQuery"

styleDefault="http://www.w3.org/2006/01/wsdl/style/iri">

    <!-- Ошибки интерфейса -->

   <fault name="MalformedQuery"

element="st:malformed-query"/>

   <fault name="QueryRequestRefused"

element="st:query-request-refused"/>

    <!-- Операция интерфейса -->

   <operation name="query"

pattern="http://www.w3.org/2006/01/wsdl/in-out">

     <documentation>Операция используется для передачи

запросов и их результатов от клиента к серверу

и обратно.</documentation>

     <input messageLabel="In"

element="st:query-request"/>

     <output messageLabel="Out"

element="st:query-result"/>

        <!-- Выходные ошибки интерфейса -->

      <outfault ref="tns:MalformedQuery"

messageLabel="Out"/>

      <outfault ref="tns:QueryRequestRefused"

 messageLabel="Out"/>

  </operation>

</interface>

Тип данных query-request для входного сообщения описывается с помощью следующего фрагмента схемы XML:

<xs:element name="query-request">

 <xs:complexType>

   <xs:sequence>

     <xs:element minOccurs="1" maxOccurs="1"

name="query" type="xs:string">

      <xs:annotation>

      <xs:documentation>Запросэто строка xs:string,

          ограниченная определением языка

     http://www.w3.org/TR/rdf-sparql-query/#grammar,

как последовательность символов, определенная

грамматикой языка.</xs:documentation>

      </xs:annotation>

     </xs:element>

     <xs:element minOccurs="0" maxOccurs="unbounded"

     name="default-graph-uri" type="xs:anyURI"/>

     <xs:element minOccurs="0" maxOccurs="unbounded"

     name="named-graph-uri" type="xs:anyURI"/>

   </xs:sequence>

 </xs:complexType>

</xs:element>

Аналогичным образом описывается тип данных query-result для результата:

<xs:element name="query-result">

     <xs:annotation>

         <xs:documentation>Тип для сериализации

результатов запроса (как 

XML или RDF/XML).</xs:documentation>

     </xs:annotation>

     <xs:complexType>

         <xs:choice>

             <xs:element maxOccurs="1" ref="vbr:sparql"/>

             <xs:element maxOccurs="1" ref="rdf:RDF"/>

         </xs:choice>

     </xs:complexType>

</xs:element>

Сообщения об ошибке описываются с помощью элемента схемы XML:

<xs:element type="xs:string" name="fault-details">

   <xs:annotation>

     <xs:documentation> Этот элемент содержит информацию

об ошибке, возвращаемой службой обработки запроса

 SPARQL.</xs:documentation>

   </xs:annotation>

 </xs:element>

   <xs:element name="malformed-query">

     <xs:complexType>

         <xs:all><xs:element minOccurs="0" maxOccurs="1"

ref="st:fault-details"/></xs:all>

     </xs:complexType>

 </xs:element>

 <xs:element name="query-request-refused">

     <xs:complexType>

         <xs:all><xs:element minOccurs="0" maxOccurs="1"

ref="st:fault-details"/></xs:all>

     </xs:complexType>

</xs:element>

6.3.6.3.2. Связывание с протоколом HTTP

Для связи с протоколом HTTP в описании Web-службы на языке WSDL 2.0 определены два компонента Binding (см. 6.2.3.2.7) для методов GET и POST.

В параметре запроса query задается запрос SPARQL, закодированный в кодировке URL. При необходимости, в параметрах запроса default-graph-uri и named-graph-uri задаются соответственно графы RDF по умолчанию и именованные графы RDF.

Элемент binding для метода GET имеет следующий вид:

<binding name="queryHttpGet" interface="tns:SparqlQuery"

type="http://www.w3.org/2006/01/wsdl/http"

whttp:version="1.1">

 <!-- Ошибки при обработке запроса --> 

  <fault ref="tns:MalformedQuery" whttp:code="400"/>

  <fault ref="tns:QueryRequestRefused" whttp:code="500"/>

 <!-- Описание операции обработки запроса -->

  <operation ref="tns:query" wsdlx:safe="true"

  whttp:method="GET" whttp:faultSerialization="*/*"

whttp:inputSerialization="application/x-www-form-urlencoded"

whttp:outputSerialization="application/sparql-results+xml, application/rdf+xml, */*" />

</binding>

Пример 6.3.62. Передача запроса SPARQL и возврат результата при использовании метода GET протокола HTTP:

Запрос

PREFIX dc:   <http://purl.org/dc/elements/1.1/>

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

PREFIX : <http://www.libRegistry.org/ns/lib#>

SELECT ?book ?bookTitle

WHERE  {

  ?book dc:creator "Кристи Агата"@ru;

  dc:title ?bookTitle .

   }

для  исходных документов в 6.3.51(1) и 6.3.51(2) в Web-службу www.bookLib.org/sparql передается с помощью следующего запроса HTTP:

GET /sparql/?query=URL-закодированный-запрос HTTP/1.1

Host: www.example

User-agent: my-sparql-client/0.1

Ответ HTTP будет иметь следующий вид:

HTTP/1.1 200 OK

Date: Fri, 1 August 2008 20:55:12 GMT

Server: IIS 5.0 (Windows) PHP/4.3.4 DAV/1.0.3

Connection: close

Content-Type: application/sparql-results+xml

<?xml version="1.0"?>

<sparql xmlns="http://www.w3.org/2005/sparql-results#">

<head>

  <variable name="book"/>

  <variable name="bookTitle"/>

</head>

<results>

  <result>

    <binding name="book">

 <uri>http://www.libRegistry.org/ns/lib#book4</uri>

    </binding>

    <binding name="bookTitle">

 <literal xml:lang="ru">

 Убийство в доме викария</literal>

</binding>

  </result>

  <result>

    <binding name="book">

 <uri>http://www.libRegistry.org/ns/lib#book1</uri>

    </binding>

    <binding name="bookTitle">

 <literal xml:lang="ru">

 Десять негритят</literal>

</binding>

  </result>

 </results>

</sparql>

Элемент binding для метода POST имеет следующий вид:

<binding name="queryHttpPost" interface="tns:SparqlQuery"

type="http://www.w3.org/2006/01/wsdl/http"

whttp:version="1.1">

 <!-- Ошибки при обработке запроса --> 

  <fault ref="tns:MalformedQuery" whttp:code="400"/>

  <fault ref="tns:QueryRequestRefused" whttp:code="500"/>

 <!-- Описание операции обработки запроса -->

  <operation ref="tns:query" wsdlx:safe="true"

  whttp:method="POST" whttp:faultSerialization="*/*"

whttp:inputSerialization="application/x-www-form-urlencoded"

whttp:outputSerialization="application/sparql-results+xml, application/rdf+xml, */*" />

</binding>

Пример 6.3.63. Передача запроса SPARQL и возврат результата при использовании метода POST протокола HTTP:

Запрос

PREFIX dc:   <http://purl.org/dc/elements/1.1/>

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

PREFIX : <http://www.libRegistry.org/ns/lib#>

SELECT ?bookAuthor ?bookTitle ?bookType

FROM <http://www.libRegistry.org/libs/bookLib.ttl>

FROM NAMED <http://www.libRegistry.org/libs/bookLib-1.ttl>

WHERE  {

  GRAPH <file:///D:/ARQ/bookLib-1.ttl>

  {

   ?book dc:title ?bookTitle;

   dc:creator ?bookAuthor;

   dc:type ?bookType;

   dc:language ?bookLanguage .

  }

  FILTER (?bookLanguage = "украинский"^^xsd:string)

   }

для  исходных документов в 6.3.51(1) и 6.3.51(2) в Web-службу www.bookLib.org/sparql передается с помощью следующего запроса HTTP:

POST /sparql/ HTTP/1.1

Host: www.example

User-agent: sparql-client/0.1

Content-Type: application/x-www-form-urlencoded

Content-Length: 236

query=URL-закодированный-запрос&default-graph-uri= http://www.libRegistry.org/libs/bookLib.ttl&

named-graph-uri=

http://www.libRegistry.org/libs/bookLib-1.ttl

Ответ HTTP будет иметь следующий вид:

HTTP/1.1 200 OK

Date: Fri, 1 August 2008 13:45:18 GMT

Server: IIS 5.0 (Windows) PHP/4.3.4 DAV/1.0.3

Connection: close

Content-Type: application/sparql-results+xml

<?xml version="1.0"?>

<sparql xmlns="http://www.w3.org/2005/sparql-results#">

<head>

  <variable name="bookAuthor"/>

  <variable name="bookTitle"/>

  <variable name="bookType"/>

</head>

<results>

  <result>

    <binding name="bookAuthor">

 <literal xml:lang="uk">

 Джоан Ролінг</literal>

    </binding>

    <binding name="bookTitle">

 <literal xml:lang="uk">

 Гаррі Поттер і орден Фенікса</literal>

</binding>

<binding name="bookType">

 <literal

 datatype="http://www.w3.org/2001/XMLSchema#string">

 детская</literal>

</binding>

  </result>

 </results>

</sparql>

6.3.6.3.3. Связывание с протоколом SOAP

Для связи с протоколом SOAP (см. 6.2.2) в описании Web-службы на языке WSDL 2.0 определен компонента Binding (см. 6.2.3.2.7). Связь с именем определена для запроса в элементе binding:

<binding name="querySoap" interface="SparqlQuery"

    type="http://www.w3.org/2006/01/wsdl/soap"

wsoap:version="1.2" wsoap:protocol=

"http://www.w3.org/2003/05/soap/bindings/HTTP">

 <!-- Ошибки при обработке запроса -->

  <fault ref="tns:MalformedQuery"

wsoap:code="soap:Sender"/>

    <fault ref="tns:QueryRequestRefused"

 wsoap:code="soap:Sender" />

 <!-- Описание операции обработки запроса -->

    <operation ref="tns:query"

wsoap:mep=

"http://www.w3.org/2003/05/soap/mep/request-response"/>

</binding>

Пример 6.3.64. Передача запроса SPARQL и возврат результата при использовании протокола SOAP:

Запрос

PREFIX dc:   <http://purl.org/dc/elements/1.1/>

PREFIX : <http://www.libRegistry.org/ns/lib#>

SELECT ?bookAuthor ?bookTitle

WHERE  {

  ?book dc:title ?bookTitle;

  dc:creator ?bookAuthor .

  FILTER (lang(?bookTitle) = "uk")

   }

для исходных документов в 6.3.51(1) и 6.3.51(2) при принимает следующий вид передаче запроса HTTP по протоколу SOAP принимает следующий вид:

POST /services/sparql-query HTTP/1.1

Content-Type: application/soap+xml

Accept: application/soap+xml, multipart/related, text/*

User-Agent: Axis/1.2.1

Host: www.example

SOAPAction: ""

Content-Length: 438

<?xml version="1.0" encoding="UTF-8"?>

<soapenv:Envelope xmlns:soapenv=

"http://www.w3.org/2003/05/soap-envelope/"

xmlns:xsd="http://www.w3.org/2001/XMLSchema"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

 <soapenv:Body>

   <query-request xmlns=

   "http://www.w3.org/2005/09/sparql-protocol-types/#">

     <query>PREFIX

     dc:   &lt;http://purl.org/dc/elements/1.1/&gt;

     SELECT ?bookAuthor ?bookTitle WHERE  {?book

  dc:title ?bookTitle;    

dc:creator ?bookAuthor .

  FILTER (lang(?bookTitle) = "uk")}</query>

   </query-request>

 </soapenv:Body>

</soapenv:Envelope>

Полученный ответ HTTP по протоколу SOAP будет иметь следующий вид:

HTTP/1.1 200 OK

Content-Type: application/soap+xml

<?xml version="1.0" encoding="utf-8"?>

<soapenv:Envelope xmlns:soapenv=

"http://www.w3.org/2003/05/soap-envelope/"

xmlns:xsd="http://www.w3.org/2001/XMLSchema"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

 <soapenv:Body>

   <query-result xmlns=

   "http://www.w3.org/2005/09/sparql-protocol-types/#">

     <ns1:sparql xmlns:ns1=

     "http://www.w3.org/2005/sparql-results#">

       <ns1:head>

         <ns1:variable name="bookAuthor"/>

 <ns1:variable name="bookTitle"/>

       </ns1:head>

       <ns1:results>

         <ns1:result>

           <ns1:binding name="bookAuthor">

             <ns1:literal xml:lang="uk">

   Шевченко Тарас</ns1:literal>

           </ns1:binding>

         </ns1:result>

 <ns1:result>

           <ns1:binding name="bookTitle">

             <ns1:literal xml:lang="uk">

   Кобзар</ns1:literal>

           </ns1:binding>

         </ns1:result>          

       </ns1:results>

     </ns1:sparql>

    </query-result>

  </soapenv:Body>

 </soapenv:Envelope>

Файл: file:///web/1/5fan/public_html/www/files/13/5fan_ru_69052_fd0804f7b0a6e78573317fa9155a13d1.doc   Создан: 2008-07-10T12:16:00Z Модифицирован: 2008-07-10T12:16:00Z     Автор:


 

А также другие работы, которые могут Вас заинтересовать

11723. Алгоритмизация и разработка программ разветвляющейся структуры с использованием условного оператора 70 KB
  Лабораторная работа №9 Алгоритмизация и разработка программ разветвляющейся структуры с использованием условного оператора Цель занятия: 1.Освоение алгоритмов и программ разветвляющейся структуры. 2.Получение навыков в использовании условного оператор...
11724. Организация циклических процессов с использованием цикла с параметром for 44.5 KB
  Лабораторная работа №10 Тема: Организация циклических процессов с использованием цикла с параметром for Цель занятия: 1.Освоение циклической структуры программы. 2.Получение навыков в выборе и использовании операторов цикла. Воп...
11725. Создание web-сайта и работа с ним 106.5 KB
  Лабораторная работа № 11. Создание webсайта и работа с ним. Цель: закрепить навыки и умения создания сайта с помощью мастераприложения Front Page. Работа с 6 режимами webузла. Выполнил: Голобородько И.В. Группа: 103ПО. Дата: 26.10.12. Проверила: Афанасьева Г. Ю. Ход работы
11726. Редактирование Web-страниц 23.31 KB
  Лабораторная работа №12 Редактирование Webстраниц. Цели работы: закрепить навыки и умения: ввода и форматирования текста постарения таблиц и списка настройки гиперссылок и закладок оформления страниц специальными объектами повышающими их привлекательность. Выпо
11727. Проводники. Сложной проводники 11.88 KB
  Лабораторная работа № 17 Проводники. Сложной проводники. Цели работы: закрепить умения и навыки формирования простых и сложных проводок. Выполнил: Романов П. Н. Группа: 091ПО Преподаватель: Афанасьева Г. Ю. Дата: 16.01.13 Ход работы: ...
11728. Ввод типовых операций 12.1 KB
  Лабораторная работа №16 Ввод типовых операций Цели работы: закрепить умения и навыки создания типовой операции работы с управляющими элементами типовой операции ввода типовой операции. Выполнил: Романов П. Н. Группа: 091ПО Преподаватель: Афана...
11729. Проектирование структуры. Нормализация таблиц 162.76 KB
  Лабораторная работа №1 Проектирование структуры. Нормализация таблиц. Цель: формирование практических умений и навыков логического проектирования базы данных: структуры базы данных; структуры таблиц входящих в состав базы данных; связей между таблицами. Закреплен
11730. Создание серверной части приложения: Файлы базы данных, таблицы 14.8 KB
  Лабораторная работа №2 Создание серверной части приложения: Файлы базы данных таблицы. Цель: формирование практических умений и навыков применения языка TransactSQL для создания объектов базы данных собственно самой базы данных таблиц входящих в состав базы данных; р
11731. Визуальное проектирование структуры базы данных: таблицы, индексы 36.07 KB
  Лабораторная работа №3 Визуальное проектирование структуры базы данных: таблицы индексы. Цель: формирование практических умений и навыков работы с SQL Server в графическом режиме через SQL Manager: создание структуры таблицы наложение ограничений на поля просмотр таблиц ...