复习步骤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

        */

    }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值