drools 用户指南 ----Cross Products

Cross Products

之前提到“Cross Products”一词,其实就是一个 join 操作(译者注:可以理解为笛卡尔积)。想象一下,火灾报警示例的数据与以下规则结合使用,其中没有字段约束:

1
2
3
4
5
6
7
rule "Show Sprinklers" when
$room : Room()
$sprinkler : Sprinkler()
then
System.out.println("room:" + $room.getName() +
"sprinkler:" + $sprinkler.getRoom().getName() );
end

在 SQL 术语中,这就像是执行了 select * from Room, Sprinkler,Sprinkler 表中的每一行将与 Room 表中的每一行相连接,从而产生以下输出:


drools 用户指南 ----Methods vs Rules

Methods vs Rules

人们经常混淆方法和规则,初学者经常会问:“我如何理解规则的含义?“ 在最后一节之后,你会对规则的使用得心应手,答案也变得显而易见的,但在这之前,先让我们总结一下方法判断和规则的差异。

1
2
3
4
5
public void helloWorld(Person person) {
if (person.getName().equals("Chuck") ) {
System.out.println("Hello Chuck");
}
}

drools 用户指南 ----stateless session(无状态会话)的使用

stateless session 无状态会话

Drools 规则引擎中有如此多的用例和诸多功能,它变得令人难以置信。不过不用担心,复杂性是分层的,你可以用简单的用例来逐步了解 drools。

无状态会话,不使用推理,形成最简单的用例。无状态会话可以被称为函数传递一些数据,然后再接收一些结果。无状态会话的一些常见用例有以下但不限于:

  1. 验证
    这个人有资格获得抵押吗?
  2. 计算
    计算抵押保费。
  3. 路由和过滤
    将传入的邮件(如电子邮件)过滤到文件夹中。
    将传入的邮件发送到目的地。

所以让我们从使用驾驶执照应用程序的一个非常简单的例子开始吧。

1
2
3
4
5
6
public class Applicant {
private String name;
private int age;
private boolean valid;
// getter and setter methods here
}

现在我们有了我们的数据模型,我们可以写出我们的第一个规则。我们假设应用程序使用规则来拒绝不符合规则的申请。由于这是一个简单的验证用例,我们将添加一条规则来取消任何 18 岁以下的申请人的资格。

1
2
3
4
5
6
7
8
package com.company.license

rule "Is of valid age"
when
$a : Applicant(age < 18)
then
$a.setValid(false);
end

drools 用户指南 ----stateful session(有状态会话)的使用

stateful session 有状态会话

有状态会话长期存在,并允许随着时间的推移进行迭代更改。 有状态会话的一些常见用例包括但不限于:

  1. 监测
    半自动买入股票市场监控与分析。
  2. 诊断
    故障查找,医疗诊断
  3. 物流
    包裹跟踪和送货配置
  4. 合规
    验证市场交易的合法性。

与无状态会话相反,必须先调用 dispose() 方法,以确保没有内存泄漏,因为 KieBase 包含创建状态知识会话时的引用。 由于状态知识会话是最常用的会话类型,所以它只是在 KIE API 中命名为 KieSession。 KieSession 还支持 BatchExecutor 接口,如 StatelessKieSession,唯一的区别是 FireAllRules 命令在有状态会话结束时不被自动调用。

我们举例说明了用于提高火灾报警器的监控用例。 只使用四个类,我们假设 Room 代表房子里的房间,每个 Room 都有一个喷头 Sprinkler。 如果在房间里发生火灾,我们用一个 Fire 实例来表示, 用 Alarm 代表警报 。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Room {
private String name
// getter and setter methods here
}

public class Sprinkler {
private Room room;
private boolean on;
// getter and setter methods here
}

public class Fire {
private Room room;
// getter and setter methods here
}

public class Alarm {
}

在上一节无状态会话中介绍了插入和匹配数据的概念。 这个例子假设每个对象类型的都是单个实例被插入的,因此只使用了字面约束。 然而,房子有许多房间,因此 rules 必须表达实体类之间的关系,例如在某个房间内的喷洒器。 这最好通过使用绑定变量作为模式中的约束来完成。 这种“加入”过程产生了所谓的“cross products”,这在下一节中将会介绍。


Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×