锁定老帖子 主题:规则引擎数据库实现的一个设想
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-12-30
有没有可能把规则用数据库来表达呢,这样就很容易针对这几张表做一个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的积分规则所有项目与规则表的项目关联,分别累加每个项目的积分值得到总和。 这种想法可行吗? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-12-30
感觉楼主的想法应该是能实现的,我们正在做一个类似的东西,底层使用ajoo的jrc实现,不过这样的规则引擎的实用范围可能要比jbossrules要窄。
|
|
返回顶楼 | |
发表时间:2006-12-30
看看这篇文章:
Loading and managing rules dynamically from a database http://docs.codehaus.org/display/DROOLS/Loading+and+managing+rules+dynamically+from+a+database |
|
返回顶楼 | |
发表时间:2006-12-30
可以看看这个
http://www.iteye.com/topic/41690 |
|
返回顶楼 | |
发表时间:2006-12-30
jbossrules的操作符有这些:
用数据库来表达的话,matches很难实现,matches是匹配正则表达式,让最终用户写regex好像也很少吧。 excludes也比较麻烦。 所以用数据库来表达规则还是有很多限制的,不够强大,但是也足够有用处了,咋就没有opensrc的project的呢。 |
|
返回顶楼 | |
发表时间:2006-12-30
不是让用户写正则
应该让用户写 条件式子 程序中用正则进行转换 |
|
返回顶楼 | |
发表时间:2006-12-30
之前做了一个rule engine UI 让客户通过界面去编辑规则集
个人认为这个并不复杂 复杂的是规则集中决策表的覆盖 完整性的校验 |
|
返回顶楼 | |
发表时间:2006-12-31
fins 写道 可以看看这个
http://www.iteye.com/topic/41690 这个设计很不错。但是你的条件表达式还是一些基于sql的语句啊,如何能让用户也会书写呢?另外你规则组的排他性不知道怎么实现的,对这个我还没有体会到规则交叉带来的麻烦,rete算法可能就是为了解决这个问题的吧。 把不同的计分项目拆解开放在数据库保存发现有很大的问题,因为逻辑运算(与,并,非)无法进行,比如工资>2000 && 性别=女 计分为10分, 这种复杂的组合 很难用数据库来表达,只能写成表达式。 |
|
返回顶楼 | |
发表时间: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的动作 差别就是 在一个组内 是否满足了自己 就不去判断其他规则了 这个要和规则优先级一起使用 |
|
返回顶楼 | |
发表时间:2006-12-31
在springside1.0早的时候,就基于drools2.5实现了基于数据库存储的规则,当然现ss2.0用上drools3.0,要把规则放到数据库中也是可以的,不过web界面的编辑就需要自己做了。
|
|
返回顶楼 | |