版权声明:来一来,看一看,有钱的捧个人场,没钱的你不得捧个人场 https://blog.csdn.net/wait_for_eva/article/details/82152093
容器
这东西现在也大致有个了解了,不讲究细节,大致来看也就是
规则 + 数据
好比算法 + 数据 = 程序,抛去执行流程,规则也就是固定的算法,所以
drools = rule + fact
如果说程序要有一个运行环境,那么,drools也需要有一个环境来执行这个操作
这个容器(环境)中,有rule和fact
从代码执行顺序,我们大致也能有一点感觉
- 加载规则
- 创建会话
- 插入数据
这个所谓会话,也就是我们需要的容器
从数据角度,这东西也相当于一个数据库,支持增删改查
只不过,这数据可以被操作,不一定就是死板的记录数据
增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
查
无参
drl
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
java
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();
}
}
有参
drl
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
java
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();
}
}
查询比较繁琐,但是也是后面的主流。
可能是
逻辑全部集中在"规则"当中,外部只需插入数据。
这种先入为主的观念在作祟,会使得我们对外部逻辑反而有些排斥了。
但是逼近是程序猿,怎么能够讨厌代码呢。
复杂的业务也必定不是单一的。就是这样了