Выполнение запросов на чтение баз знаний и данных из кода агентов

Введение

В документе описывается технология выполнения запросов к графовым базам знаний/данных и работы с их результатами в коде агентов платформы.
⚠ Для понимания данного документа необходимо ознакомиться с документом Конструирование и выполнение запросов на чтение баз знаний и данных.
⚠ В настоящее время поддерживаются только запросы на чтение.

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

Выполнение запросов

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

Результат работы метода – вершина, являющаяся корнем подграфа, описывающего результат выполнения запроса, то есть имеющая метапонятие "результат". Такая вершина создаётся автоматически (с очерденым порядковым номером - так как в метаинформации использован спецификатор ~seq). В случае вызова второго метода также выше данной вершины (начиная с корневой вершины запроса) формируются экземпляры вершин "выполнения" (если она отсутствовала, иначе - используется существующая), "выполнение" (с именем "autogenerated execution"). Под экземпляром вершины "результат" формируется вершина, содержащая само полученное значение (по одному из доступных метапонятий – см. выше). Для того, чтобы "добраться" до вершины с полученным значением необходимо выполнить:
IConcept resultValueConcept = executeQuery(...).getSuccessor("результаты / 1", this).getDirectSuccessors[0];
Далее с результатом необходимо работать разными способами, в зависимости от его типа (он известен разработчику агента при написании кода): Важно отметить, что инфоресурс, хранящий исполняемый запрос, должен быть подключён в решатель (как собственный) или сервис (как выходной), чтобы быть доступным для модификации при выполнении БП.

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

Конструктор запросов

Процесс вычисления запроса состоит в:
  1. формировании пользователем вершины "выполнения" у запроса (если таковой ещё нет)
  2. формировании под вершиной "выполнения" пользователем новой вершины по метапонятию "выполнение" (с заданием некоторого имени, отражающего суть этого выполнения) – при необходимости задания нового массива входных данных, а при отсутствии такой необходимости можно использовать ранее созданную вершину с таким метапонятием
  3. формировании ниже описания значений фактических параметров (для инфоресурсов и данных, если они есть) – причём все имена параметров должны быть зависимо-склонированы от имён формальных параметров, указываемые ссылками на корень целевые инфоресурсы должны быть сформированы по указанным в формальных параметрах метаинформациям, а значения данных должны соответствовать указанным в формальных параметрах типам
  4. формировании под вершиной "выполнения" пользователем новой вершины по метапонятию "результаты", а в случае повторного использования выполнений некоторого запроса можно использовать ранее созданную вершину с таким метапонятием
  5. отправке пользователем команды на вычисление результата запроса (по нажатию порождения "результат")
  6. выполнении конструктором вычисления результата запроса (это может быть длительный процесс, возможно, окно конструктора станет неактивно)
  7. отображении результата проверки (в момент, когда пользователь, обновит состояние конструктора, а результат проверки уже получен)

Примеры

Рассмотрим предметную область Медицина.

Пример 1

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

Ниже представлена модель онтологии базы наблюдений:
Онтология наблюдений
{
  ~setmm ~new группа признаков
  {
    ~setmm ~new -> группа признаков;
    ~setmm ~new признак
    {
      ~one ~new нижняя граница [real]
      ~one ~new верхняя граница [real]
    }
  }
}
Для описания запросов формируется отдельный целевой инфоресурс (по метаинформации "Язык описания запросов").

Сформулируем запрос более формально: найти все вершины с метапонятием "признак" под всеми вершинами с меткой "Жалобы" и метапонятием "группа признаков". Написание такого запроса делится на три части:
  1. указание на необходимость нахождения всех вершин с метапонятием "группа признаков"
  2. извлечь из них все те, у которых метка = "Жалобы"
  3. под всеми найденными вершинами найти все вершины с метапонятием "признак" (на любом "расстоянии" от вершин "Жалобы")
  4. вернуть объединение полученных множеств
Такой запрос с применением предложенного языка задаётся "снизу-вверх" следующим образом:
Примеры запросов <<< Платформа IACPaaS/Ядро платформы/Язык описания запросов
{
  запрос [Извлечь жалобы из БН] {
    формальные параметры {
      инфоресурсы {
        имя параметра [База Наб] {
          инфоресурс [-> Онтология базы медицинской терминологии и наблюдений$;]
      }}
      данные {}
    }
    тело запроса {
      терм {
        квантор объединения {
          терм-множество {
            множество соответствующих мета-пути вершин {
              начало пути {
                переменная [жалобы] {
                  терм-множество {
                    квантор интенсиональности {
                      формула {
                        равенство {
                          левая часть {
                            терм {
                              метка вершины {
                                терм {
                                  переменная [группы признаков] {
                                    терм-множество {
                                      множество соответствующих мета-пути вершин {
                                        начало пути {
                                          вершина {
                                            инфоресурс [-> Онтология базы медицинской терминологии и наблюдений$/.../Группа признаков;]
                                            область выбора [<- Примеры запросов$/Извлечь жалобы из БН/формальные параметры/инфоресурсы/База Наб;] 
                          }}}}}}}}}
                          правая часть {
                            терм {
                              строковая константа ["Жалобы"] 
                      }}}}
                      переменная [-> Примеры запросов$/Извлечь жалобы из БН/тело запроса/терм/квантор объединения/терм-множество/множество соответствующих мета-пути вершин/начало пути/жалобы/терм-множество/квантор интенсиональности/формула/равенство/левая часть/терм/метка вершины/терм/группы признаков;]
              }}}}
              конец пути {
                элемент пути [1] {
                  инфоресурс [-> Онтология базы медицинской терминологии и наблюдений$/.../Группа признаков/Признак;]
          }}}}
          переменная [-> Примеры запросов$/Извлечь жалобы из БН/тело запроса/терм/квантор объединения/терм-множество/множество соответствующих мета-пути вершин/начало пути/жалобы;]
    }}}
    выполнения { ... }
  }
}


Особенности составления данного запроса следующие:

К особенностям исполнения запроса можно отнести, то что его результатом является "множество" (вершина, создаваемая под вершиной "результат"), под которым сформированы ссылки на искомые вершины базы наблюдений (в составленном примере база наблюдений содержит 2849 признаков, а запрос вычислил 205, находящихся в группе "Жалобы").

Ниже представлен интерфейс Конструктора запросов с телом запроса, и его выполнением.


Рис.1. Поиск всех "Жалоб"

Пример 2

Другой задачей, стоящей перед мед. персоналом, может быть вычисление коэффициентов, характеризующих пациентов. Рассмотрим вычисление так называемого "Индекса массы тела". Формула для его вычисления следующая: ИМТ = вес / рост².

Сформулируем запрос на это вычисление формально: разделить вес на произведение роста и роста.

Такой запрос задаётся так:
Примеры запросов <<< Платформа IACPaaS/Ядро платформы/Язык описания запросов
{
  запрос [ИМТ] {
    формальные параметры {
      инфоресурсы {}
      данные {
        имя параметра [вес] {
           ["вершина"] 
        }
        имя параметра [рост] {
           ["вершина"] 
    }}}
    тело запроса {
      терм {
        частное {
          делимое {
            терм-число {
              метка вершины {
                терм {
                  параметр [<- Примеры запросов$/ИМТ/формальные параметры/данные/вес;] 
          }}}}
          делитель {
            терм-число {
              произведение {
                сомножитель [1] {
                  терм-число {
                    метка вершины {
                      терм {
                        параметр [<- Примеры запросов$/ИМТ/формальные параметры/данные/рост;] 
                }}}}
                сомножитель [2] {
                  терм-число {
                    метка вершины {
                      терм {
                        параметр [<- Примеры запросов$/ИМТ/формальные параметры/данные/рост;] 
    }}}}}}}}}}
    выполнения {...}
}}


Особенности составления данного запроса следующие: Ниже представлен интерфейс Конструктора запросов с телом запроса, и его выполнением.


Рис.2. Вычисление "ИМТ"


Пример 3

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

Сформулируем запрос на такую выборку формально (выбрав искомую подстроку "боль"): перебрать все вершины заданного инфоресурса и вернуть такое их подмножество, для каждой вершины которого её метка соотетствует регулярому выражению, описывающему правило "включает подстроку 'боль' независимо от регистра букв".

Такой запрос (исключая результаты выполнений) задаётся так:
Примеры запросов <<< Платформа IACPaaS/Ядро платформы/Язык описания запросов
{
  запрос [поиск боль] {
    формальные параметры {
      инфоресурсы {
        имя параметра [ИР] {
          инфоресурс [-> инфоресурс$;]
      }}
      данные {}
    }
    тело запроса {
      терм {
        квантор интенсиональности {
          переменная [вершина из ИР] {
            терм-множество {
              все вершины {
                область выбора [<- Примеры запросов$/поиск боль/формальные параметры/инфоресурсы/ИР;] 
          }}}
          формула {
            соответствие регулярному выражению {
              строка {
                терм-строка{
                  метка вершины{
                    терм {
                      переменная [-> Примеры запросов$/поиск боль/тело запроса/терм/квантор интенсиональности/вершина из ИР;]
              }}}}
              регулярное выражение [".*Б|бО|оЛ|лЬ|ь.*"] 
    }}}}}
    выполнения {
      выполнение [1] {
        фактические параметры {
          инфоресурсы {
            имя фактического параметра [<- Примеры запросов$/поиск боль/тело запроса/терм/квантор интенсиональности/вершина из ИР/терм-множество/все вершины/ИР;] {
              инфоресурс [-> База медицинской терминологии и наблюдений$;]
          }}
          данные {}
        }
        результаты {...}
}}}}

Особенности составления данного запроса следующие: