Рубрики
Без рубрики

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

Узнайте, что такое обратная цепочка и как ее использовать на практике, с помощью слюней.

Автор оригинала: baeldung.

1. Обзор

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

Эта статья является частью серии, демонстрирующей механизм бизнес-правил Drools .

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

Давайте начнем с импорта drools-core dependency :


    org.drools
    drools-core
    7.4.1.Final

3. Прямая цепочка

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

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

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

В отличие от прямой цепочки, обратная цепочка начинается непосредственно с вывода (гипотезы) и проверяет его, возвращаясь к последовательности фактов.

При сравнении прямой цепочки и обратной цепочки первую можно описать как “управляемую данными” (данные в качестве входных данных), в то время как последнюю можно описать как “управляемую событиями(или целями)” (цели в качестве входных данных).

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

5. Пускает Слюни Назад Цепочкой

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

Давайте создадим простое приложение и попробуем проверить простую гипотезу – если Великая Китайская стена находится на планете Земля .

5.1. Данные

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

  1. Планета Земля
  2. Азия, Планета Земля
  3. Китай, Азия
  4. Великая Китайская стена, Китай

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

Теперь давайте создадим файл “.drl” с именем Обратная цепочка.drl , который мы разместим в /resources/com/baeldung/drools/rules/|/. Это будет содержать все необходимые запросы и правила, которые будут использоваться в примере.

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

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");
    }
}

Когда тестовые примеры выполняются, они добавляют приведенные факты (” Азия принадлежит планете Земля “, “Китай принадлежит Азия”, “Великая Китайская стена принадлежит Китаю”).

После этого факты обрабатываются с помощью правил, описанных в Backward Chaining.drl , который предоставляет рекурсивный запрос belongsTo(Строка x, строка y).

Этот запрос вызывается правилами, которые используют обратную цепочку, чтобы определить, является ли гипотеза ( “Великая Китайская стена ПРИНАДЛЕЖИТ планете Земля” ) истинной или ложной.

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

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

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