深入浅析drools中Fact的equality modes

深入浅析drools中Fact的equality modes

在drools中,我们经常会使用Fact来表示我们的规则中所需要的对象或者数据。在使用Fact的时候,我们需要考虑到Fact的Equality Modes(等值模式)问题。Equality Modes决定了如何比较两个Fact是否相等,进而对整个规则的执行结果产生影响。下面我们详细介绍一下drools中Fact的Equality Modes。

Equality Modes的种类

在drools中,我们有三种Equality Modes:

  1. STRICT: 严格匹配模式,即只有完全相同的两个Fact才能被认为是相等的。
  2. EQUALITY: equal模式,即只有规定的单个或多个字段的值相等的两个Fact才能被认为是相等的。
  3. IDENTITY: 唯一标识模式,即只有两个Fact对象的内存地址相等时才认为是相等的。

Equality Modes的使用

我们可以通过在定义规则时使用注解的方式来设置Fact的Equality Modes方式,例如:

@org.kie.api.definition.type.PropertyReactive(mode = PropertyReactiveMode.EQUALITY)
public class Person {
  private String name;
  private int age;
  // ...
}

上述示例中,我们通过在Person类上使用注解的方式来设置Person使用EQUALITY模式。

EQUALITY模式的示例

接下来,我们举两个EQUALITY模式的示例:

示例1:EQUALITY模式的使用

rule "Person is Over 18"
when
  $p1: Person($age1 : age >= 18)
  $p2: Person(age == $age1, name != $p1.name)
then
  System.out.println($p1.getName() + " and " + $p2.getName() + " are both over 18.");
end

上述规则查找Person集合中年龄在18岁以上的人,同时输出任意两个年龄在18岁以上的人的姓名。因为在定义Person时使用了注解,所以使用了EQUALITY模式。

示例2:STRICT模式下的equal方法被调用

rule "Person is same age and name"
when
  $p1: Person($name : name, $age : age)
  $p2: Person(name == $name, age == $age)
  eval($p1.equals($p2))
then
  System.out.println($p1.getName() + " and " + $p2.getName() + " are the same age and have the same name.");
end

上述规则查找Person集合中同名同岁的人,并输出他们的姓名。因为EQUALITY模式无法满足这个需求,所以定义了eval语句,使用STRICT模式下的equal方法实现判断。

总结

本文详细讲解了drools中Fact的Equality Modes,包括其种类和使用方法,并且给出了两个EQUALITY模式的示例。我们需要根据具体的需求选择合适的Equality Modes方式,以保证规则的正确执行。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入浅析drools中Fact的equality modes - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • java中对象调用成员变量与成员实例方法

    Java 中,对象调用成员变量和成员实例方法的过程是通过对象的引用来实现的。下面是完整的攻略: 对象调用成员变量 首先需要创建一个对象的实例,即对象的地址,然后通过对象的引用来调用成员变量。Java 中的成员变量可以分为类变量和实例变量。对于类变量,直接使用类名来调用即可。对于实例变量,则必须使用对象的引用来调用。 调用类变量 调用类变量可以直接使用类名,例…

    Java 2023年5月26日
    00
  • 组织树查询-Jvava实现(递归)

    1.首先查询出组织机构 就是一个简单的查询 List<Dept> deptList = mapper.getDeptList(); Map<Long, OrgNode> nodeMap = new HashMap<>(); List<Long> rootIds = new ArrayList<>()…

    Java 2023年4月19日
    00
  • 解决使用httpclient传递json数据乱码的问题

    解决使用HttpClient传递JSON数据乱码问题的攻略,我们可以从以下两个方面来考虑: 设置Http请求头中的Content-Type为application/json 将JSON数据的字符串转化为字节数组进行传输 下面将分别详细讲解这两个方面的解决方案以及代码示例。 设置Http请求头中的Content-Type为application/json Ht…

    Java 2023年5月26日
    00
  • Java web实现购物车案例

    以下是“Java web实现购物车案例”的完整攻略: 1. 准备工作 首先,我们需要一些工具来实现Java web开发。具体来说,需要安装并配置以下软件:* JDK(Java Development Kit)* Tomcat服务器* Eclipse开发环境* MySQL数据库 2. 数据库设计 购物车需要记录商品和购买数量等信息,因此我们需要在MySQL数据…

    Java 2023年6月15日
    00
  • 图片验证码概述及实现步骤

    图片验证码是为了防止机器人或者恶意程序进行恶意添加、登录、注册等操作而采用的一种人机交互验证机制。其主要原理是用户需要识别并输入正确的图片中所显示的字符或者图形,来证明其为人类而非机器。下面是图片验证码的实现步骤。 步骤一:生成验证码图片 首先,我们需要生成一张验证码图片,通常可以使用 Python 中的 PIL 库或者 PHP 中的 GD 库来生成。生成过…

    Java 2023年6月15日
    00
  • bootstrap 下拉多选框进行多选传值问题代码分析

    下面给出“bootstrap下拉多选框进行多选传值问题代码分析”的完整攻略。 1. 背景 在使用bootstrap开发Web应用时,经常会使用下拉多选框进行多选,但如何将所选的值传递给后端服务器,还是一个值得探讨的问题。 2. 问题 bootstrap的下拉多选框有一个data-selected-text-format属性,它可以控制选中的值的格式,如可以将…

    Java 2023年6月15日
    00
  • 基于Class.forName()用法及说明

    下面我来为你详细讲解“基于Class.forName()用法及说明”的完整攻略。 什么是Class.forName()方法? 在Java中,Class.forName()方法是一种加载Class对象的方式。注意,它并不是使用了一个类,而是将它加载到JVM中,使其代码可以被执行。通过使用该方法,我们可以动态的创建对象、使用反射等功能。 Class.forNam…

    Java 2023年6月15日
    00
  • Java Apache Commons报错“RuntimeException”的原因与解决方法

    “ReflectiveOperationException”是Java的Apache Commons类库中的一个异常,通常由以下原因之一引起: 无效的方法:如果方法无效,则可能会出现此错误。在这种情况下,需要检查方法以解决此问题。 无效的参数:如果参数无效,则可能会出现此错误。在这种情况下,需要检查参数以解决此问题。 以下是两个实例: 例1 如果方法无效,则…

    Java 2023年5月5日
    00
合作推广
合作推广
分享本页
返回顶部