Drools 规则引擎原理

目录

  • Drools规则引擎
    • 基本定义
    • 介绍
    • 优劣
      • 优点
      • 缺点
    • 基本概念
      • 规则引擎构成
    • 规则结构
    • 规则引擎执行过程
    • 规则存储
    • Kie 介绍
      • Kie 相关组件
      • 知识库
      • 规则引擎与知识库
      • Drools 存储规则的数据结构
  • Rete 算法
    • 原理
    • 优缺点
      • 优点
      • 缺点
    • 举例
  • 前向和后向链推理机制
    • 前向链
    • 后向链
    • 对比
  • 应用场景
    • 概念和特点
    • 架构和组件
    • 使用方法和示例
  • 相关文献资料

基于Java的开源的规则引擎框架有很多,从实现原理上来说分为以下三类:

  1. 通过Java语言+RETE算法实现(drools和urule)
  2. 通过脚本语言+jvm实现(groovy)
  3. 通过Java表达式+jvm实现(Aviator)

Drools规则引擎

基本定义

从“频繁且通用”的业务变化中抽象出来的中间服务层,实现了将决策逻辑从应用代码中分离出来,并使用预定义的高级语法或者可视化的工具编写业务规则并自动优化执行。

规则引擎具体执行可以分为接受数据输入,高效解释业务规则,根据业务规则输出决策结果几个过程。如下图所示:
Drools 规则引擎原理_第1张图片

介绍

Drools规则引擎是一种基于规则的方法,用于在Drools软件中实现专家系统。规则引擎提供了专家系统,这是一种基于知识的系统,可以帮助你做出决策,比如做什么和怎么做。它将知识收集到一个知识库中,可以用于推理。

Drools规则引擎基于以下抽象组件实现:

  • 规则(Rules):业务规则或DMN决策。所有规则必须至少包含触发该规则的条件以及对应的操作。
  • 事实(Facts):输入到规则引擎的数据,用于规则的条件的匹配。
  • 生产内存(Production memory):规则引擎中规则存储的地方
  • 工作内存(Working memory):规则引擎中Fact对象存储的地方。
  • 议程(Agenda):用于存储被激活的规则的分类和排序的地方。

Drools规则引擎的核心组件有:
• KieFileSystem:一个内存文件系统,用于存储规则文件和其他资源。
• KieContainer:一个包含多个KieBases的容器,每个KieBase代表一个知识库。
• KieSession:一个用于插入事实和触发规则的会话。
• Rule:一个表示单个规则的对象,它包含匹配事实的条件和执行动作的结果。
• Fact:一个表示输入数据的对象,它可以被规则引擎修改、插入或删除。

优劣

优点

  1. 声明式编程:规则引擎允许你说“做什么”,而不是“怎么做”。这样可以使得表达复杂问题的解决方案更容易,并且可以验证解决方案的正确性。规则比代码更容易阅读。
  2. 业务逻辑的集中管理:规则引擎可以将业务逻辑从程序代码中分离出来,使得业务逻辑的维护和变更更快更便宜。同时,也可以缩小业务人员和技术人员之间的沟通鸿沟,因为规则可以用一种容易理解的格式编写。
  3. 规则的复用和组合:规则引擎可以将规则分为不同的模块,根据不同的场景和需求进行复用和组合。这样可以提高规则的可扩展性和灵活性。

缺点

  1. 学习成本:开发人员需要学习一种新的编程方式,掌握规则引擎的基本概念和语法。同时,也需要了解规则引擎的内部工作原理,以便优化规则的性能和效率。
  2. 调试困难:规则引擎的运行过程可能涉及到大量的规则匹配和推理,当出现错误或异常时,很难定位问题的原因和位置。此外,规则之间也可能存在冲突或循环,需要注意避免或解决。
  3. 不适合简单或稳定的业务逻辑:如果一个应用中只有很少或没有变化的业务逻辑,使用规则引擎可能是一种过度设计,会增加不必要的复杂度和开销。在这种情况下,直接使用程序代码可能更合适。

基本概念

规则引擎(RE)是一种模块,可以自动化管理一些高度可变的过程。基本的概念是将参与过程的对象与实现这些过程的逻辑分离。逻辑是通过编写规则来定义的。

Drools规则引擎使用开源的Drools规则引擎,它使用了一种改进的Rete算法,并具有前向和后向链推理机制。

Fact:事实,是指在drools规则应用当中,将一个普通的Java Bean插入到Working Memory后的对象就是Fact对象。

规则引擎构成

由以下三部分组成:

  1. Working Memory(工作内存):规则引擎会从Working Memory中获取数据并和规则文件中定义的规则进行模式匹配,应用程序需要将数据插入到Working Memory中。
  2. Rule Base(规则库):在规则文件中定义的规则都会被加载到规则库中。
  3. Inference Engine(推理引擎)

其中Inference Engine(推理引擎)又包括:

  • Patter Matcher(匹配器):将Rule Base中所有规则与Working Memory中的Fact对象进行模式匹配,匹配成功的规则将被激活放入Agenda。
  • Agenda(议程):用于存放通过匹配器进行模式匹配后被激活的规则。
  • Execution Engine(执行引擎)
    Drools 规则引擎原理_第2张图片

规则结构

Drools规则引擎有自己的语法来编写规则,这种语法是声明式、简洁和明确的。一个规则有以下结构:

  • when 条件
    条件是根据一定的语法规则来编辑的。根据这种语法,设置一个条件意味着验证一个事实。应用规则的上下文由一组事实组成,这些事实描述了RE操作的当前情况,并被断言在一个工作内存中。为了判断是否应用一个规则,RE验证一个事实是否在工作内存中被有效地断言。如果是,那么规则就被应用。
  • then 动作
    动作区域是用普通的Java代码来编辑的,包含了如果条件被验证要执行的动作。要应用的规则被包含在一个生产内存中。RE比较生产内存中假设的动作和工作内存中断言的事实。如果有兼容性,RE执行一个或多个规则。

简单来说,Drools规则就是根据when后的条件来匹配工作内存中的事实,如果匹配成功,就执行then后的动作。

规则引擎执行过程

  1. 将初始数据(fact)输入至工作内存(Working Memory);
  2. 使用Pattern Matcher将规则库中的规则(rule)和数据(fact)比较;
  3. 如果执行规则存在冲突(confict),即同时激活了多个规则,将冲突的规则放入冲突集合;
  4. 解决冲突,将激活的规则按顺序放入Agenda;
  5. 执行Agenda中的规则。重复步骤2至5,指导执行完毕Agenda中的所有规则。

规则存储

Drools规则引擎使用一个知识库(Knowledge Base)来存储规则,知识库是Drools生态系统中的知识的代表,它包含了规则所在的资源的信息,也可以创建知识会话。

知识库可以分为不同的模块(Module),每个模块可以包含多个知识库,每个知识库可以包含不同的会话。

规则可以以.drl文件或Excel表格的形式编写,也可以通过Java配置或注解来定义。

规则可以通过KieFileSystem来写入一个内存文件系统,也可以通过ResourceFactory来从类路径或其他位置读取。

规则可以通过KieContainer来管理和加载,KieContainer是一个包含多个KieBases的容器,每个KieBase代表一个知识库。

Kie 介绍

Drools 规则引擎原理_第3张图片

Kie 相关组件

Drools 规则引擎原理_第4张图片
Drools是Kie中的一个组件。

知识库

知识库(Knowledge Base)是一种存储和组织知识的方式,它可以包含不同类型和格式的数据,例如文本、图像、视频、音频等。知识库的结构通常取决于知识的领域、用途和特点,但一般来说,它由以下几种基本数据结构组成或者与之相关:

  • 实体(Entity):知识库中的基本单元,代表一个具体或抽象的事物,例如人、地点、事件、概念等。实体通常有一个唯一的标识符和一些属性(Attribute),用来描述实体的特征,例如姓名、年龄、颜色等。
  • 关系(Relation):知识库中描述实体之间的联系的方式,例如父子、属于、发生在等。关系通常有一个类型和一些约束条件,用来规定关系的适用范围和方向,例如亲属关系只能在人类实体之间存在,且是双向的。
  • 三元组(Triple):知识库中表示一个事实的最小单位,由一个主体实体(Subject)、一个关系(Predicate)和一个宾语实体(Object)组成,例如(北京,首都,中国)、(爱因斯坦,出生于,德国)。三元组可以看作是知识库中的语句或断言,用来表达知识的内容。
  • 本体(Ontology):知识库中定义实体和关系的类别和层次结构的方式,例如人类是动物的子类,父子是亲属关系的一种。本体可以看作是知识库中的语法或规则,用来约束和指导知识的表示和推理。
  • 图(Graph):知识库中将实体和关系视为节点和边的网络结构,例如实体-关系图(ER图)、语义网(Semantic Web)。图可以看作是知识库中的数据模型或视图,用来存储和展示知识的结构和关联。

规则引擎与知识库

对于一个规则引擎来说,它可以看作是一种特殊的知识库,它的结构主要由以下几个部分组成:

  • 规则(Rule):规则引擎中的基本单元,代表一个业务逻辑或决策,一般表示为IF-THEN的形式,例如IF(年龄>18)THEN(成年)。规则通常由条件(Condition)和动作(Action)组成,条件用来判断是否满足规则,动作用来执行规则的结果。
  • 事实(Fact):规则引擎中的输入数据,代表一个具体或抽象的事物,例如人、订单、事件等。事实通常有一些属性(Attribute),用来描述事实的特征,例如姓名、价格、状态等。
  • 模式匹配器(Pattern Matcher):规则引擎中的核心组件,负责将规则和事实进行比较,找出符合条件的规则,并将它们放入冲突集合(Conflict Set)中。
  • 冲突解决器(Conflict Resolver):规则引擎中的核心组件,负责从冲突集合中选择一个或多个要执行的规则,并将它们放入议程(Agenda)中。
  • 执行器(Executor):规则引擎中的核心组件,负责从议程中取出要执行的规则,并执行它们的动作,同时更新工作内存(Working Memory)中的事实。

知识库中的模块和会话的含义可能因不同的系统而有所不同,但一般来说,模块是指知识库中的一个子集,包含了某个特定领域或主题的相关知识。会话是指用户与知识库之间的一次或多次交互,用于查询、更新或探索知识。模块和会话的作用是帮助用户更有效地获取和利用知识,以及提高知识库的可扩展性和可维护性。

Drools 存储规则的数据结构

  • KieBase:一个知识库,它包含了一组编译后的规则、流程和类型声明,以及相关的配置和环境信息。KieBase是线程安全的,可以在多个KieSession中共享。KieSession是一个运行时的状态容器,它包含了工作内存、模式匹配器、冲突解决器和执行器等组件,用来执行规则和流程。KieSession是从KieBase中创建的,可以有多个KieSession与同一个KieBase关联。
  • KieModule:一个包含了多个KieBase和KieSession的配置信息的容器,可以是一个jar文件或者一个文件夹。KieModule可以从本地或者远程的Maven仓库中加载。
  • KieFileSystem:一个虚拟的文件系统,用来存储规则文件和其他资源文件,可以通过KieBuilder将其编译为KieModule。
  • KieContainer:一个管理KieModule的容器,可以从本地或者远程的Maven仓库中加载KieModule,并且可以动态地更新KieModule。
  • KieSession:一个运行时的状态容器,用来执行规则和流程,可以从KieBase中创建。KieSession有两种类型:Stateful和Stateless。Stateful KieSession会保留工作内存中的数据,需要手动释放资源;Stateless KieSession不会保留工作内存中的数据,每次执行完毕后会自动释放资源。

Rete 算法

Rete 是一种进行大量模式集合和大量对象集合间比较的高效方法,通过网络筛选的方法找出所有匹配各个模式的对象和规则。 其核心思想是用分离的匹配项构造匹配网络,同时缓存中间结果。以空间换时间。规则编译(rule compilation)和运行时执行(runtime execution)。

Rete算法是一种用于实现规则引擎的高效模式匹配算法,它可以快速地找出满足一组规则的数据集合(zhuanlan.zhihu.com)。

原理

  1. 将规则的条件部分(LHS)转换为一个网络结构,称为Rete网络,其中包含了不同类型的节点,如alpha节点、beta节点、join节点和terminal节点。
  2. 将数据(facts)输入到Rete网络的根节点,沿着网络流动,经过不同的节点进行过滤、合并和检测,最终到达terminal节点,表示匹配了某个规则的结果部分(RHS)。
  3. 在每个节点中,维护一个内存区域,用于存储通过该节点的数据或数据组合,以避免重复计算和提高效率。
  4. 在每次数据或规则发生变化时,更新Rete网络中的内存区域,并重新触发匹配过程。

Rete算法的用途是提高规则引擎的性能和可扩展性,使其能够处理大量的数据和规则,以及动态地适应数据和规则的变化。

Drools规则引擎提供了一系列的API和工具来创建、编译、加载和执行规则,以及管理Rete网络中的数据和状态。

优缺点

优点

  • Rete算法可以快速地找出满足一组规则的数据集合,避免了重复计算和遍历,提高了规则引擎的性能和可扩展性(jianshu.com)(blog.csdn.net)。
  • Rete算法的匹配速度与规则数目无关,只与数据的数量和复杂度有关(blog.csdn.net)。
  • Rete算法可以动态地适应数据和规则的变化,实现了数据驱动的推理过程(jianshu.com)(blog.csdn.net)。

缺点

  • Rete算法需要维护一个复杂的网络结构和大量的内存空间,消耗了系统的资源(jianshu.com)(blog.csdn.net)。
  • Rete算法对数据的删除和修改操作比较困难,需要执行额外的查找和更新(blog.csdn.net)。
  • Rete算法对于一些简单或者不经常变化的规则,可能没有必要使用,反而增加了系统的开销(jianshu.com)(blog.csdn.net)。

举例

假设我们有以下三条规则:

  1. 如果一个人的年龄大于18岁,那么他是成年人。
  2. 如果一个人的性别是男,那么他是男性。
  3. 如果一个人是成年人并且是男性,那么他可以参军。

我们可以用Rete算法来构建一个网络来匹配这些规则。网络的结构如下:https://i.imgur.com/0fZw7Qg.png

网络中有以下几种节点:

  1. Root node:网络的入口,接收所有的数据(facts)。
  2. Object type node:根据数据的类型进行过滤,只传递符合类型的数据到下一层节点。
  3. Alpha node:根据数据的属性进行过滤,只传递符合条件的数据到下一层节点。
  4. Beta node:根据两个输入数据的关系进行过滤,只传递符合条件的数据组合(token)到下一层节点。
  5. Terminal node:网络的出口,表示匹配了某条规则的结果。

每个节点都有一个内存区域,用于存储通过该节点的数据或数据组合。当数据或规则发生变化时,网络中的内存区域会相应地更新,并重新触发匹配过程。

假设我们有以下三个数据:

  • {name: “Tom”, age: 20, gender: “male”}
  • {name: “Alice”, age: 17, gender: “female”}
  • {name: “Bob”, age: 19, gender: “male”}

当这些数据输入到网络中时,会经历以下过程:

  • 数据从root node进入网络,然后根据类型被分发到对应的object type node。因为这里所有的数据都是Person类型,所以都会被传递到Person object type node。
  • 数据从Person object type node进入到alpha node,然后根据属性被分发到对应的alpha node。例如,Tom会被传递到age > 18和gender == "male"两个alpha node,Alice会被传递到age <= 18和gender == "female"两个alpha node,Bob会被传递到age > 18和gender == "male"两个alpha node。
  • 数据从alpha node进入到beta node,然后根据两个输入数据的关系被分发到对应的beta node。例如,Tom和Bob会被传递到age > 18 && gender == "male"这个beta node,Alice不会被传递到任何beta node。
  • 数据从beta node进入到terminal node,然后表示匹配了某条规则的结果。例如,Tom和Bob会被传递到rule 3这个terminal node,表示他们可以参军。Alice不会被传递到任何terminal node。

这就是一个简单的Rete算法的例子。你可以看到,Rete算法通过构建一个网络来高效地匹配大量的规则和数据,并且可以动态地适应变化。

前向和后向链推理机制

前向链和后向链是两种不同的推理机制,它们在Drools中发挥着不同的作用。

前向链

前向链是一种从已知事实和规则出发,推导出新的事实和结论的过程。它是一种数据驱动的方法,适用于需要处理大量数据并触发相应规则的场景。前向链是Drools的默认推理机制,它通过构建一个Rete网络来高效地匹配规则和数据。

后向链

后向链是一种从目标或假设出发,通过回溯一系列事实和规则来验证其真伪的过程(baeldung.cc)。它是一种目标驱动的方法,适用于需要根据特定目标来查询数据的场景(baeldung.cc)。后向链是Drools从5.2.0版本开始支持的推理机制,它通过定义查询来实现后向链。

对比

  • 适用场景:前向链适用于需要处理大量数据并触发相应规则的场景,例如欺诈检测、风险评估、推荐系统等。后向链适用于需要根据特定目标来查询数据的场景,例如诊断系统、智能问答、规划系统等。
  • 推理效率:前向链的推理效率取决于数据的数量和规则的复杂度,如果数据量很大或规则很多,可能会导致推理过程缓慢或占用大量内存。后向链的推理效率取决于目标的难度和规则的相关性,如果目标很难或规则很少,可能会导致推理过程失败或无法找到答案。
  • 推理方式:前向链是一种自下而上的推理方式,它从已知事实出发,不断地生成新的事实和结论,直到满足某个条件或达到某个限制。后向链是一种自上而下的推理方式,它从目标或假设出发,不断地寻找支持或反驳它的事实和规则,直到证明其真伪或无法继续。
  • 推理结果:前向链的推理结果是一组满足规则条件的事实和结论,它们可能有多个或没有。后向链的推理结果是一个确定的答案,它是对目标或假设的真假判断,它只有一个或不存在。
    总之,前向链和后向链在Drools中分别提供了不同的推理能力,可以根据不同的业务需求来选择合适的推理机制。

应用场景

Drools规则引擎的应用场景有:

  1. 业务决策:规则引擎可以用于处理复杂的业务逻辑,如信用评分、保险核保、贷款审批等,根据不同的事实和规则,产生自动化的决策(https://www.baeldung.com/drools)。
  2. 复杂事件处理:规则引擎可以用于处理实时的事件流,如股票交易、网络监控、传感器数据等,根据不同的事件和规则,触发相应的动作或警报(https://www.drools.org/)。
  3. 工作流程:规则引擎可以用于定义和执行业务流程,如订单处理、发票管理、人事审批等,根据不同的任务和规则,控制流程的走向和状态https://www.drools.org/。
  4. 讲解学习

概念和特点

Drools是一个基于Java的开源业务规则管理系统(BRMS),它提供了一个核心的业务规则引擎(BRE),可以用简单易懂的规则语言来描述业务逻辑,并将业务逻辑和数据对象分离,实现业务逻辑的灵活变更和复用。

架构和组件

Drools规则引擎由以下几个主要组件构成:规则文件(.drl)、知识库(KieBase)、会话(KieSession)、工作内存(Working Memory)、议程(Agenda)、推理机(Inference Engine)和规则流(Rule Flow)。

使用方法和示例

Drools规则引擎的使用方法主要包括以下几个步骤:

  1. 创建规则文件,定义规则的名称、属性、条件和动作;
  2. 创建知识库,加载规则文件并编译为字节码;
  3. 创建会话,从知识库中获取会话对象;
  4. 插入事实,将业务数据插入到工作内存中;
  5. 执行规则,触发推理机根据事实和规则进行匹配和执行;
  6. 处理结果,获取规则执行的结果并进行相应的处理。

相关文献资料

  • Putting BPMN and DMN to Work: a Pediatric Surgery Case Study(https://www.drools.org/community/research.html):这篇论文介绍了如何使用Drools Workbench来建模和执行儿科手术的业务流程和决策,展示了Drools的实际应用效果。
  • Modeling surgical pediatric processes with BPMN and DMN(https://link.springer.com/chapter/10.1007/978-3-030-43306-2_34):这篇论文是上一篇论文的毕业论文版本,更详细地描述了使用Drools Workbench的方法和步骤,以及遇到的挑战和解决方案。
  • Semi-automatic Composition of Geospatial Web Services Using JBoss Rules:这篇论文探讨了如何使用Drools来实现地理空间Web服务的半自动组合,提出了一种基于规则的服务匹配和选择算法,以及一种基于规则的服务组合框架。
  • Application Research of Business Rules Engine Management System Based on Drools:这篇论文介绍了基于Drools的业务规则引擎管理系统的设计,包括规则文件的可视化封装、业务对象和参数对象的抽象配置、规则生命周期的管理等。
  • Drools rules engine(https://www.ibm.com/docs/en/sig-and-i/5.2.5?topic=engine-drools-rules):这篇文档介绍了Drools规则引擎的基本概念和架构,包括事实、工作内存、规则、知识库、知识会话等,以及如何使用Java配置和注解来创建和执行规则。
  • Introduction to Drools(https://www.baeldung.com/drools):这篇文章也介绍了Drools规则引擎的基本概念和架构,以及如何使用Maven依赖和Spring Boot来创建和执行规则。

你可能感兴趣的:(规则引擎,drools)