Drools规则引擎insert、retract、update、modify、query示例

增insert

package com.sample
 
import com.sample.Person;
import com.sample.Pet;
import java.util.ArrayList;
import java.text.SimpleDateFormat;
import java.util.Date;
 
rule "find"
	when
		$person:Person(name == "godme")
	then
		Person person = new Person();
		person.setName("son");
		insert(person);
end

对应代码:

    public static final void main(String[] args) {
        try {
            KnowledgeBase kbase = readKnowledgeBase();
            StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
            KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
            Person person1 = new Person();
            Person person = new Person();
            person.setName("godme");
            person1.setName("judas");
            ksession.insert(person);
            ksession.insert(person1);
            ksession.fireAllRules();
            logger.close();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

删除retract

package com.sample
 
import com.sample.Person;
import com.sample.Pet;
import java.util.ArrayList;
import java.text.SimpleDateFormat;
import java.util.Date;
 
rule "find"
	when
		$person:Person(name == "godme")
	then
		// 从容器中移除指定对象 
		retract($person);
end

修改update-modify

package com.sample
 
import com.sample.Person;
import com.sample.Pet;
import java.util.ArrayList;
import java.text.SimpleDateFormat;
import java.util.Date;
 
rule "find"
	when
		$person:Person(name == "godme")
	then
		$person.setName("fucker");
        // update是直接更新对象,可以看做是移除之后再插入
        // 具体的操作是在外部,和modify区分
		update($person);
end
package com.sample
 
import com.sample.Person;
import com.sample.Pet;
import java.util.ArrayList;
import java.text.SimpleDateFormat;
import java.util.Date;
 
rule "find"
	when
		$person:Person(name == "godme")
	then
		modify($person){
			setName("fucker"),
			setAge(99)
		}
		// modify两点
		// 1. 方法
		//     modify中可以省略对象调用部分,直接调用方法
		//     $person.setName()  ==>  setName() 
		//     内部带对象会报错
		// 2. 分隔符号
		//     多个方法之间,使用逗号分隔
		//     可以写分号,但是只能作为结尾符,不能作为分隔符
		//     不可以没有分隔符
		//     以上错误,都会报错
end

代码update

    public static final void main(String[] args) {
        try {
            KnowledgeBase kbase = readKnowledgeBase();
            StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
            KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
            Person person1 = new Person();
            Person person = new Person();
            person.setName("godme");
            person1.setName("judas");
            ksession.insert(person);
            ksession.insert(person1);
            ksession.fireAllRules();
            // 获取句柄
            FactHandle handler = ksession.getFactHandle(person);
            // 通过句柄进行修改
            ksession.update(handler, person);
            logger.close();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }
 
//   代码能修改,drl中也可以使用java方言用代码进行修改 

无参查询

package com.sample
 
import com.sample.Person;
import com.sample.Pet;
import java.util.ArrayList;
import java.text.SimpleDateFormat;
import java.util.Date;
 
query "find_godme"
	$person:Person(name == "godme")
end
 
rule "find"
	when
		$person:Person(name == "godme")
	then
		System.out.println("print: " + $person.getName());
end
    public static final void main(String[] args) {
        try {
            KnowledgeBase kbase = readKnowledgeBase();
            StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
            KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
            Person person1 = new Person();
            Person person = new Person();
            person.setName("godme");
            person1.setName("judas");
            ksession.insert(person);
            ksession.insert(person1);
            ksession.fireAllRules();
            QueryResults find_godme_result = ksession.getQueryResults("find_godme");
            for(QueryResultsRow row : find_godme_result){
            	Person p = (Person)row.get("$person");
            	System.out.println("find_godme : " + p.getName());
            }
            logger.close();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

有参查询

package com.sample
 
import com.sample.Person;
import com.sample.Pet;
import java.util.ArrayList;
import java.text.SimpleDateFormat;
import java.util.Date;
 
 
query "find_Person"(String person_name)
	$person:Person(name == person_name)
end
 
 
rule "find"
	when
		$person:Person(name == "godme")
	then
		System.out.println("print: " + $person.getName());
end
    public static final void main(String[] args) {
        try {
            KnowledgeBase kbase = readKnowledgeBase();
            StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
            KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
            Person person1 = new Person();
            Person person = new Person();
            person.setName("godme");
            person1.setName("judas");
            ksession.insert(person);
            ksession.insert(person1);
            ksession.fireAllRules();
            QueryResults find_person_result = ksession.getQueryResults("find_Person", "judas");
            for(QueryResultsRow row : find_person_result){
            	Person p = (Person)row.get("$person");
            	System.out.println("find_person_result : " + p.getName());
            }
            logger.close();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

查询主体来说,注意两点

  1. 查询编写
  2. 外部代码

查询编写

  1. 结构
  2. 参数
  3. 查询
package com.sample
 
import com.sample.Person;
import com.sample.Pet;
import java.util.ArrayList;
import java.text.SimpleDateFormat;
import java.util.Date;
 
 
 
 
// 1. 声明 :query "name" (type param)
//    1. query 关键字必须
//    2. name必须唯一 
//    3. 无参(type param)可省略,或者() 
// 2. 查询主体
//    1. 一般的过滤条件,需要有对应接收对象$person
//    2. 可以再查询语句中编写多个查询
// 3. end
//    1.结束标记
 
query "find_Person"(String person_name)
	$person:Person(name == person_name)
end

外部代码

  1. 名称
  2. 参数
  3. 结果集
  4. 单行取数
    public static final void main(String[] args) {
        try {
            KnowledgeBase kbase = readKnowledgeBase();
            StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
            KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
            Person person1 = new Person();
            Person person = new Person();
            person.setName("godme");
            person1.setName("judas");
            ksession.insert(person);
            ksession.insert(person1);
            ksession.fireAllRules();
            // 会话指定名称查询,同时变参传入参数
            QueryResults find_person_result = ksession.getQueryResults("find_Person", "judas");
            // 遍历结果集,去除单行
            for(QueryResultsRow row : find_person_result){
            	// 通过规则内部定义的接收名称获取对象
            	Person p = (Person)row.get("$person");
            	System.out.println("find_person_result : " + p.getName());
            }
            logger.close();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

Drools技术视频

CSDN学院:《Drools7 规则引擎视频教程

CSDN学院:《Drools7系列优惠套餐》

CSDN学院:《Drools7规则引擎进阶教程》

CSDN学院:《Drools7规则引擎入门教程》

CSDN学院:《Drools规则引擎之决策表从入门到精通》

原文链接:https://blog.csdn.net/wait_for_eva/article/details/82152093



drools规则引擎中对象增删改查插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:http://www.choupangxia.com/2020/03/20/drools-update-modify-retract-query/