Пример обратной цепочки в Drools

Пример обратной цепочки у слюней

1. обзор

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

Эта статья является частью серии, посвященнойDrools Business Rules Engine.

2. Maven Зависимости

Начнем с импорта drools-coredependency:


    org.drools
    drools-core
    7.4.1.Final

3. Вперед Цепочка

Прежде всего, при прямом построении цепочек мы начинаем с анализа данных и подходим к определенному выводу.

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

4. Обратная цепочка

В отличие от прямой цепочкиbackward chaining starts directly with the conclusion (hypothesis) and validates it by backtracking through a sequence of facts.

При сравнении прямой и обратной цепочкиthe first one can be described as “data-driven” (data as input), while the latter one can be described as “event(or goal)-driven” (goals as inputs).

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

5. Обратная цепочка слюни

Проект Drools был создан в первую очередь как система прямой цепочки. Но, начиная с версии 5.2.0, он также поддерживает обратную цепочку.

Давайте создадим простое приложение и попробуем проверить простую гипотезу -if the Great Wall of China is on Planet Earth.

5.1. Данные

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

  1. Планета земля

  2. Азия, Планета Земля

  3. Китай, Азия

  4. Великая Китайская стена, Китай

5.2. Определение правил

Теперь давайте создадим файл «.drl» с именемBackwardChaining.drl, который мы поместим в/resources/com/example/drools/rules/. Он будет содержать все необходимые запросы и правила, которые будут использоваться в примере.

Основной запросbelongsTo, который будет использовать обратную цепочку, можно записать как:

query belongsTo(String x, String y)
    Fact(x, y;)
    or
    (Fact(z, y;) and belongsTo(x, z;))
end

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

rule "Great Wall of China BELONGS TO Planet Earth"
when
    belongsTo("Great Wall of China", "Planet Earth";)
then
    result.setValue("Decision one taken: Great Wall of China BELONGS TO Planet Earth");
end

rule "print all facts"
when
    belongsTo(element, place;)
then
    result.addFact(element + " IS ELEMENT OF " + place);
end

5.3. Создание приложения

Теперь нам понадобится класс Java для представления фактов:

public class Fact {

    @Position(0)
    private String element;

    @Position(1)
    private String place;

    // getters, setters, constructors, and other methods ...
}

Здесь мы используем аннотацию@Position, чтобы сообщить приложению, в каком порядке Drools будет предоставлять значения для этих атрибутов.

Также мы создадим POJO, представляющий результаты:

public class Result {
    private String value;
    private List facts = new ArrayList<>();

    //... getters, setters, constructors, and other methods
}

И теперь мы можем запустить пример:

public class BackwardChainingTest {

    @Before
    public void before() {
        result = new Result();
        ksession = new DroolsBeanFactory().getKieSession();
    }

    @Test
    public void whenWallOfChinaIsGiven_ThenItBelongsToPlanetEarth() {

        ksession.setGlobal("result", result);
        ksession.insert(new Fact("Asia", "Planet Earth"));
        ksession.insert(new Fact("China", "Asia"));
        ksession.insert(new Fact("Great Wall of China", "China"));

        ksession.fireAllRules();

        assertEquals(
          result.getValue(),
          "Decision one taken: Great Wall of China BELONGS TO Planet Earth");
    }
}

Когда тестовые примеры выполнены, они добавляют данные факты («Asia belongs to Planet Earth», «Китайbelongs to Asia», «Великая китайская стена принадлежит Китаю»).

После этого факты обрабатываются по правилам, описанным вBackwardChaining.drl, что обеспечивает рекурсивный запросbelongsTo(String x, String y).

Этот запрос вызывается правилами, которые используют обратную цепочку, чтобы определить, является ли гипотеза (“Great Wall of China BELONGS TO Planet Earth”) истинной или ложной.

6. Заключение

Мы показали обзор Backward Chaining, функции Drools, используемой для получения списка фактов для проверки правильности решения.

Как всегда, полный пример можно найти в нашемGitHub repository.