1. Обзор
В этой статье мы увидим, что такое обратная цепочка и как мы можем использовать ее с Drools.
Эта статья является частью серии статей, посвященных механизму бизнес-правил Drools .
2. Зависимости Maven
Начнем с импорта зависимости drools-core :
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>7.4.1.Final</version>
</dependency>
3. Прямая цепочка
Прежде всего, с прямой цепочкой мы начинаем с анализа данных и продвигаемся к определенному выводу.
Примером применения прямой цепочки может быть система, которая обнаруживает новые маршруты, проверяя уже известные соединения между узлами.
4. Обратная цепочка
В отличие от прямой цепочки, обратная цепочка начинается непосредственно с вывода (гипотезы) и подтверждает его путем обратного отслеживания последовательности фактов.
При сравнении прямой цепочки и обратной цепочки первая может быть описана как «управляемая данными» (данные в качестве входных данных), а последняя может быть описана как «управляемая событиями (или целями)» (цели в качестве входных данных).
Примером применения обратной цепочки может быть проверка наличия маршрута, соединяющего два узла.
5. Слюни в обратном направлении
Проект Drools был создан в первую очередь как система прямой цепочки. Но, начиная с версии 5.2.0, он также поддерживает обратную цепочку.
Давайте создадим простое приложение и попробуем проверить простую гипотезу — есть ли Великая Китайская стена на планете Земля
.
5.1. Данные
Создадим простую базу фактов, описывающую вещи и их местонахождение:
Планета земля
Азия, Планета Земля
Китай, Азия
Великая Китайская стена, Китай
5.2. Определение правил
Теперь давайте создадим файл «.drl» с именем BackwardChaining.drl
, который мы поместим в /resources/com/foreach/drools/rules/
. Он будет содержать все необходимые запросы и правила, которые будут использоваться в примере.
Основной запрос ownTo
, который будет использовать обратную цепочку, можно записать так:
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<String> 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");
}
}
При выполнении контрольных примеров добавляются заданные факты (« Азия принадлежит планете Земля
», «Китай принадлежит
Азии», «Великая Китайская стена принадлежит Китаю»).
После этого факты обрабатываются по правилам, описанным в BackwardChaining.drl
, что обеспечивает рекурсивный запрос ownTo(String x, String y).
Этот запрос вызывается правилами, которые используют обратную цепочку, чтобы определить, является ли гипотеза ( «Великая Китайская стена ПРИНАДЛЕЖИТ планете Земля»
) истинной или ложной.
6. Заключение
Мы показали обзор Backward Chaining, функции Drools, используемой для получения списка фактов для проверки правильности решения.
Как всегда, полный пример можно найти в нашем репозитории GitHub .