日期:2014-05-16  浏览次数:20521 次

规则引擎数据库实现的一个设想
看了jbossrules是实现是把规则写在一个文本文件中,然后解析翻译这个文件。规则被分成when .. then..两个部分。这种实现方式的好处是规则的变化、书写很灵活,并且和java代码很容易结合起来,但是问题是规则文件不能由系统的最终用户来编写。
有没有可能把规则用数据库来表达呢,这样就很容易针对这几张表做一个crud的操作,给最终用户一个操作界面就能维护规则了,目前没有这种把规则定义在数据库的规则引擎,不知道有没有,是否是相对于文件形式弊端太多。我的想法如下:
规则分成两部分,在jbossrules中是lhs,rhs,即左手边条件,右手边结果。条件可以理解为某个项目的取值,取值有两种情况:连续值和离散值,比如工资是个连续值,性别是离散值;结果可转化为一个数值,比如打折的折扣规则最终要的结果就是一个折扣比率,如果结果要求的是等级的划分,也可以用数值来编码,比如1代表贵宾客户,2代表普通客户。
这样规则表就分连续规则表和离散规则表两种
连续规则表:
项目??????? 下限??????? 下限开闭??????? 上限??????? 上限开闭??????? 结果
-------------------------------------
工资??????? 1000??????? 开??????????????? 2000??????? 闭?????????? 5
工资??????? 2000??????? 开??????????????? 3000??????? 闭?????????? 10
上面这两条记录表示工资(1000,2000] 积分算5分,工资在(2000,3000]这个区间积分算10分。下限为空时表示没有下限,上限同理。
离散规则表:
项目??????? 取值??????? 结果
-----------------------------
性别??????? 男??????? 5
性别??????? 女??????? 10
上面两条记录表示性别取值是男、女分别积分算5分、10分。
一条规则由N个“项目”组成,这些“项目”就是jbossrules中的fact的度量值,比如工资、性别等等。所以规则表如下:
规则表:
规则id??????? 项目??????? 离散/连续
------------------------------------
1???????????? 工资??????? 连续
1???????????? 性别??????? 离散
这个规则表示由两个项目组成。当一个业务行为的数据传进来比如一个工资为1800男性客户需要计算他的积分,则把规则id为 1的积分规则所有项目与规则表的项目关联,分别累加每个项目的积分值得到总和。

这种想法可行吗?
6 楼 gtivan 2006-12-30  
之前做了一个rule engine UI 让客户通过界面去编辑规则集
个人认为这个并不复杂 复杂的是规则集中决策表的覆盖 完整性的校验
7 楼 eyejava 2006-12-31  
fins 写道
可以看看这个

http://www.iteye.com/topic/41690

这个设计很不错。但是你的条件表达式还是一些基于sql的语句啊,如何能让用户也会书写呢?另外你规则组的排他性不知道怎么实现的,对这个我还没有体会到规则交叉带来的麻烦,rete算法可能就是为了解决这个问题的吧。

把不同的计分项目拆解开放在数据库保存发现有很大的问题,因为逻辑运算(与,并,非)无法进行,比如工资>2000 && 性别=女 计分为10分, 这种复杂的组合 很难用数据库来表达,只能写成表达式。
8 楼 fins 2006-12-31  
我这个排他性 和 规则引擎中的排他性定义不同

我这个排他性是这样的
一个规则组内的规则A 规则B 规则C 不是排他的
那么最后会得到类似下面的语句
IF 纪录X 满足 规则A的条件  then 执行 规则A的动作
IF 纪录X 满足 规则B的条件  then 执行 规则B的动作
IF 纪录X 满足 规则C的条件  then 执行 规则C的动作

如果是排他的 那么
IF 纪录X 满足 规则A的条件  then 执行 规则A的动作
ELSE IF 纪录X 满足 规则B的条件  then 执行 规则B的动作
ELSE IF 纪录X 满足 规则C的条件  then 执行 规则C的动作

差别就是 在一个组内 是否满足了自己 就不去判断其他规则了
这个要和规则优先级一起使用




9 楼 yimlin 2006-12-31  
在springside1.0早的时候,就基于drools2.5实现了基于数据库存储的规则,当然现ss2.0用上drools3.0,要把规则放到数据库中也是可以的,不过web界面的编辑就需要自己做了。
10 楼 fins 2006-12-31  
其实我那个规则引擎 不是基于数据库存储
而是基于数据库pl/sql实现的
和java没有关系 功能很弱 所以我也没发到这里来
11 楼 eyejava 2006-12-31  
yimlin 写道
在springside1.0早的时候,就基于drools2.5实现了基于数据库存储的规则,当然现ss2.0用上drools3.0,要把规则放到数据库中也是可以的,不过web界面的编辑就需要自己做了。

我从svn上拿下来的jbossrules包里面 没几个代码,擦亮眼睛找了几圈都没找到,springside那边说正在开发。
12 楼 yimlin 2006-12-31  
fins 写道
其实我那个规则引擎 不是基于数据库存储
而是基于数据库pl/sql实现的
和java没有关系 功能很弱 所以我也没发到这里来


你的组织结构让我想起了MS BizTalk的规则组织结构,只不过你最后是通过拼接文本来必要的语法结构。而BizTalk则在表上实现了树形的语法结构。
关于计算因子,也就是Fact,plsql只能怎么做,和java不同的是,通常这些项是数据项,不如java来的丰富。

我个人认为这样的产品或者项目更多是脚本引擎而不是规则引擎,因为规则的推理演算没有重入,而规则的冲突处理在应用程序就消除了。