基于条件配置的简单规则引擎实现
规则引擎的原理与功能

规则引擎的原理与功能规则引擎是一种软件工具,可以根据预定义的规则对输入数据进行评估和转换。
它的核心原理是基于条件语句(也称为规则)和操作语句(也称为动作)的匹配和执行。
1.规则定义:规则引擎允许用户定义和管理规则。
规则可以基于业务规则、策略、法规等,以及业务需求定义和编写。
规则引擎通常提供一个易于使用的界面,供用户输入和管理规则。
2.规则匹配:当有输入数据需要进行处理时,规则引擎会按照预定义的规则进行匹配。
它会检查输入数据是否符合每个规则的条件语句,以确定应该执行哪个规则。
3.动作执行:当一些规则的条件得到满足时,规则引擎会执行该规则中定义的操作语句。
这些操作可以是数据转换、决策、通知、触发其他业务流程等。
4.规则优先级:规则引擎允许用户为每个规则设置优先级。
这样,在有多个规则匹配的情况下,规则引擎可以根据规则的优先级来确定应该先执行哪个规则。
5.动态更新和管理:规则引擎通常提供动态更新和管理的功能,允许用户在不停止系统的情况下修改和添加规则。
这种灵活性使得规则引擎适用于动态的业务环境,可以根据业务需求进行实时的调整和优化。
6.决策支持:规则引擎可以作为决策支持系统的一部分,根据预定义的规则和输入数据,自动进行决策分析和推理。
它可以帮助用户快速做出决策,提高决策的准确性和效率。
7.事件驱动:规则引擎可以与其他系统集成,监听特定的事件并根据事件触发相应的规则执行。
这种事件驱动的方式可以帮助系统实时处理和响应事件,并根据规则引擎的规则做出相应的处理。
8.监控和日志记录:规则引擎通常提供监控和日志记录的功能,可以记录规则引擎的执行情况和结果。
这些日志可以帮助用户分析和优化规则引擎的性能,并进行故障排查和调试。
1.规则定义和管理:规则引擎提供一个界面或语言,让用户可以输入和管理规则。
用户可以定义规则的条件和操作,以及规则之间的关系。
规则可以使用逻辑运算符、比较操作符、函数等来描述和处理输入数据。
2.输入数据和上下文:规则引擎接收输入数据,根据预定义的规则对数据进行评估和处理。
erule规则

erule规则在日常工作中,规则引擎(Rule Engine)已成为许多企业和组织进行自动化决策的关键技术。
其中,eRule规则作为一种基于事件的规则引擎,具有较强的实时性和灵活性。
本文将介绍eRule规则的基本概念、应用场景、创建方法以及实际案例分析,旨在帮助读者更好地理解和运用这一技术。
一、了解eRule规则的背景和基本概念eRule规则,全称Event-driven Rule Engine,是基于事件驱动的规则引擎。
它主要用于处理实时数据流,识别特定事件并执行相应的动作。
eRule规则起源于业务规则管理系统(BRMS)领域,它将业务规则与事件驱动架构相结合,实现了对实时数据的快速处理和智能决策。
二、eRule规则的应用场景和优势1.应用场景:(1)实时数据处理:eRule规则适用于对实时数据流进行处理,识别特定事件并进行相应的操作,如实时价格计算、交易监控等。
(2)业务决策支持:eRule规则可为企业提供实时决策支持,如风险评估、信用评级、促销策略等。
(3)自动化流程:通过eRule规则,可以实现企业内部流程的自动化,提高工作效率,如订单管理、库存控制等。
2.优势:(1)实时性:eRule规则能够快速响应事件,实现实时决策。
(2)灵活性:eRule规则支持条件判断、循环结构等复杂逻辑,满足不同场景的需求。
(3)易于维护:eRule规则采用规则引擎技术,方便进行调试和维护。
三、如何创建和运用eRule规则1.创建eRule规则:首先,需要明确规则的目标事件和触发条件。
然后,根据业务需求设计规则逻辑,包括条件判断、动作执行等。
最后,将规则部署到规则引擎中,进行实时监控和处理。
2.运用eRule规则:在实际应用中,eRule规则通常与事件驱动架构(EDA)相结合。
事件驱动架构负责收集和传递实时数据,eRule规则则负责根据数据触发事件并进行相应的决策。
通过这种方式,企业可以实现对实时数据的快速响应和智能决策。
urule规则引擎使用

urule规则引擎使用URule(Unified Rule)规则引擎是一款基于规则的开源引擎,它允许用户通过制定规则来实现业务逻辑,提供了灵活、可扩展的规则编写和执行环境。
本文将介绍URule规则引擎的基本概念、使用方法、核心功能以及一些最佳实践。
规则引擎基本概念1. 规则规则是URule引擎的核心概念,是一组条件和操作的组合,用于描述业务逻辑。
规则可以根据事实(Fact)的状态触发,执行相应的动作。
2. 事实事实是规则引擎中的数据对象,它包含了业务数据和状态信息。
规则通过匹配事实的状态来触发相应的规则动作。
3. 决策表决策表是一种以表格形式呈现的规则定义方式,简化了规则的编写和维护。
决策表通常包含条件、动作和规则的优先级等信息。
使用方法1. 引入URule依赖在项目中引入URule的相关依赖,可以通过Maven、Gradle等构建工具进行配置。
确保使用的版本是稳定和兼容的。
2. 创建规则项目使用URule提供的设计器创建规则项目,定义事实、规则、动作等元素。
设计器支持图形化的界面,使规则的创建变得直观和简便。
3. 集成到应用程序将规则项目集成到应用程序中,通过URule引擎的API调用,加载规则并执行。
应用程序需要负责将业务数据转换为事实对象,以便规则引擎进行匹配。
4. 规则调试URule提供了规则调试的功能,可以在开发阶段验证规则的正确性。
通过调试工具,可以逐步执行规则并查看中间结果,帮助排查规则逻辑的问题。
核心功能1. 规则的热加载URule支持规则的动态加载和热更新,无需重启应用程序即可应用新的规则。
这使得系统能够更灵活地应对业务变化。
2. 规则版本管理规则引擎提供了规则版本管理的功能,方便对规则进行历史追溯和回滚。
这对于规则的演进和维护非常有帮助。
3. 多种规则定义方式URule支持多种规则定义方式,包括脚本方式、决策表方式等。
用户可以根据实际需求选择合适的方式进行规则定义。
4. 规则执行监控规则引擎提供了执行监控的功能,可以记录规则的执行情况、性能指标等信息,方便进行性能分析和优化。
.NETRulesEngine(规则引擎)的使用详解

.NETRulesEngine(规则引擎)的使⽤详解⽬录RulesEngine 概述如何使⽤表达树内使⽤扩展⽅法多对象组合条件如何实现的?成功失败事件总结⼀次偶然的机会,让我拿出RulesEngine去完成⼀个业务,对于业务来说主要是完成⼀个可伸缩性(不确定的类型,以及不确定的条件,条件的变动可能是持续增加修改的)的业务判断。
⽐如说完成⼀个成就系统,管理员可创建,对于成就来说有⼀次性解锁、⽇常、周常式,还有随时重置,每次达成都触发的,⾯对着成就任务的增加,那对于程序员来说,如果每次都去增加修改这些成就任务简直是太头疼了。
好了,对此⼤家应该有⼀个简单的了解了,那跟着笔者往下⾛,我们看看如何在.NET中使⽤⾮常少的代码去完成⼀个简单的动态逻辑处理。
RulesEngine 概述RulesEngine是Microsoft推出的⼀个规则引擎项⽬,⽤于系统中抽象出的业务逻辑/规则/策略。
在我们开发的过程中,避免不了的是跟这种反反复复的业务逻辑进⾏处理,⽽对于这种动态的规则来说的话,它是⽐较优雅的⼀种⽅式,使⽤我们减少了对我们代码或者说项⽬的修改。
如何使⽤⽬前我们可以通过nuget的形式进⾏引⼊该库,如下所⽰:dotnet add package RulesEngine对于规则的配置来说,⼤家可以直接通过类型化参数,笔者主要是为了⼤家可以清晰的明⽩,所以⽤JSON化配置来做演⽰。
//反序列化Json格式规则字符串var workflowRules = JsonConvert.DeserializeObject<List<WorkflowRules>>(rulesStr);var rulesEngine = new RulesEngine.RulesEngine(workflowRules.ToArray());//定义规则var rulesStr = @"[{""WorkflowName"": ""UserInputWorkflow"",""Rules"": [{""RuleName"": ""CheckAge"",""ErrorMessage"": ""年龄必须⼤于18岁."",""ErrorType"": ""Error"",""RuleExpressionType"": ""LambdaExpression"",""Expression"": ""Age > 18""},{""RuleName"": ""CheckIDNoIsEmpty"",""ErrorMessage"": ""⾝份证号不可以为空."",""ErrorType"": ""Error"",""RuleExpressionType"": ""LambdaExpression"",""Expression"": ""IdNo != null""}]}] ";如上所⽰我们定义了规则信息,对于该信息,对于规则信息笔者默认存储的还是JSON数据,当然⼤家可以进⾏存储如下内容,将如下数据结构拆分存储到数据库中。
规则引擎-drools使用讲解(简单版)-Java

规则引擎-drools使⽤讲解(简单版)-Javadrools规则引擎现状:1. 运维同学(各种同学)通过后台管理界⾯直接配置相关规则,这⾥是通过输⼊框、下拉框等完成输⼊的,⾮常简单;2. 规则配置完毕后,前端请求后端,此时服务端根据参数(即规则)⽣成drl规则⽂件;3. ⽤户侧有相关请求到达时,服务端加载规则⽂件(可能是多个,⼀般⼀个⼴告、活动对应⼀个规则⽂件),并通过引擎去检查当前⽤户各种状态是否满⾜规则⽂件;4. 将所有满⾜的规则⽂件对应的⼴告、活动进⾏下发,同时更新⽤户数据;5. 完成整个drools相关流程;关于drools是⼀款标准、效率⾼、速度快的开源规则引擎,基于ReteOO算法,⽬前主要应⽤场景在⼴告、活动下发等领域⾮常多,⽐如APP的活动下发,通常都是有很多条件限制的,且各种活动层出不穷,⽆法代码穷举,⽽如果每次为了⼀个活动重新发版上线,显然是不合理的,因此通过drools将活动中变的部分抽象为⼀个个单独的规则⽂件,来屏蔽这部分的变化,使得系统不需要从代码层⾯做出改变,当然了为了更加极致的抽象,通常还需要对规则中的⼀些可配条件(⼤于、⼩于、等于、范围、次数等)也提取到数据库中,这样在现有规则不满⾜要求时,可以直接通过更改数据库的对应规则表来完善,同样不需要改代码;我们当时的需求主要就是⼴告、活动下发规则⽐较多,⼴告也是各式各样,因此去调研了drools,对drools也没有过多的挖掘其更多特性,因此还需要⼤家的指点;drools简单使⽤服务端项⽬中使⽤drools的⼏个基本步骤;step 1 -- 添加相关依赖到maven pom.xml<dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>6.4.0.Final</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId><version>6.4.0.Final</version></dependency>step 2 -- 创建实体类加载规则⽂件public class CarIllegalRules extends BaseRules{public static void main(String[] args) {try {KieServices ks = KieServices.Factory.get();KieContainer kContainer = ks.getKieClasspathContainer();KieSession ksession = kContainer.newKieSession("ksession-rules");CarIllegalRules carIllegalRules = new CarIllegalRules(10,500,10);ksession.insert(carIllegalRules);ksession.fireAllRules();System.out.println(carIllegalRules.isCan_push()+","+carIllegalRules.getContent());} catch (Exception e) {e.printStackTrace();}}private int illegal_count;private int illegal_money;private int illegal_points;public CarIllegalRules(int illegal_count, int illegal_money, int illegal_points) {super();this.illegal_count = illegal_count;this.illegal_money = illegal_money;this.illegal_points = illegal_points;this.param_value = "illegal_count,illegal_money,illegal_points";}@Overridepublic String toString() {return "CarIllegalRules [illegal_count=" + illegal_count + ", illegal_money=" + illegal_money+ ", illegal_points=" + illegal_points + ", can_push=" + can_push + ", content=" + content + ", tts="+ tts + "]";}public int getIllegal_count() {return illegal_count;}public void setIllegal_count(int illegal_count) {this.illegal_count = illegal_count;}public int getIllegal_money() {return illegal_money;}public void setIllegal_money(int illegal_money) {this.illegal_money = illegal_money;}public int getIllegal_points() {return illegal_points;}public void setIllegal_points(int illegal_points) {this.illegal_points = illegal_points;}}PS:main函数是⽤来测试这个类的;step 3 -- 创建DSLUtils类去执⾏相应规则public class DSLUtil {public static void fireRules(File file, Object rules) {try {KieServices kieServices = KieServices.Factory.get();KieFileSystem kfs = kieServices.newKieFileSystem();Resource resource = kieServices.getResources().newFileSystemResource(file);fire(rules, kieServices, kfs, resource);} catch (Exception e) {e.printStackTrace();}}public static void fireRules(String urlStr, Object rules) {try {KieServices kieServices = KieServices.Factory.get();KieFileSystem kfs = kieServices.newKieFileSystem();Resource resource = kieServices.getResources().newFileSystemResource(FileUtil.getFileFromUrl(urlStr));fire(rules, kieServices, kfs, resource);} catch (Exception e) {e.printStackTrace();}}private static void fire(Object commonRules, KieServices kieServices, KieFileSystem kfs, Resource resource)throws Exception {resource.setResourceType(ResourceType.DRL);kfs.write(resource);KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll();if (kieBuilder.getResults().getMessages(Message.Level.ERROR).size() > 0) {throw new Exception();}KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());KieBase kBase = kieContainer.getKieBase();KieSession ksession = kBase.newKieSession();ksession.insert(commonRules);ksession.fireAllRules();}}step 4 -- 创建⼀个类去⽣成规则⽂件⽐如⽣成 music.drl 的⾳乐规则⽂件,这⼀步是可选的,区别在于规则⽂件的⽣成是代码⽣成,还是⼈⼯⽣成,我们的项⽬中是运维同学在后台管理界⾯通过⼀些图形化输⼊框输⼊⼀些指定参数,⽽⽣成规则⽂件是服务端代码⽣成的,因此有了这部分,⽐较实⽤,⼀⽅⾯可以降低⽣成规则⽂件的门槛,任何⼈都可以做,另⼀⽅⾯也避免了⼈⼯出错的可能;public class ActivityUtil {/*** rule template string*/private static String template ="package com.aispeech.dsl\r\n\r\n" +"import {entity_package_path};\r\n\r\n" +"import {entity_package_path}.*;\r\n\r\n" +"rule \"{rule_name}\"\r\n\r\n" +"when\r\n" +"\t{instance_name}:{class_name}({rules})\r\n" +"then\r\n" +"\t{do}\r\n" +"end";private static final String AND = " && ";private static final String OR = " || ";/*** get business rule file xxx.drl* @param carActivity user info entity* @param clazz entity class* @return*/public static File createBusinessRuleFile(Car_activity carActivity, Class clazz, String[] param_texts, String[] param_values) { String ruleStr = template;String entity_package_path = (clazz+"").substring(6);String rule_name = "rule_"+carActivity.getId();String class_name = (clazz+"").substring((clazz+"").lastIndexOf(".")+1);String instance_name = class_name.toLowerCase();String rules = "";JSONArray conditionArray = JSONArray.parseArray(carActivity.getAim_condition());for(int i=0;i<conditionArray.size();i++) {JSONObject condition = conditionArray.getJSONObject(i);rules += "\r\n\t\t("+condition.getString("param")+condition.getString("operator")+condition.getString("value")+")" + AND;}rules = rules.length()>0?rules.substring(0, stIndexOf(AND)):rules;for (String param_value : param_values) {rules += "\r\n\t\t,"+param_value.toLowerCase()+":"+param_value;}String content = JSONObject.parseObject(carActivity.getContent()).getString("content");String tts = carActivity.getTts();for (int i=0;i<param_texts.length;i++) {content = content.replace("#"+param_texts[i]+"#", "\"+"+param_values[i]+"+\"");tts = tts.replace("#"+param_texts[i]+"#", "\"+"+param_values[i]+"+\"");}String _do = instance_name+".setCan_push(true);";_do += "\r\n\t" + instance_name+".setContent(\""+content+"\");";_do += "\r\n\t" + instance_name+".setTts(\""+tts+"\");";return returnFile(ruleStr, entity_package_path, rule_name, class_name, instance_name, _do, rules);}/*** @param ruleStr* @param entity_package_path* @param rule_name* @param class_name* @param instance_name* @param _do* @param rules* @return*/private static File returnFile(String ruleStr, String entity_package_path, String rule_name, String class_name,String instance_name, String _do, String rules) {ruleStr = ruleStr.replace("{entity_package_path}", entity_package_path).replace("{rule_name}", rule_name).replace("{class_name}", class_name).replace("{instance_name}", instance_name).replace("{do}", _do).replace("{rules}", rules);System.out.println(ruleStr);return FileUtil.getFileFromText(rule_name, ".drl", ruleStr);}}step 4.1 -- 通过字符串创建⽂件,给上⼀步⽤的函数public static File getFileFromText(String tempFileName, String fileTail, String text) {try {File file = File.createTempFile(tempFileName, fileTail);FileOutputStream fos = new FileOutputStream(file);fos.write(text.getBytes());if(fos!=null){fos.close();}return file;} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return null;}step 5 -- 规则⽂件加载,并⽤以检查当前⽤户是否满⾜下发规则条件BaseRules baseRules = new CarIllegalRules(count, money, points);if(baseRules!=null) {("before fire rules:"+baseRules);DSLUtil.fireRules(ActivityUtil.createBusinessRuleFile(car_activity, baseRules.getClass(),baseRules.getParam_text().split(","), baseRules.getParam_value().split(",")), baseRules);("after fire rules:"+baseRules);if(baseRules.isCan_push()) {//In here, the rules are used to judge the success of the entity, and you can do something}}⼩结本⽂通过对drools的简单使⽤步骤的讲解,为⼤家展⽰了drools最简单的使⽤⽅式,⽽它能做到的远远不⽌看到的这些,但是基本框架是这样,⼤家可以尝试挖掘规则⽂件的⼀些⿊操作,可以对多变的业务进⾏极致的抽象,再也不⽤为了这些重新发版啦,LOL;PS:想深⼊了解的同学还是要去看看Rete算法、drools的推理机制等等,本⽂主要从该引擎的⼊门出发哈;最后⼤家可以到我的Github上看看有没有其他需要的东西,⽬前主要是⾃⼰做的机器学习项⽬、Python各种脚本⼯具、数据分析挖掘项⽬以及Follow的⼤佬、Fork的项⽬等:。
rule engine 用法

规则引擎(Rule Engine)是一种软件组件,用于处理和管理业务规则。
它允许将业务逻辑与应用程序代码分离,使业务规则的定义、修改和测试更加灵活和高效。
规则引擎通常使用预定义的规则集,根据输入数据和条件执行相应的操作。
以下是规则引擎的一般用法:
定义规则:首先需要定义一系列规则,这些规则包括条件和操作。
条件是规则引擎用来判断是否适用某个规则的标准,而操作是规则引擎在规则适用时执行的动作。
创建规则引擎实例:在使用规则引擎之前,需要创建一个规则引擎实例。
可以根据引擎的类型和配置来选择合适的实例。
添加规则:将定义好的规则添加到规则引擎中,以便引擎能够使用它们来判断和执行操作。
提供输入数据:根据规则定义的条件,提供一些输入数据给规则引擎。
这些数据将被用于判断哪些规则适用。
执行规则:规则引擎将根据提供的输入数据和定义的规则,执行相应的操作。
这可能包括修改数据、触发其他系统操作或生成通知等。
监控和调试:监控规则引擎的执行情况,并进行必要的调试。
这有助于确保规则引擎按预期工作,并帮助识别和解决潜在问题。
更新和优化:根据需要,可以更新和优化已定义的规则,以适应业务逻辑的变化或提高性能。
总的来说,规则引擎是一种强大的工具,可用于实现复杂的业务逻辑和自动化决策过程。
它可以根据特定的业务需求进行定制和扩展,以满足不同场景下的要求。
dataexa-re规则引擎用户使用手册

很高兴接到您这个任务,我会按照您的要求,为您撰写一篇深度和广度兼具的文章。
主题:dataexa-re规则引擎用户使用手册1. 了解dataexa-re规则引擎dataexa-re规则引擎是一款功能强大的工具,它能够帮助用户快速、灵活地创建和管理规则,实现数据处理、逻辑判断和业务规则执行。
这款规则引擎采用了先进的算法和技术,具有高效、可扩展、易用等特点,广泛应用于数据分析、业务规则引擎、智能决策系统等领域。
2. 基本操作和功能在使用dataexa-re规则引擎时,首先需要了解其基本操作和功能。
用户可以通过简单的拖拽、配置和连接等方式,轻松地创建规则,并设置规则的执行条件和动作。
规则引擎还支持多种数据类型和数据格式,可以对数据进行多维度的处理和分析,满足不同场景下的需求。
3. 高级功能和定制化除了基本操作和功能外,dataexa-re规则引擎还提供了许多高级功能和定制化选项。
用户可以根据具体的业务需求,定义自定义函数、变量等内容,以实现更复杂的规则处理和逻辑判断。
规则引擎还支持批量操作和并行执行,提高了处理效率和性能。
4. 最佳实践和案例分析在使用dataexa-re规则引擎时,为了更好地发挥其作用,可以参考一些最佳实践和案例分析。
通过这些实例,用户可以了解规则引擎在实际项目中的应用,以及如何应对各种复杂情况和问题。
这有助于用户更好地理解规则引擎的设计思想和使用技巧。
5. 个人观点和总结作为我个人对于dataexa-re规则引擎的观点,我认为这是一款非常优秀的工具,它为用户提供了丰富的功能和灵活的操作方式,能够帮助用户快速解决数据处理和业务规则的问题。
规则引擎的性能和扩展性也是其优势之一,可以满足不同规模和复杂度的应用场景。
我对这款规则引擎持有积极的态度,相信它能够为用户带来更多的价值和便利。
以上就是我对于dataexa-re规则引擎的一些观点和理解,希望这篇文章能够帮助您更好地了解和应用这款工具。
drools规则动态化实践

drools规则动态化实践一、前言Drools是一个基于规则引擎的开源项目,它提供了一种声明式的方式来表达业务规则,并通过推理引擎来执行这些规则。
Drools的规则动态化实践是指在运行时动态地修改或添加规则,从而实现业务逻辑的灵活性和可配置性。
二、Drools规则引擎简介1. 规则引擎基本概念规则引擎是指一个软件系统,能够根据预定义的条件和操作,自动执行相关的业务逻辑。
它通常由三个部分组成:规则库、推理引擎和应用程序接口。
2. Drools规则引擎特点Drools是一款基于Java语言开发的开源规则引擎。
它具有以下特点:(1)声明式表达:使用DSL(Domain Specific Language)语言来表达业务逻辑。
(2)可扩展性:支持插件机制,可以扩展自己所需的功能。
(3)可定制性:支持自定义推理策略和决策表。
(4)高效性:采用Rete算法进行推理处理,具有高效性能。
三、Drools规则动态化实践1. 动态加载规则文件在Drools中,可以使用KieFileSystem类来动态加载规则文件。
KieFileSystem类可以在运行时动态地加载、修改和删除规则文件。
下面是一个示例代码:KieServices ks = KieServices.Factory.get();KieFileSystem kfs = ks.newKieFileSystem();Resource resource =ks.getResources().newClassPathResource("rules.drl");kfs.write(resource);KieBuilder kbuilder = ks.newKieBuilder(kfs).buildAll(); KieContainer kcontainer =ks.newKieContainer(kbuilder.getKieModule().getReleaseId()); KieSession ksession = kcontainer.newKieSession();2. 动态修改规则在Drools中,可以使用KnowledgeBase类来动态修改规则。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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); } }
总结
由于作者水平和认知有限,如有不对的地方请批评和指正。
希望本文 档可以帮助到您,或者给您一些启发。
。