精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-10-13
最后修改:2012-10-13
以前发贴总是被隐藏,这次有做了N遍的测试终于又可以发贴了。(动不动就投别人隐藏,太不人道了哈) 直奔主题: 大家都肯定接触过规则引擎吧,就是那专家系统的核心组件。drools可火了,但是用起来麻烦,还不如自己实现个轻量级的。 以后再慢慢开发,希望大家多多参与哈。 现在弄的版本是0.1,无聊啊,就做个有点用的东西。也算是第一个给JE发个技术贴哈。 规则引擎的机制很多,有线型的,网络型的 。 本文最后是树形的,好处是:把规则编译成一个树,不用每次都去做计算,一个规则一个树模型。 具体实现看附件啊。 !!!不要喷程序写的乱: 申明:由于我不是一线codeing,对于程序的写法不规范,没那个时间去规范的写JAVA类。 主要用法: public class TestRule { public static void main(String[] args) { HashMap<String, String> factVlues = new HashMap<String, String>(); //构建事实。 ///// ConditionDefine conditionDefine1 = new ConditionDefine(); 。。。。。 ConditionDefine conditionDefine2 = new ConditionDefine(); 。。。。。。"; //条件构建完成。 // ExpressionDefine // {eid:201,strExpress:(101&102)} ExpressionDefine myExpressionDefine = new ExpressionDefine(); myExpressionDefine.eId = "201"; myExpressionDefine.strExpress = "(101&102)"; //表达式构建完成。 FactObject fo = new FactObject(); fo.myExpressionDefine = myExpressionDefine; fo.conditionList.add(conditionDefine1); fo.conditionList.add(conditionDefine2); for (int i = 0; i < fo.conditionList.size(); i++) { ConditionDefine tmpConditionDefine = fo.conditionList.get(i); if (tmpConditionDefine.operate.equals(">")) { if (Integer.valueOf(factVlues.get(tmpConditionDefine.columName)) > Integer .valueOf(tmpConditionDefine.rightValue)) { fo.conditionFactList.put(tmpConditionDefine.cdtId, "true"); } else { fo.conditionFactList.put(tmpConditionDefine.cdtId, "false"); } } if (tmpConditionDefine.operate.equals("=")) { if( factVlues.get(tmpConditionDefine.columName).equals(tmpConditionDefine.rightValue)){ fo.conditionFactList.put(tmpConditionDefine.cdtId, "true"); }else{ fo.conditionFactList.put(tmpConditionDefine.cdtId, "false"); } } } ///组装完成,调用规则计算。 ///start call rule //////////////////////////////////////////////////////////////// ExpressStatic.hashMapingSrc= fo.conditionFactList; //ExpressStatic.calc(fo.myExpressionDefine.strExpress+"#"); boolean result= ExpressStatic.getResuleNode(ExpressStatic.calc(fo.myExpressionDefine.strExpress+"#")); System.out.println(result); } 没有使用任何第三方组件,全部是JAVA实现。你们用起来不爽找我。。。 服务到家。。。 欢迎讨论。和学习,不要再投隐藏了,谢谢这里的大牛啊 ,真是怕了你们了 哈。 觉得有意思就顶个哈。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-10-15
可否支持外部配置文件的,支持规则语言
|
|
返回顶楼 | |
发表时间:2012-10-15
stillwalk 写道 可否支持外部配置文件的,支持规则语言
规则语言编写太老套了, 再说也不便于业务人员, 你让一个银行的业务需求员去写规则语言是不现实的。 所以我们要用拖拉的方式,直接在页面进行可视化编辑。把规则进行自动保存。 不错吧。 |
|
返回顶楼 | |
发表时间:2012-10-15
菜菜土人 写道 stillwalk 写道 可否支持外部配置文件的,支持规则语言
规则语言编写太老套了, 再说也不便于业务人员, 你让一个银行的业务需求员去写规则语言是不现实的。 所以我们要用拖拉的方式,直接在页面进行可视化编辑。把规则进行自动保存。 不错吧。 呵呵不错, 2个问题: 1.ExpressStatic中getResuleNode方法左右子树全部判断得到结果以后再判断最后结果, 有没考虑到左子树比右子树短很多的情况, 2.接问题1,FactObject中要得到所有conditionFactList中的true/false值,对于101&(102|103...)的情况,只需要得到101为false即可结束判断 总结而言就是逻辑操作符判断时的短路情况 |
|
返回顶楼 | |
发表时间:2012-10-15
stillwalk 写道 菜菜土人 写道 stillwalk 写道 可否支持外部配置文件的,支持规则语言
规则语言编写太老套了, 再说也不便于业务人员, 你让一个银行的业务需求员去写规则语言是不现实的。 所以我们要用拖拉的方式,直接在页面进行可视化编辑。把规则进行自动保存。 不错吧。 呵呵不错, 2个问题: 1.ExpressStatic中getResuleNode方法左右子树全部判断得到结果以后再判断最后结果, 有没考虑到左子树比右子树短很多的情况, 2.接问题1,FactObject中要得到所有conditionFactList中的true/false值,对于101&(102|103...)的情况,只需要得到101为false即可结束判断 总结而言就是逻辑操作符判断时的短路情况 ===================================================== 知己啊, 看来你是真理解我的东西了,呵呵 。 你说的很对, 还有优化的余地,就像你说的 数的深度和长短,都有余地的。 这个我周末无聊 花了半天时间整的,有时间继续整,只是拿出来分享给JE的同胞,。 我主要是提供一个思路,一个方案。 BTW:只是我的代码写的凌乱,没有整理,各位高手见谅哈, 如果你优化了, 比如加了WEB界面,树的深度层次优化,也分享给我们哦 。。。。。。。 |
|
返回顶楼 | |
发表时间:2012-10-15
stillwalk 写道 菜菜土人 写道 stillwalk 写道 可否支持外部配置文件的,支持规则语言
规则语言编写太老套了, 再说也不便于业务人员, 你让一个银行的业务需求员去写规则语言是不现实的。 所以我们要用拖拉的方式,直接在页面进行可视化编辑。把规则进行自动保存。 不错吧。 呵呵不错, 2个问题: 1.ExpressStatic中getResuleNode方法左右子树全部判断得到结果以后再判断最后结果, 有没考虑到左子树比右子树短很多的情况, 2.接问题1,FactObject中要得到所有conditionFactList中的true/false值,对于101&(102|103...)的情况,只需要得到101为false即可结束判断 总结而言就是逻辑操作符判断时的短路情况 --------------------------------------------------- 逻辑是一部分, 你还没看明白条件部分的奥妙 哈哈 ,继续看哈 。。。 |
|
返回顶楼 | |
发表时间:2012-10-16
菜菜土人 写道 stillwalk 写道 菜菜土人 写道 stillwalk 写道 可否支持外部配置文件的,支持规则语言
规则语言编写太老套了, 再说也不便于业务人员, 你让一个银行的业务需求员去写规则语言是不现实的。 所以我们要用拖拉的方式,直接在页面进行可视化编辑。把规则进行自动保存。 不错吧。 呵呵不错, 2个问题: 1.ExpressStatic中getResuleNode方法左右子树全部判断得到结果以后再判断最后结果, 有没考虑到左子树比右子树短很多的情况, 2.接问题1,FactObject中要得到所有conditionFactList中的true/false值,对于101&(102|103...)的情况,只需要得到101为false即可结束判断 总结而言就是逻辑操作符判断时的短路情况 --------------------------------------------------- 逻辑是一部分, 你还没看明白条件部分的奥妙 哈哈 ,继续看哈 。。。 条件部分,貌似就看到两个条件:> = 多的条件判断,比如EQUALS,IN,NOT IN,LIKE都没有支持 |
|
返回顶楼 | |
发表时间:2012-10-16
stillwalk 写道 菜菜土人 写道 stillwalk 写道 菜菜土人 写道 stillwalk 写道 可否支持外部配置文件的,支持规则语言
规则语言编写太老套了, 再说也不便于业务人员, 你让一个银行的业务需求员去写规则语言是不现实的。 所以我们要用拖拉的方式,直接在页面进行可视化编辑。把规则进行自动保存。 不错吧。 呵呵不错, 2个问题: 1.ExpressStatic中getResuleNode方法左右子树全部判断得到结果以后再判断最后结果, 有没考虑到左子树比右子树短很多的情况, 2.接问题1,FactObject中要得到所有conditionFactList中的true/false值,对于101&(102|103...)的情况,只需要得到101为false即可结束判断 总结而言就是逻辑操作符判断时的短路情况 --------------------------------------------------- 逻辑是一部分, 你还没看明白条件部分的奥妙 哈哈 ,继续看哈 。。。 条件部分,貌似就看到两个条件:> = 多的条件判断,比如EQUALS,IN,NOT IN,LIKE都没有支持 -------------------------------------------------------- 因为我只是练练手哈, 所以只写了两个条件,你自己多加几个CASE switch, 增加几个条件 不就好了, 很简单的吧。 目前只是0.1, 我觉得该方案是可行的,所以完善下去 其实是一个很好的东西。 你可以想象下,把我的module换成数据库表的话 是不是很high,很方便。 而且还支持多个fact的 object 比如 person.name=guo $car.driver=four ... |
|
返回顶楼 | |
发表时间:2012-10-16
还是想看看web里面如何配置,思路的问题,希望有截图,业务人员很轻松的配置
|
|
返回顶楼 | |
发表时间:2012-10-16
coral0212 写道 还是想看看web里面如何配置,思路的问题,希望有截图,业务人员很轻松的配置
你把,ConditionDefine ExpressionDefine 这几个模型弄成数据库表,是不是很容易联想到WEB了? 对头 你完善下数据表管理,完善下表结构,很快就会形成一个WEB系统。。。囧 又回到SSH了 。。。 可惜我不会 SSH ,SSH你自己搞定哈 。 |
|
返回顶楼 | |