复习步骤23-27 规则引擎Drools(2)规则语法
规则引擎Drools(2)规则语法
规则文件结构
全局变量与函数定义
如下图:定义两个全局变量,userName,maxThan30,当对象Person的age>30时,就将其add到maxThan这个全局变量集合中
规则属性
- activation-group:**组,组内只有一个规则会被**。
- salience:优先级
条件语法
行为语法
一、测试drools自定义函数 -- 输出
1.1 新建 function-test.drl 和Person.java
新建 function-test.drl
新建 Person.java
package com.xiangshuai.act.c26;
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
1.2 测试方法
/**
* lqx
* 测试
* 测试drools自定义函数 -- 输出
*/
public static void functionTest(){
// 创建一个KnowledgeBuilder
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
// 添加规则资源到 KnowledgeBuilder
kbuilder.add(ResourceFactory.newClassPathResource("function-test.drl",
GrammarTest.class), ResourceType.DRL);
// 获取知识包集合
Collection<KnowledgePackage> pkgs = kbuilder
.getKnowledgePackages();
// 创建KnowledgeBase实例
KnowledgeBase kbase = kbuilder.newKnowledgeBase();
// 将知识包部署到KnowledgeBase中
kbase.addKnowledgePackages(pkgs);
// 使用KnowledgeBase创建StatefulKnowledgeSession
StatefulKnowledgeSession ksession = kbase
.newStatefulKnowledgeSession();
// 定义一个事实对象
Person person = new Person();
person.setName("王小明");
person.setAge(18);
// 向StatefulKnowledgeSession中加入事实
ksession.insert(person);
// 匹配规则
ksession.fireAllRules();
// 关闭当前session的资源
ksession.dispose();
/*
输出结果--我已经成年,我的名字是王小明 我的年龄是18
*/
}
二、测试 规则属性
- activation-group:**组,组内只有一个规则会被**。
- salience:优先级
**组 -- 应用场景,如一个人既是黄金会员,又是白金会员,当只能有个规则会被**,即只能优惠一次
2.1 新建 activation-group-test.drl和Person.java(已经建好了,用之前的
新建 activation-group-test.drl
如果不加**组,如图满足条件均会被触发,在测试类(如果弄个person 的age=120的话),会输出年龄已经超过100岁,应该打5折
经超过80岁,应该打8折
加了**组,只会触发第一个(优先级- salience-高的那一个,如果相同就第一个),只触发一个,只会输出,年龄已经超过100岁,应该打5折 ,如下图
2.2 测试方法
/**
* 二、测试 规则属性 --activation-group:**组
activation-group:**组,组内只有一个规则会被**。
salience:优先级
**组 -- 应用场景,如一个人既是黄金会员,又是白金会员,当只能有个规则会被**,即只能优惠一次
2.1 新建 function-test.drl 和Person.java(已经建好了,用之前的
新建 activation-group-test.drl
如果不加**组,如图满足条件均会被触发,在测试类(如果弄个person 的age=120的话),会输出年龄已经超过100岁,应该打5折
经超过80岁,应该打8折
*/
public static void activationGroupTest(){
// 创建一个KnowledgeBuilder
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
// 添加规则资源到 KnowledgeBuilder
kbuilder.add(ResourceFactory.newClassPathResource("activation-group-test.drl",
GrammarTest.class), ResourceType.DRL);
// 获取知识包集合
Collection<KnowledgePackage> pkgs = kbuilder
.getKnowledgePackages();
// 创建KnowledgeBase实例
KnowledgeBase kbase = kbuilder.newKnowledgeBase();
// 将知识包部署到KnowledgeBase中
kbase.addKnowledgePackages(pkgs);
// 使用KnowledgeBase创建StatefulKnowledgeSession
StatefulKnowledgeSession ksession = kbase
.newStatefulKnowledgeSession();
// 定义一个事实对象
Person person = new Person();
person.setName("王小明");
person.setAge(120);
// 向StatefulKnowledgeSession中加入事实
ksession.insert(person);
// 匹配规则
ksession.fireAllRules();
// 关闭当前session的资源
ksession.dispose();
/*
输出结果--加了**组--年龄已经超过100岁,应该打5折 --加了**组
输出结果--不加**组--年龄已经超过100岁,应该打5折
经超过80岁,应该打8折
*/
}
- 2.2.1 测试salience:优先级
新建 activation-group- salience -test.drl和Person.java(已经建好了,用之前的
新建activation-group- salience -test.drl
触发 优先级- salience-高的那一个,只触发一个,如下图activation group B的优先级设为10,而 activation group A为默认的0,因此只会触发B
2.2.2测试方法
/**
* 二、测试 规则属性 --activation-group -**组 salience:优先级
*/
public static void activationGroupSalienceTest(){
// 创建一个KnowledgeBuilder
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
// 添加规则资源到 KnowledgeBuilder
kbuilder.add(ResourceFactory.newClassPathResource("activation-group- salience -test.drl",
GrammarTest.class), ResourceType.DRL);
// 获取知识包集合
Collection<KnowledgePackage> pkgs = kbuilder
.getKnowledgePackages();
// 创建KnowledgeBase实例
KnowledgeBase kbase = kbuilder.newKnowledgeBase();
// 将知识包部署到KnowledgeBase中
kbase.addKnowledgePackages(pkgs);
// 使用KnowledgeBase创建StatefulKnowledgeSession
StatefulKnowledgeSession ksession = kbase
.newStatefulKnowledgeSession();
// 定义一个事实对象
Person person = new Person();
person.setName("王小明");
person.setAge(120);
// 向StatefulKnowledgeSession中加入事实
ksession.insert(person);
// 匹配规则
ksession.fireAllRules();
// 关闭当前session的资源
ksession.dispose();
/*
输出结果-
年龄已经超过,应该打8折
*/
}
测试类GrammarTest.java
/**
* 二、测试 规则属性 --activation-group -**组 salience:优先级
*/
public static void activationGroupSalienceTest(){
// 创建一个KnowledgeBuilder
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
// 添加规则资源到 KnowledgeBuilder
kbuilder.add(ResourceFactory.newClassPathResource("activation-group- salience -test.drl",
GrammarTest.class), ResourceType.DRL);
// 获取知识包集合
Collection<KnowledgePackage> pkgs = kbuilder
.getKnowledgePackages();
// 创建KnowledgeBase实例
KnowledgeBase kbase = kbuilder.newKnowledgeBase();
// 将知识包部署到KnowledgeBase中
kbase.addKnowledgePackages(pkgs);
// 使用KnowledgeBase创建StatefulKnowledgeSession
StatefulKnowledgeSession ksession = kbase
.newStatefulKnowledgeSession();
// 定义一个事实对象
Person person = new Person();
person.setName("王小明");
person.setAge(120);
// 向StatefulKnowledgeSession中加入事实
ksession.insert(person);
// 匹配规则
ksession.fireAllRules();
// 关闭当前session的资源
ksession.dispose();
/*
输出结果-
年龄已经超过,应该打8折
*/
}