版权声明:本文为博主九师兄(QQ群:spark源代码 198279782 欢迎来探讨技术)原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21383435/article/details/82966858
本人初步了解,很可能有错,欢迎指正
1.rate算法简介
Rete匹配算法是一种进行大量模式集合和大量对象集合间比较的高效方法,通过这种方法找出所有匹配各个模式的对象。
- Rete算法以牺牲内存换取高速的策略
- Rete算法分为两个部分:规则编译(rule compilation)、运行时执行(runtime execution).
1.1 规则编译(rule compilation
这是一条规则,编译后如下图
rule "规则3:账户余额小于100的北苑路姓张的学生"
when
$account:Account(balance<100,type=Account.Type.学生)
$customer:Customer(accounts contains $account)
$addr:Addr(street="北苑路",customers contains $customer)
then
print("账户余额小于100的北苑路姓张的学生");
end
编译后的rete网络,如下
1.2 运行时执行
当一个应用assert一个对象,引擎将数据传递到root node,中这里开始遍历网络。当对象匹配一个节点的条件,节点就将它记录到相应的内存中(可以带来更快的性能)
1.3 看图总结
假设事实流
事实A | 事实B | 事实C | 事实D |
---|---|---|---|
UserA | UserB | UserC | UserD |
Account.balance : 200 | Account.balance : 90 | Account.balance : 90 | Account.balance : 90 |
Customer.firstName : li | Customer.firstName : li | Customer.firstName : zhang | Customer.firstName : zhang |
Addr.street : 合路 | Addr.street : 长江路 | Addr.street : 北路 | Addr.street : 北苑路 |
四个事实,那么
- A先去rete网络进行匹配,第一个条件
balance< 100
直接没通过,所有,A被扔掉 - B去rete网络进行匹配,第一个条件
balance< 100
直接通过
,放到内存,如果没有后续添加,打印结果1
- C去rete网络进行匹配,第一个条件
balance< 100
直接通过
,放到内存,第二个条件没通过Customer.firstName : li
,C扔掉 - D全通过,保存到内存,没有更多条件,打印结果
参考:
https://blog.csdn.net/lihuayong/article/details/82712584
https://blog.csdn.net/u012373815/article/details/53869097?locationNum=1&fps=1