Комплексные запросы

Документация по созданию и использованию комплексных запросов для извлечения семантических данных

Структура описания комплексного запроса

"Комплексные запросы" (пример) это набор инструкций для извлечения данных, их обраобтки и преставления. Комплексные запросы включают в себя следующие элементы (разделы):

  • SPARQL-запрос для извлечения данных (обязательно)
  • XQuery-запрос (или XLST-инструкция) для трансформации (парсинга) извлеченных данных (опционально)
  • шаблон в формате XHTML, в который будут помещены обработанные данные (опционально)
  • параметры извлечения и трансоформации (опционально):
    • формат сериализации извлекаемых из RDF-хранилища данных (xml (по умолчанию) или json)
    • формат сериализации результата - любой релевантный mime-тип, например, text/plain, xml (по умолчанию), html, json

Указанные элементы размещают на одной странице в виде ненумерованного списка и оформляются с учетом требований rdf/md-разметки. На странице описания комплексного запроса присутвует также элемент, указывающий на то к какому классу (типу) относится объект, описанный на странице ([Запрос](/онтология/Запрос 'тип:')).

Пример страницы на языке markdawn с описанием комплексного запроса:

`

---
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).

Если в описании запроса комплексного запроса отсутствует шаблон, то результаты будут вставлены в тег .

Как создать свой комплексный запрос за 7 шагов

  1. Создайте страницу-заготовку комплексного запроса только с запросом данных; например, в качестве шаблона можно взять этот запрос

  2. Отработайте запрос данных в интефейсе RDF-хранилища последовательно его усложняйте, добиваясь нужного: а) просто список классов б) список классов с сортировкой по буквам и цифрам в) можно добавить фильтр (классы только одной параллели) ;

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

        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", "")
  4. Проверьте как работает ваш запрос (пока без рендеринга) http://a.roz37.ru:9984/garpix/semantik/app/request/execute?rp=http://a.roz37.ru/lipers/документация/примеры/комплексные-запросы/реестр-классов-только-данные-с-параметром&номерПараллели=5

  5. Теперь можно добавить простую обработку (рендеринг)

        for-each(., function($i){<класс>{$i/класс/value/text()}</класс>})   
  6. Проверьте результат с рендерингом 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>
  7. Остается добавить шаблон

        <div/>

И должно получиться примерно так http://a.roz37.ru:9984/garpix/semantik/app/request/execute?rp=http://a.roz37.ru/lipers/документация/примеры/комплексные-запросы/реестр-классов-html&номерПараллели=5