• Rule的LHS由条件元素(Conditional Elements—CE)和匹配模式(Patterns)组成
  • Patterns被用来指示出fact的字段约束
  • 每个约束必须为true才能让RHS的actions fire

测试代码,测试用获取KnowledgeBase方法:

  /**
* 获取KnowledgeBase
* @return
* @throws Exception
*/
private static KnowledgeBase readKnowledgeBase(String ruleName) throws Exception {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource(ruleName, RuleTest.class), ResourceType.DRL);
KnowledgeBuilderErrors errors = kbuilder.getErrors();
if (errors.size() > 0) {
for (KnowledgeBuilderError error: errors) {
System.err.println(error);
}
throw new IllegalArgumentException("Could not parse knowledge.");
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
return kbase;
}

使用到的fact对象

package com.bean;

import java.util.ArrayList;
import java.util.List; public class Customer {
private String name;
private String Company;
private Integer age;
private String gender;
private String city;
private List<Account> accounts = new ArrayList<Account>();
//省略set、get、toString方法
}
package com.bean;

public class Account {
private String name;
private String status;
private int num;
}

匹配模式(Patterns)

  • 没有字段约束的Pattern

    Person()

/**规则文件.drl**/
package com.sample import com.bean.Customer; rule "No args"
when
Customer()
then
System.out.println( "no massage" );
end /**java测试代码,采用Junit测试**/
/**
* 没有字段约束的Pattern
* @throws Exception
*/
@Test
public void testNoParam() throws Exception {
KnowledgeBase kbase = readKnowledgeBase("NoParam.drl");
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
Customer customer = new Customer();
ksession.insert(customer);
ksession.fireAllRules();
logger.close();
}
  • 有文本字段约束的Pattern

    Person( name == “bob” )

/**规则文件.drl**/
package com.sample import com.bean.Customer; rule "Binding Param"
when
Customer($name:name=="七夜雪")
then
System.out.println( "Binding Param Rule and Customer is " + $name );
end /**java测试代码,采用Junit测试**/
/**
* 有文本字段约束的Pattern
* @throws Exception
*/
Customer customer = new Customer();
customer.setName("七夜雪");
ksession.insert(customer);
ksession.fireAllRules();
  • 字段绑定的Pattern

    Person( $name : name == “bob” )
    变量名称可以是任何合法的java变量,$是可选的,可由于区分字段和变量

    

//drl规则文件
package com.sample import com.bean.Customer; rule "Binding Fact"
when
$customer:Customer(name=="七夜雪")
then
System.out.println( "Binding Fact Rule :" + $customer );
end
  /**
* java测试方法
* 字段绑定的Pattern
* @throws Exception
*/
@Test
public void testBindingParam() throws Exception {
KnowledgeBase kbase = readKnowledgeBase("HaveParam.drl");
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
Customer customer = new Customer();
customer.setName("七夜雪");
ksession.insert(customer);
ksession.fireAllRules();
logger.close();
}
  • Fact绑定的Pattern

    $bob : Person( name == “bob” )字段绑定的Pattern

//drl文件
package com.sample import com.bean.Customer; rule "Binding Fact"
when
$customer:Customer(name=="七夜雪") //绑定变量$customer变量名
then 
  System.out.println( "Binding Fact Rule :" + $customer );
end
  /**
* Fact绑定的Pattern
* @throws Exception
*/
@Test
public void testBindingFact() throws Exception {
KnowledgeBase kbase = readKnowledgeBase("BindingFact.drl");
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
Customer customer = new Customer();
customer.setName("七夜雪");
customer.setCompany("听雪楼");
ksession.insert(customer);
ksession.fireAllRules();
logger.close();
}
  • 变量约束的Pattern

    Person( name == $name )

package com.sample

import  com.bean.Customer;
import com.bean.Account; rule "Param Limit"
when
Customer($name:name=="七夜雪")
Account(name==$name)
then
System.out.println( "Param Limit Rule" );
end

  

 /**
* 变量约束的Pattern
* @throws Exception
*/
@Test
public void testParamLimit() throws Exception {
KnowledgeBase kbase = readKnowledgeBase("ParamLimit.drl");
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
Customer customer = new Customer();
customer.setName("七夜雪");
customer.setCompany("听雪楼");
Account account = new Account();
account.setName("七夜雪");
ksession.insert(customer);
ksession.insert(account);
ksession.fireAllRules();
logger.close();
}

条件元素(Conditional Elements)

and

  • 对于顶级(非嵌套)patterns是隐式成立的
  • 可以显示add
  • 使用关键字’and’(不推荐使用 &&)
package com.sample

import  com.bean.Customer;
import com.bean.Account; rule "And"
when
Customer(name=="七夜雪" ) and
Account(name=="七夜雪")
then
System.out.println( "And Rule" );
end rule "Default"
when
Customer(name=="七夜雪" )
Account(name=="七夜雪")
then
System.out.println( "default is and" );
end rule "&&"
when
Customer(name=="七夜雪" ) &&
Account(name=="七夜雪")
then
System.out.println( "And && Rule" );
end
  /**
* 条件元素 and、&&,不写默认为and
* @throws Exception
*/
@Test
public void testAndRule() throws Exception {
KnowledgeBase kbase = readKnowledgeBase("And.drl");
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
Customer customer = new Customer();
customer.setName("七夜雪");
Account account = new Account();
account.setName("七夜雪");
ksession.insert(customer);
ksession.insert(account);
ksession.fireAllRules();
logger.close();
}

  

 or

  • 列能被显式or
  • 使用关键字’or’(不推荐使用 ||)
package com.sample

import  com.bean.Customer;
import com.bean.Account; rule "Or"
when
Customer(name=="七夜雪" ) or
Account(name=="七夜雪")
then
System.out.println( "And Rule" );
end

  

  /**
* 条件元素 or,不写默认为and
* 注:每个条件符合,then的内容都会执行一次
* @throws Exception
*/
@Test
public void testOrRule() throws Exception {
KnowledgeBase kbase = readKnowledgeBase("Or.drl");
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
Customer customer = new Customer();
customer.setName("七夜雪");
Account account = new Account();
account.setName("七夜雪");
ksession.insert(customer);
ksession.insert(account);
ksession.fireAllRules();
logger.close();
}

  

exists 、Not

package com.sample

import  com.bean.Customer;
import com.bean.Account; rule "Exists"
when
exists Customer() //工作空间存在customer对象
then
System.out.println( "Customer Exists" );
end rule "Not"
when
not Account() //工作空间不存在Account对象
then
System.out.println( "Account Not Exists" );
end

  

  /**
* 条件元素 exist、not,两个刚好相反
*
* @throws Exception
*/
@Test
public void testExistsAndNotRule() throws Exception {
KnowledgeBase kbase = readKnowledgeBase("From.drl");
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
Customer customer = new Customer();
Account account = new Account();
account.setName("七夜雪");
Account account1 = new Account();
account.setName("碧落");
customer.getAccounts().add(account);
customer.getAccounts().add(account1);
ksession.insert(customer);
ksession.fireAllRules();
logger.close();
}

  from

package com.sample

import  com.bean.Customer;
import com.bean.Account; rule "from"
when
$customer:Customer( )
    //customer中的accounts列表中存在name="碧落"的account对象
Account(name=="碧落") from $customer.accounts
then
System.out.println( "from element test success" );
end
  /**
* 条件元素 from
*
* @throws Exception
*/
@Test
public void testFromRule() throws Exception {
KnowledgeBase kbase = readKnowledgeBase("From.drl");
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
Customer customer = new Customer();
ksession.insert(customer);
ksession.fireAllRules();
logger.close();
}

collect

package com.sample

import  com.bean.Customer;
import com.bean.Account;
import java.util.ArrayList; rule "collect"
when
$customer:Customer( )
    //列表中status="Y"的Account对象大于等于4个,
$accounts:ArrayList(size >= 4) from collect (Account(status == "Y"))
then
System.out.println( "collect element test success" );
end
  /**
* 条件元素 collect
*
* @throws Exception
*/
@Test
public void testCollectRule() throws Exception {
KnowledgeBase kbase = readKnowledgeBase("Collect.drl");
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
Customer customer = new Customer();
Account account1 = new Account();
account1.setStatus("Y");
Account account2 = new Account();
account2.setStatus("Y");
Account account3= new Account();
account3.setStatus("Y");
Account account4 = new Account();
account4.setStatus("Y");
ksession.insert(customer);
ksession.insert(account1);
ksession.insert(account2);
ksession.insert(account3);
ksession.insert(account4);
ksession.fireAllRules();
logger.close();
}

Accumulate 聚合函数

package com.sample

import  com.bean.Customer;
import com.bean.Account; rule "accumulate"
when
    //工作空间中,account对象的num属性之和大于400时符合规则
$total:Number( intValue > 400)
from accumulate (Account($num:num),sum($num))
then
System.out.println( "accumulate element test success" );
end
  /**
* 条件元素 Accumulate
* 聚合函数
* @throws Exception
*/
@Test
public void testAccumulateRule() throws Exception {
KnowledgeBase kbase = readKnowledgeBase("Accumulate.drl");
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
Customer customer = new Customer();
Account account1 = new Account();
account1.setNum(100);
Account account2 = new Account();
account2.setNum(100);
Account account3= new Account();
account3.setNum(100);
Account account4 = new Account();
account4.setNum(200);
ksession.insert(customer);
ksession.insert(account1);
ksession.insert(account2);
ksession.insert(account3);
ksession.insert(account4);
ksession.fireAllRules();
logger.close();
}

Drools学习笔记2—Conditions / LHS 匹配模式&条件元素的更多相关文章

  1. Drools学习笔记3—Conditions / LHS—字段约束连接&字段约束操作符

    字段约束连接 用于字段约束 对象内部多个约束连接,采用“&&”(and).“||”(or)和“,”(and) 执行顺序:“&&”(and).“||”(or)和“,” 字 ...

  2. 并发编程学习笔记(9)----AQS的共享模式源码分析及CountDownLatch使用及原理

    1. AQS共享模式 前面已经说过了AQS的原理及独享模式的源码分析,今天就来学习共享模式下的AQS的几个接口的源码. 首先还是从顶级接口acquireShared()方法入手: public fin ...

  3. 开源规则引擎 Drools 学习笔记 之 -- 1 cannot be cast to org.drools.compiler.kie.builder.impl.InternalKieModule

    直接进入正题 我们在使用开源规则引擎 Drools 的时候, 启动的时候可能会抛出如下异常: Caused by: java.lang.ClassCastException: cn.com.cheng ...

  4. Redis学习笔记八:集群模式

    作者:Grey 原文地址:Redis学习笔记八:集群模式 前面提到的Redis学习笔记七:主从复制和哨兵只能解决Redis的单点压力大和单点故障问题,接下来要讲的Redis Cluster模式,主要是 ...

  5. Drools学习笔记

    Drools是一款基于Java的开源规则引擎 实现了将业务决策从应用程序中分离出来. 优点: 1.简化系统架构,优化应用 2.提高系统的可维护性和维护成本 3.方便系统的整合 4.减少编写“硬代码”业 ...

  6. C#设计模式学习笔记:(3)抽象工厂模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7596897.html,记录一下学习过程以备后续查用. 一.引言 接上一篇C#设计模式学习笔记:简单工厂模式( ...

  7. cocos2dx游戏开发——别踩白块学习笔记(二)——经典模式的实现

    一.创建GameScene以及GameLayer 就是简单创建一个Scene而已,在此就不多说啦~,可以参照我的打飞机的学习笔记(2). 二.添加一个开始栏 很简单,就是调用Block中的create ...

  8. C#设计模式学习笔记:(2)工厂方法模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7567880.html,记录一下学习过程以备后续查用. 一.引言 接上一篇C#设计模式学习笔记:简单工厂模式( ...

  9. Drools学习笔记4—Consequence/RHS

    Right Hand Side,当LHS所有条件满足才会执行 可以使用LHS部分定义的绑定变量.全局变量.或者直接编写JAVA代码. 提供宏函数操作working memory fact对象,如ins ...

随机推荐

  1. iBatis.net 第一篇 搭建

    iBatis.net 和 iBatis 是有区别的,一个是在net下使用的,另一个是在java下使用. 要想使用,需要下载相关iBatis.net包 1.下载iBatis.net,在网上有很多下载cs ...

  2. SPOJ375 QTREE - Query on a tree

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  3. Centos7+httpd+fastcgi安装提示错误

    搭建的环境: centos7 Apache/2.4.6 fastcgi2.4.6 rails4 在安装fastcgi的时候遇到了问题: 问题: ...... In file included from ...

  4. Qt5 窗口内的控件随窗口大小自动变化

    http://www.bubuko.com/infodetail-827151.html 讲的很详细

  5. Unity 3D 离线协议

    在联网状态下,获得离线协议,然后导入到Untiy的协议管理器里. 以后在断网的情况下,也能离线使用Unity. 步骤: 1.生成 Request 文件.(Unity_v5.3.1f1.alf) 1) ...

  6. 16-THREE.JS 半球光

    <!DOCTYPE html> <html> <head> <title></title> <script src="htt ...

  7. 一些神奇的(优化)板子——来自Loi_black的博客

    deque<int>q; void spfa(int s) { ;i<=n;i++) d[i]=1e9; d[s]=; q.push_back(s); used[s]=; while ...

  8. set/multiset和map/multimap用法小结

    二叉搜索树是ACM中经常需要用到的数据结构,熟练掌握map和set的用法很关键,现对其做一个简单的总结. 主要的功能有:插入元素,查找元素,删除,遍历/反向遍历. 插入,删除和查找操作的时间都和树的高 ...

  9. uva11134 - Fabled Rooks(问题分解,贪心法)

    这道题非常好,不仅用到了把复杂问题分解为若干个熟悉的简单问题的方法,更是考察了对贪心法的理解和运用是否到位. 首先,如果直接在二维的棋盘上考虑怎么放不好弄,那么注意到x和y无关(因为两个车完全可以在同 ...

  10. memcache应对缓存失效问题

    .两个key,一个key用来存放数据,另一个用来标记失效时间 比如key是aaa,设置失效时间为30s,则另一个key为expire_aaa,失效时间为25s. 在取数据时,用multiget,同时取 ...