xls就是一个一个excel文件(decisiontable)规则文件介绍

优采云 发布时间: 2021-08-19 21:37

  

xls就是一个一个excel文件(decisiontable)规则文件介绍

  1.drools是什么

<p>Drools是为Java量身定制的基于Charles  Forgy的RETE算法的规则引擎的实现。具有了OO接口的RETE,使得商业规则有了更自然的表达。

  Rule是什么呢?

   

  一条规则是对商业知识的编码。一条规则有 attributes ,一个 Left Hand Side ( LHS )和一个 Right Hand Side ( RHS )。Drools 允许下列几种 attributes : salience , agenda-group , no-loop , auto-focus , duration , activation-group  。

  规则的 LHS 由一个或多个条件( Conditions )组成。当所有的条件( Conditions )都满足并为真时, RHS 将被执行。 RHS 被称为结果( Consequence )。 LHS 和 RHS 类似于

  if(){

  }

  下面介绍几个术语:

  对新的数据和被修改的数据进行规则的匹配称为模式匹配( Pattern Matching )。进行匹配的引擎称为推理机( Inference Engine )。被访问的规则称为 ProductionMemory ,被推理机进行匹配的数据称为 WorkingMemory 。 Agenda 管理被匹配规则的执行。推理机所采用的模式匹配算法有下列几种: Linear , RETE , Treat , Leaps 。这里注意加红的地方,对数据的修改也会触发重新匹配,即对 WorkingMemory中的数据进行了修改。

  然后规则引擎大概是这个样子的:

  

  这个图也很好理解,就是推理机拿到数据和规则后,进行匹配,然后把匹配的规则和数据传递给Agenda。

  规则引擎实现了数据同逻辑的完全解耦。规则并不能被直接调用,因为它们不是方法或函数,规则的激发是对 WorkingMemory 中数据变化的响应。结果( Consequence ,即 RHS )作为 LHS events 完全匹配的 Listener 。

  数据被 assert 进 WorkingMemory 后,和 RuleBase 中的 rule 进行匹配(确切的说应该是 rule 的 LHS ),如果匹配成功这条 rule 连同和它匹配的数据(此时就叫做 Activation )一起被放入 Agenda ,等待 Agenda 来负责安排激发 Activation (其实就是执行 rule 的 RHS ),上图中的菱形部分就是在 Agenda 中来执行的, Agenda 就会根据冲突解决策略来安排 Activation 的执行顺序。

  下面附上drools规则引擎的执行过程

  

   

2.rete算法

  参考链接:Rete Algorithm

  rete在拉丁文里是net network的意思,这个算法由 Charles Forgy  博士在他的博士论文里提到。

  这个算法可以分为两个部分,一个是如何编译规则,一个是如何执行。原话(The Rete algorithm can be broken into 2 parts: rule compilation and runtime execution.)

  rule compilation 就是如何通过对所有规则进行处理,生成一个有效的辨别网络。而一个辨别网络,则对数据进行过滤,使数据一步步往下传送。数据刚进入网络,有很多的匹配条件,这里可以理解为:逻辑表达式为true or false,然后在网络里往下传递的时候,匹配的条件越来越少,最后到达一个终止节点。

  在这个论文里Dr Charles描述了这么几个节点,Node:

2.rete算法

  参考链接:Rete Algorithm

  rete在拉丁文里是net network的意思,这个算法由 Charles Forgy  博士在他的博士论文里提到。

  这个算法可以分为两个部分,一个是如何编译规则,一个是如何执行。原话(The Rete algorithm can be broken into 2 parts: rule compilation and runtime execution.)

  rule compilation 就是如何通过对所有规则进行处理,生成一个有效的辨别网络。而一个辨别网络,则对数据进行过滤,使数据一步步往下传送。数据刚进入网络,有很多的匹配条件,这里可以理解为:逻辑表达式为true or false,然后在网络里往下传递的时候,匹配的条件越来越少,最后到达一个终止节点。

  在这个论文里Dr Charles描述了这么几个节点,Node:

  

   

  这里对其中的几个节点做一下简单介绍,另外说一下如何运作的。

首先,root node是所有的对象都可以进入的节点,也是辨别网络的一个入口,这个可以理解为一个虚节点,其实可能并不存在。然后立马进入到ObjectTypeNode节点,这是一个对象类型节点。很明显,这里承载的是一个对象,可以理解为是java中的某个new Object(),在这个算法里,这个节点的作用就是为了保证不做一些无用功,什么无用功呢,就是不是对每个规则,进入的对象都要去辨别一遍,而是确定的对象类型,去做跟他相关的辨别,其实就是match。那么怎么做到呢?这里用到了一个hashMap,每次进入网络的对象,都会在这个map中通过hash,找到一个对应的辨别路径去辨别,即match。附上英文原文:(

  Drools extends Rete by optimizing the propagation from ObjectTypeNode to AlphaNode using hashing. Each time an AlphaNode is added to an ObjectTypeNode it adds the literal value as a key to the HashMap with the AlphaNode as the value. When a new instance enters the ObjectType node, rather than propagating to each AlphaNode, it can instead retrieve the correct AlphaNode from the HashMap,thereby avoiding unnecessary literal checks.) <br /> 一个图来说明:

  

  所有经过ObjectTypeNode的对象都会走到下一个节点,下一个节点可以是下面的几种:AlphaNodes, LeftInputAdapterNodes and BetaNodes。后面两个节点是AlphaNodes节点的一些变种,AlphaNodes节点是用来判断一些条件的。可以理解为一些逻辑表达式的计算。<br /><br /> 下面开始上图:

  

这个图就是传递进一个Cheese对象,然后依次判断是否满足条件:1.判断name是否是“cheddar”,2.如果判断1通过了,继续判断strength是否是strong。这是最简单了一种情况了,这里附上对应的规则描述,后面会继续讲解:<br /> rule "cheessRule" when<br /> $cheese:Cheese(name == "cheddar" && strength == "strong")<br /> then<br /> ......<br /> end<br />  

3.maven依赖

  这里列了一些后面的一些例子需要用到的maven依赖

</p>

  

org.kie

kie-api

org.drools

drools-core

org.drools

drools-compiler

org.drools

drools-decisiontables

org.drools

drools-templates

  4.Rules 文件:.drl 或 xls

  我们一般使用这两种形式。一种是drl文件,这是drools规则引擎提供的最原生的方式。语法非常简单。具体语法见drools语法介绍。

  还有一个决策表。决策表可以是 xls 或 csv。我们一般用xls比较多。并且易于理解。 xls 是一个 excel 文件。 ps:在使用过程中遇到了很多坑,最大的坑之一就是mac系统的问题,这里就安利了。

  drl 文件

  我们先来看看drl文件,在node的第二篇文章中已经提到过。

  示例:

  package com.sankuai.meituan.maxtse.drools.test

import com.sankuai.meituan.maxtse.drools.po.Student

rule "ageUp12" when

 $student: Student(age > 2)

then

 $student.ageUp12();

end

rule "nameMax" when

 $student: Student(name == "max")

then

 $student.nameMax();

retract($student);

end

  简单说明:以第一个rule为例

  在第二个例子中,你可以看到有一个retract($student)。这是drools提供的一个功能。详情请参考关于drools语法介绍的博客。

  决策表(decisiontable)

  决策表是一个excel文件,可以是xls(目前不支持xlsx)或者csv是一个表格。看起来很直观,连看不懂代码的人都能看懂,不像drl文件那么多。语法。关键是:决策表也最终转化为drl文件,供drools规则引擎解析执行。 *.xls 到 *.drl 的转换将在以下 wiki 中讨论。

  直接上图

  

  这里可以暂时忽略背景色,只是为了区分各个模块的功能

  忽略文件开头的空行,从有数据的第一行开始解释:

  第一行第一列:RuleSet,第二列com.sankuai.meituan.maxtse.drools.test。这里的RuleSet可以省略,就像drl文件中的包

  第二行,第一列:Import 具体java类的第二列,这里对应drl文件中的Improt,多个引用类用逗号隔开

  第三行是对这个决策表的描述

  第四行,第一列:RuleTable FirstDecisionTable 这一行很重要,说明这是一个决策表,下面几行是具体的规则,就像上面几行是一些准备条件一样,下面才是真正的action住哪里,这里有解释

  第五行,CONDITION 行,这一行可以有两个列名:CONDITION ACTION。 CONDITION列是drl中的识别条件,ACTION是具体的操作,也就是满足前面几列的CONDITION条件后,会进行什么操作。这里,CONDITION 必须在 ACTION 之前,并且 ACTION 可以有多个列。单个 ACTION 中的一个 多个操作用逗号分隔。最后加分号很重要,否则会出现解析错误。

  第六行,在CONDITION行旁边,可以声明下面要使用的对象,对应drl文件中的$student:Student()

  第七行是识别条件的逻辑表达式,如:student.getAge()==$param对应drl中的age==12,其中$param是对应列中每个单元格的值,而那么这里就需要了,特别是对于非字符串,如整数、小数等,可以直接使用$param,但是如果单元格是字符串,则需要加双引号。 (ps:mac中的双引号是斜的,一定要竖") 另外,如果有多个值,可以用逗号隔开,然后用$1,$2提取变量值,比如第一个ACTION Student.doAction1($1,"$2")

  第八行还是注释行,可以添加对每个CONDITON ACTION列的描述。

  下面的每一行是一些对应条件的值。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线