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://folen.top/2020/03/20/drools-update-modify-retract-query/