Перейти к содержанию

Вычисление объектов, удовлетворяющих условию

  • Область применения: Вычисляемый атрибут

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

Проект «Космический туризм», необходимые навыки для работы в проекте: Астрономия, Иностранные языки, Логистика.

Сотрудник №1 обладает навыками: Астрономия, Логистика, Программирование, Сетевые технологии.

Сотрудник №2 обладает навыками: Веб-дизайн, "Астрономия, Иностранные языки, Логистика.

У сотрудника №1 нет всех необходимых навыков для участия в проекте, его не нужно отображать в коллекции. А сотрудник №2 подходит, его нужно отобразить.  

Модель данных:

  • Шаблон записи «Проекты» (projects):
    • Атрибут «Необходимые навыки» (required_skills), ссылающийся на справочник «Навыки» (несколько значений);
    • Атрибут «Сотрудники, подходящие для проекта», ссылающийся на справочник «Сотрудники» (несколько значений).
  • Шаблон записи «Сотрудники» (employees):
    • Атрибут «Навыки сотрудника» (available_skills), ссылающийся на справочник «Навыки» (несколько значений).
  •   Шаблон записи «Навыки».

Для того, чтобы вычислить объекты, удовлетворяющие условию, заданному в основном объекте (в данном случае, сотрудников с необходимыми навыками), введите следующее выражение:

@prefix object: <http://comindware.com/ontology/object#>.
@prefix assert: <http://comindware.com/logics/assert#>.
@prefix cmw: <http://comindware.com/logics#>.
{
    ("projects" "required_skills") object:findProperty ?PropertyLittle. 
    ("employees" "available_skills") object:findProperty ?PropertyBig.


    ?container object:alias "employees". 
    ?allObjs cmw:container ?container.

    {
        ?item ?PropertyLittle ?resultL.
        ?allObjs ?PropertyBig ?resultL.
    } assert:count ?c.

    {
        ?item ?PropertyLittle ?resultA.
    } assert:count ?d.
    
    if {?c == ?d}
    then {?allObjs -> ?value.}
}