1. Обзор
В этой статье мы увидим, что такое обратная цепочка и как мы можем использовать ее с помощью слюней.
Эта статья является частью серии, демонстрирующей механизм бизнес-правил Drools .
2. Зависимости Maven
Давайте начнем с импорта drools-core dependency :
org.drools drools-core 7.4.1.Final
3. Прямая цепочка
Прежде всего, с помощью прямой цепочки мы начинаем с анализа данных и продвигаемся к определенному выводу.
Примером применения прямой цепочки может служить система, которая обнаруживает новые маршруты, проверяя уже известные соединения между узлами.
4. Обратная цепочка
В отличие от прямой цепочки, обратная цепочка начинается непосредственно с вывода (гипотезы) и проверяет его, возвращаясь к последовательности фактов.
При сравнении прямой цепочки и обратной цепочки первую можно описать как “управляемую данными” (данные в качестве входных данных), в то время как последнюю можно описать как “управляемую событиями(или целями)” (цели в качестве входных данных).
Примером применения обратной цепочки может быть проверка наличия маршрута, соединяющего два узла.
5. Пускает Слюни Назад Цепочкой
Проект Drools был создан в первую очередь как система прямой цепочки. Но, начиная с версии 5.2.0, он также поддерживает обратную цепочку.
Давайте создадим простое приложение и попробуем проверить простую гипотезу – если Великая Китайская стена находится на планете Земля .
5.1. Данные
Давайте создадим простую базу фактов, описывающую вещи и их местоположение:
- Планета Земля
- Азия, Планета Земля
- Китай, Азия
- Великая Китайская стена, Китай
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 Listfacts = 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 .