Перейти к основному содержимому

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

· 3 мин. чтения

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. Данные

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

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

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 .