基于条件配置的简单规则引擎实现

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于条件配置的简单规则引擎实现

第一章 需求概述
规则引擎的应用可以说非常的广泛,规则引擎可以分为基于条件配置 的简单规则引擎和基于数据分析统计的复杂的规则引擎,本文档主要讨论 的是基于条件配置的简单规则引擎实现。
1.1 业务场景示例
需要实现根据医生诊断的症状来展示可以使用的药品,比如一个女患 者被医生诊断为:气血两虚,身体瘦弱,腰膝酸软,月经不调,那么系统 会根据这些症状展示合适的调理药品乌鸡白凤丸。
1.2 业务分析抽象
现在我们来分析一下药品推荐系统的场景。患者首先是个女的,那么 有一个条件是性别为女;气血的诊断情况为两虚;身体状况为瘦弱;腰膝 情况是酸软,月经的状态是不协调。如果满足了这些条件的话,那么系统 要为医生展示推荐药品乌鸡白凤丸。 通过上述分析,我们可以比较容易得出一个抽象场景:即症状符合了 规则,就展示推介的结果,其中规则是由一系列的条件所组成的,当所有 的条件都满足了,那么就符合了规则。 分析完之后,是不是觉得豁然开朗了。下面我们来看一下具体要怎么 去设计。

第二章 系统设计实现
本章主要结合上一章节业务分析抽象的内容讨论简单的数据库结构 设计和系统编码实现。
2.1 数据库设计 2.1.1 症状规则表
症状规则表 数据项 规则ID 规则名称 规则表达式 表达式描述 类型 文本 文本 文本 文本 备注 主键 名称 条件表达式 表达式描述
2.1.2 症状条件表
症状条件表 数据项 条件ID 条件名称 条件标识符 条件编码 条件计算方式 条件值 规则ID 类型 文本 文本 文本 文本 文本 文本 文本 备注 主键 名称 条件的唯一标识符 条件的key编码(如:性别=sex) 计算方式(如:等于,大于,小于,包含…) 条件的值(如:女=femal 或者 女=0) 规则ID值

2.1.3 展示结果表
展示结果表 数据项 结果ID 结果名称 规则ID 类型 文本 文本 文本 备注 主键 结果的描述 规则ID值
2.1.4 数据存储示例
症状规则表 规则ID 1001 规则名称 乌鸡白凤丸规则 规则表达式 (A1 && A2 && A3 && A4 && A5) 表达式描述
性别等于femal 而且 气血等于weak 而且 身体状况等于thin 而且 腰膝情况等于limp 而且 月经状态等于menoxenia
症状条件表 条件ID 1 2 3 4 5 条件名称 性别等于 气血等于 身体状况等于 腰膝情况等于 月经状态等于 条件标识符 A1 A2 A3 A4 A5 条件编码 sex blood body waist menses 计算方式 = = = = = 条件值 femal weak thin limp menoxenia 规则ID 1001 1001 1001 1001 1001
展示结果表 结果ID 1 结果名称 乌鸡白凤丸:主治女性气血两虚,身体瘦弱,腰膝酸软,月经不调。 规则ID 1001

2.2 编码实现
从数据库结构和数据存储的分析,我们从计算机实现的角度来看就是 只要满足症状规则表中规则表达式的值为真,那么就展示规则对应的结 果。即计算(A1 && A2 && A3 && A4 && A5)表达式的真假。
2.2.1 调用说明
外 围 系 统 调 用 规 则 引 擎 传 入 参 数 为 : sex=male&blood=weak&body=thin&waist=limp&menses=menoxenia , 那么我们拿到这些参数和值后,传入规则引擎,根据传入参数编码和值对 比数据库中存储的编码和值。可以得出:  A1=false  A2=true  A3=true  A4=true  A5=true 表达式(A1 && A2 && A3 && A4 && A5)计算结果为false,不展示结 果;如果传入参数中sex=female,那么A1=true,表达计算结果为 true, 则展示相应的结果。
2.2.2 表达式计算示例
import javax.script.ScriptEngine; import javax.script.ScriptEngineManager;

public class TestExpress { public static void main(String[] args) throws Exception { String expr = "(A1 && A2 && A3 && A4 && A5)"; ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); engine.put("A1", true); engine.put("A2", true); engine.put("A3", true); engine.put("A4", true); engine.put("A5", true); Object result = engine.eval(expr); System.out.println(result); } }
总结
由于作者水平和认知有限,如有不对的地方请批评和指正。希望本文 档可以帮助到您,或者给您一些启发。





相关文档
最新文档