Документация по созданию и использованию комплексных запросов для извлечения семантических данных
"Комплексные запросы" (пример) это набор инструкций для извлечения данных, их обраобтки и преставления. Комплексные запросы включают в себя следующие элементы (разделы):
xml
(по умолчанию) или json
)text/plain
, xml
(по умолчанию), html
, json
Указанные элементы размещают на одной странице в виде ненумерованного списка и оформляются с учетом требований rdf/md-разметки.
На странице описания комплексного запроса присутвует также элемент, указывающий на то к какому классу (типу) относится объект, описанный на странице ([Запрос](/онтология/Запрос 'тип:')
).
`
---
title: Пример комплексного запроса с html-сериализацией данных
---
!!!! [Запрос](/онтология/Запрос 'тип:') формирует реестр классов
Свойства запроса[](#_ 'свойстваЗапроса:')
- [Данные](# '_свойствоЗапроса:')
```sparql
# список классов
PREFIX источник: <http://lipers.ru/lipers-simplex/Spravochniki/Reestr-classov.xlsx>
PREFIX признак: <http://lipers.ru/схема/признаки/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT ?класс
WHERE {
GRAPH источник: {
?s признак:названиеКласса ?класс
}
}
ORDER BY xsd:integer(REPLACE(?класс, "\\D", "")) REPLACE(?класс, "\\d", "")
```
- [Рендеринг](# '_свойствоЗапроса:')
```xquery
let $data := .
return
<table border="1">
<tr>
<td>№ пп</td>
<td>Класс</td>
</tr>
{
for $i in $data
count $c
return
<tr>
<td>{$c}</td>
<td>{$i/класс/value/text()}</td>
</tr>
}
</table>
```
- [Шаблон](# '_свойствоЗапроса:')
```html
<div/>
```
`
Структура дерева данных, в зависимости от выбранного варианта сериализации данных (json
- по умолчанию или xml
), полученных из RDF-хранилища, будет отличаться:
json
будет так;xml
будет так (обратите внимание, что при xml-сериализации имена всех узлов ответа находятся в пространстве имен "http://www.w3.org/2005/sparql-results#" - это надо иметь в виду при рендеринге данных запросом xquery).Если в описании запроса комплексного запроса отсутствует шаблон, то результаты будут вставлены в тег
Создайте страницу-заготовку комплексного запроса только с запросом данных; например, в качестве шаблона можно взять этот запрос
Отработайте запрос данных в интефейсе RDF-хранилища последовательно его усложняйте, добиваясь нужного: а) просто список классов б) список классов с сортировкой по буквам и цифрам в) можно добавить фильтр (классы только одной параллели) ;
Для того чтобы можно было запрашивать классы разных параллелей замените значение, которое будет передаваться в запросе через параметр на имя параметра в двойных фигурных скобках:
PREFIX источник: <http://lipers.ru/lipers-simplex/Spravochniki/Reestr-classov.xlsx>
PREFIX признак: <http://lipers.ru/схема/признаки/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT ?класс
WHERE {
GRAPH источник: {
?s признак:названиеКласса ?класс
}
FILTER (xsd:integer(REPLACE(?класс, "\\D", ""))={{номерПараллели}})
}
ORDER BY xsd:integer(REPLACE(?класс, "\\D", "")) REPLACE(?класс, "\\d", "")
Проверьте как работает ваш запрос (пока без рендеринга) http://a.roz37.ru:9984/garpix/semantik/app/request/execute?rp=http://a.roz37.ru/lipers/документация/примеры/комплексные-запросы/реестр-классов-только-данные-с-параметром&номерПараллели=5
Теперь можно добавить простую обработку (рендеринг)
for-each(., function($i){<класс>{$i/класс/value/text()}</класс>})
Проверьте результат с рендерингом http://a.roz37.ru:9984/garpix/semantik/app/request/execute?rp=http://a.roz37.ru/lipers/документация/примеры/комплексные-запросы/реестр-классов-минимальный&номерПараллели=5
И усложните обработку (рендеринг):
let $data := .
return
<table border="1">
<tr>
<td>№ пп</td>
<td>Класс</td>
</tr>
{
for $i in $data
count $c
return
<tr>
<td>{$c}</td>
<td>{$i/класс/value/text()}</td>
</tr>
}
</table>
Остается добавить шаблон
<div/>
И должно получиться примерно так http://a.roz37.ru:9984/garpix/semantik/app/request/execute?rp=http://a.roz37.ru/lipers/документация/примеры/комплексные-запросы/реестр-классов-html&номерПараллели=5