drools规则引擎中对象增删改查
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();
}
}
查询主体来说,注意两点
- 查询编写
- 外部代码
查询编写
- 结构
- 参数
- 查询
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
外部代码
- 名称
- 参数
- 结果集
- 单行取数
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

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接
本文链接:http://www.choupangxia.com/2020/03/20/drools-update-modify-retract-query/