广告
返回顶部
首页 > 资讯 > 后端开发 > Python >drools中query的用法小结
  • 714
分享到

drools中query的用法小结

2024-04-02 19:04:59 714人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录一、背景二、需求三、前置需求1、query的语法结构2、java中如何获取query的结果四、实现1、无参数query的使用1、drl文件编写2、java文件编写2、有参数que

一、背景

我们知道在drools中是存在工作内存的,我们的Fact对象会加入到工作内存中,同时我们自己也可以在drl文件中使用insert/modify/update/delete等方法,修改工作内存中对象的,那么我们怎么查询修改之后的工作内存的值呢?而droolsquery可以帮助我们实现这个功能。

二、需求

1、无参数query的使用
2、有参数query的使用
3、java代码中openLiveQuery的使用
4、rule中使用query

三、前置需求

1、query的语法结构

query queryName(参数列表)
end

注意事项:

query的名字在同一个KIE base的所有包中必须要唯一,一般情况下我们全局唯一即可。query没有whenthen的部分

2、java中如何获取query的结果

1、通过getQueryResults获取

QueryResults queryResults = kieSession.getQueryResults("query的名字",可选参数类表);

通过这种方式getQueryResults获取到的结果只会获取一次,如果工作内存中的数据发生了变化,则不会自动感知到。

2、通过openLiveQuery获取

kieSession.openLiveQuery("query的名字", new Object[]{可选参数}, new ViewChangedEventListener() {
    @Override
    public void rowInserted(Row row) {}
    @Override
    public void rowDeleted(Row row) { }
    @Override
    public void rowUpdated(Row row) {}
});

通过这种方式openLiveQuery是可以实时获取到结果的,当工作内存中的数据发生变化,这个地方是可以感知到的。

四、实现

此处只列出部分核心代码,一些无关的代码不列出。

1、无参数query的使用

1、drl文件编写

// 不带参数的查询
query "query01"
	// 注意这个地方的 $p,java代码中需要用到
    $p: Person(age < 18)
end

2、java文件编写

// 不带参数的query查询
QueryResults queryResults = kieSession.getQueryResults("query01");
queryResults.iterator().forEachRemaining(row -> {
    // 那么这个地方的 $p 是怎么来的呢?其实是我们自己编写的drl query中写的
    Person person = (Person) row.get("$p");
    log.info("query01从工作内存中获取的query: {}", person);
});

2、有参数query的使用

1、drl文件编写

// 带参数的查询
query query02(Integer $age)
    $p: Person(age < $age)
end

2、java文件编写

// 不带参数的query查询
// 带参数的query查询
queryResults = kieSession.getQueryResults("query02", 20);
queryResults.iterator().forEachRemaining(row -> {
    Person person = (Person) row.get("$p");
    log.info("query02从工作内存中获取的query: {}", person);
});

3、java代码中openLiveQuery的使用

1、drl文件编写

// 带参数的查询-查询工作内存Person对象的age的值小于外部传递进来的$age值
query query02(Integer $age)
    $p: Person(age < $age)
end
// 定义一个规则,当规则内存中的Person的age小于18时,直接年龄+1
rule "rule_test_live_query_in_java"
    no-loop true
    when
        $p: Person($age:age < 18)
    then
        modify($p){
        	// 此处修改了工作内存中age对象的值
            setAge($p.getAge() + 1)
        }
        System.out.println("更新来规则内存中Person["+$p.getName()+"]的age:["+$p.getAge()+"]值");
end

解释:
1、定义查询query02查询工作内存中的对象。
2、rule_test_live_query_in_java里面存在一个 modify($p) 这个操作会导致更新工作内存中对象的值。
3、no-loop true表达的是当前规则是否可以多次执行,就我们定义的这个规则,如果修改后的age<18那么可能还会导致规则的重新出发,加了no-loop true则只会触发一次。

2、java文件编写

public static void main(String[] args) {
    KieServices kieServices = KieServices.get();
    KieContainer kieContainer = kieServices.getKieClasspathContainer();
    KieSession kieSession = kieContainer.newKieSession("query-ksession");
    kieSession.addEventListener(new DebugRuleRuntimeEventListener());
    kieSession.addEventListener(new DebugAgendaEventListener());
    kieSession.addEventListener(new DebugProcessEventListener());
    // 实时查询
    kieSession.openLiveQuery("query02", new Object[]{20}, new ViewChangedEventListener() {
        @Override
        public void rowInserted(Row row) {
            Person person = (Person) row.get("$p");
            log.info("实时查询-query02向工作内存中插入Person: {}", person);
        }
        @Override
        public void rowDeleted(Row row) {
            Person person = (Person) row.get("$p");
            log.info("实时查询-query02向工作内存中删除Person: {}", person);
        }
        @Override
        public void rowUpdated(Row row) {
            Person person = (Person) row.get("$p");
            log.info("实时查询-query02向工作内存中更新Person: {}", person);
        }
    });
    Person person1 = new Person("张三", 16);
    kieSession.insert(person1);
    kieSession.fireAllRules();
    kieSession.dispose();
}

解释:
1、此处先使用了openLiveQuery查询。
2、让后向工作内存中insert(person1),并且触发了所有的规则fireAllRules

3、输出结果

10:08:54.415 [main] INFO com.huan.drools.querys.DroolsLiveQueryApplication - 实时查询-query02向工作内存中插入Person: Person(name=张三, age=16)
更新来规则内存中Person[张三]的age:[17]值
10:08:54.420 [main] INFO com.huan.drools.querys.DroolsLiveQueryApplication - 实时查询-query02向工作内存中更新Person: Person(name=张三, age=17)

可以看到,openLiveQuery实时查询到了工作内存中变更的对象。

4、rule中使用query

drl文件编写

// 定义一个查询,Person#name 需要以$prefix开头
query personNameStartsWith(String $prefix)
    Person(name.startsWith($prefix))
end
rule "rule_person_name_starts_with"
    when
        $p: Person($age:age < 18)
        personNameStartsWith("张";) // 此处多个参数使用 , 分割,并且最后必须以 ; 结尾
    then
        System.out.println("在rule中使用query");
end

如果出现了如下异常Query's must use positional or bindings, not field constraints: "张" : [Rule name='rule_person_name_starts_with'],这个是因为我们在rule中调用query时,参数没有以;结尾。正确用法personNameStartsWith("张";)

?personNameStartsWith("张";) 和 personNameStartsWith("张";)是不一样的。The ? symbol means the query is pull only, once the results are returned you will not receive further results as the underlying data changes

五、完整代码

https://gitee.com/huan1993/spring-cloud-parent/tree/master/drools/drools-drl-query

六、参考链接

1、Https://docs.drools.org/7.69.0.Final/drools-docs/html_single/index.html#drl-queries-con_drl-rules

到此这篇关于drools中query的使用的文章就介绍到这了,更多相关drools query使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: drools中query的用法小结

本文链接: https://www.lsjlt.com/news/148944.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • drools中query的用法小结
    目录一、背景二、需求三、前置需求1、query的语法结构2、java中如何获取query的结果四、实现1、无参数query的使用1、drl文件编写2、java文件编写2、有参数que...
    99+
    2022-11-13
  • drools中使用function的方法小结
    目录一、背景二、需求三、前置知识1、function语法结构2、drl文件中如何调用java的静态方法四、实现1、项目结构2、引入drools依赖3、编写kmodule.xml文件4...
    99+
    2022-11-13
  • 关于expdp 中query用法小结
       今天看到群里有人问到关于在使用expdp导出数据中使用query参数报错的解决方法,自己也出于好奇心瞎折腾了一把,现记录如下  1.第一次尝试的时候[oracl...
    99+
    2022-10-18
  • Pandas Query方法使用深度总结
    目录获取数据载入数据使用 query() 方法以 In-place 的方式执行 query 方法指定多个条件查询比较数值列比较多个列查询索引比较多列总结大多数 Pandas 用户都熟...
    99+
    2022-11-11
  • drools中then部分的写法(推荐)
    目录1、背景2、支持的方法2.1 insert 插入对象到工作内存中2.1.1 需求2.1.2 drl文件编写2.1.3 部分java代码编写2.1.4 运行结果2.1.5 结论2....
    99+
    2022-11-13
  • java中random的用法小结
    目录一、java.lang.Math.random()方法的用法二、 java.util.Random类用法java中存在两个随机函数,它们分别来自java.long.Math.ra...
    99+
    2022-11-13
  • springjdbctemplate的用法小结
    目录概述JDBCTemplate开发步骤介绍使用概述 原始繁琐的JDBC API对象的封装;操作模板如下:JdbcTemplate和HibernateTemplate,操作nosql...
    99+
    2023-05-16
    spring jdbctemplate使用 spring jdbctemplate
  • Java中BigInteger用法小结
    目录一.介绍BigInteger经常使用到的一些函数二、介绍BigInteger的读入方法——nextBigInteger(),从控制台读入一个BigInte...
    99+
    2023-03-07
    java中BigInteger用法 java BigInteger
  • python中f‘{}‘用法小结
    python中f‘{}‘用法 #先定义一个类class Desk():def desk(self):print(‘能放东西’)prin...
    99+
    2023-03-01
    python中f‘{}‘用法 python中f用法
  • Pythonargparse中的action=store_true用法小结
    目录Python argparse中的action=store_true用法前言示例官方文档多了解一点儿自定义小结思考补充:python库Argparse中的可选参数设置 actio...
    99+
    2023-02-10
    Python argparse中的action=store_true Python action=store_true
  • CSS3中Media Query的使用方法
    这篇文章主要介绍“CSS3中Media Query的使用方法”,在日常操作中,相信很多人在CSS3中Media Query的使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2022-10-19
  • guava中Multimap、HashMultimap用法小结
    目录1. 现在我们来介绍一种更高效的集合Multimap2. ImmutableMultimap不可变集合3.LinkedHashMultimap实现类4.TreeMultimap实...
    99+
    2022-11-13
  • TypeScript中括号用法小结
    目录索引签名获取接口类型的联合类型遍历接口数组键入类型本文只是简单从语法层面描述 [] 的用法。 索引签名 作用:告诉TS实际属性比计划的更多一些。 注意:键的类型必须可以赋值给 n...
    99+
    2023-05-16
    TypeScript 括号
  • PHP中的PDO::query()的使用方法
    这篇文章给大家分享的是有关PHP中的PDO::query()的使用方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。php是什么语言php,一个嵌套的缩写名称,是英文超级文本预处理语言(PHP:Hypertext...
    99+
    2023-06-14
  • JAVA中STRING的常用方法小结
    一、创建并初始化一个字符串 String b = "hello"; 使用构造方法创建并初始化一个字符串 String();//初始化字符串,表示空字符序列 String(value)...
    99+
    2022-11-15
    JAVA STRING
  • Shell编程中Shift的用法小结
    位置参数可以用shift命令左移。比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1、$2、$3丢弃,$0不移动。不带参数的shift命令相当于shift 1。 非常有用的 Unix 命...
    99+
    2022-06-04
    Shell编程中Shift用法 Shell grep 命令
  • JS中的reduce()方法使用小结
    目录一、语法二、实例三、其他相关方法过去有很长一段时间,我一直很难理解 reduce() 这个方法的具体用法,平时也很少用到它。事实上,如果你能真正了解它的话,其实在很多地方我们都可...
    99+
    2022-11-12
  • Laravel中10个有用的用法小结
    本文给大家介绍了Laravel 中一些常用的用法 1. 在 find 方法中指定属性 User::find(1, ['name', 'email']); User::findOr...
    99+
    2022-11-11
  • SpringBoot中ApplicationEvent和ApplicationListener用法小结
    目录一、开发ApplicationEvent事件二、 开发监听器三、推送事件四、注解方式实现监听器对不起大家,昨天文章里的告别说早了,这个系列还不能就这么结束。 我们前面的文章中讲解...
    99+
    2023-03-09
    Spring Boot ApplicationEvent用法 Spring Boot ApplicationEvent
  • vue3中hooks的概述及用法小结
    目录一、 什么是hooks二、hooks的用法大家好,今天这篇文章是介绍一下vue3中的hooks以及它的用法。本文内容主要有以下两点: 什么是hooksvue3中hooks的使用方...
    99+
    2023-03-07
    vue3中hooks使用 vue3 hooks
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作