Drools 查询学习
Drools 查询学习
查询以 query 关键字开始,以 end 关键字结束,在 package 当中一个查询要有唯一的名称,查询的内容就是查询的条件部分,条件部分内容的写法与规则的 LHS 部分写法完全相同。
1.无参数查询
代码语法如下:
query "query name"
#conditions
end
示例代码:
query "testQuery"
customer:Customer(age>30,orders.size >10)
end
查询调用的过程:
查 询 的 调 用 是 由 StatefulSession 完 成 的 , 通 过 调 用 StatefulSession对象的getQueryResults(String queryName)方法实现对查询的调用,
该方法的调用会返回一个QueryResults 对象,QueryResults 是一个类似于 Collection 接口的集合对象,在它当中存放在若干个 QueryResultsRow 对象,
通过 QueryResultsRow 可以得到对应的 Fact 对象,从而实现根据条件对当前 WorkingMemory 当中 Fact 对象的查询。
java代码如下:
package test;
import java.util.ArrayList;
import java.util.List;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.impl.ClassPathResource;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.rule.QueryResults;
import org.drools.runtime.rule.QueryResultsRow;
public class Test {
public static void main(String[] args) {
KnowledgeBuilder kb = KnowledgeBuilderFactory.newKnowledgeBuilder();
kb.add(new ClassPathResource("test/test.drl"),ResourceType.DRL);
KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase();
knowledgeBase.addKnowledgePackages(kb.getKnowledgePackages());
StatefulKnowledgeSession statefulSession = knowledgeBase.newStatefulKnowledgeSession();
//向当前WorkingMemory当中插入Customer对象
statefulSession.insert(generateCustomer("张三",20,21));
statefulSession.insert(generateCustomer("李四",33,11));
statefulSession.insert(generateCustomer("王二",43,12));
//调用查询
QueryResults queryResults=statefulSession.getQueryResults("testQuery");
for(QueryResultsRow qr:queryResults){
Customer cus=(Customer)qr.get("customer");
//打印查询结果
System.out.println("customer name :"+cus.getName());
}
statefulSession.dispose();
}
/**
* 产生包括指定数量Order的Customer
*
*/
public static Customer generateCustomer(String name,int age,int orderSize){
Customer cus=new Customer();
cus.setName(name);
cus.setAge(age);
List ls=new ArrayList();
for (int i = 0; i < orderSize; i++) {
ls.add(new Order());
}
cus.setOrders(ls);
return cus;
}
}
2.参数查询
代码语法如下:
query "query name" (Object obj,...)
#conditions
end
示例代码:
query "testQuery"(int $age,String $gender)
customer:Customer(age>$age,gender==$gender)
end
调用过程:
有两个外部参数需要传入,一个是类型为 int 的 $age;一个是类型为String 的$gender(这里传入参数变量名前添加前缀“$”符号,是为了和条件表达式中相关对于带参数的查询,
可以采用 StatefulSession 提供的 getQueryResults(String queryName,new Object[]{})方法来实现, 这个方法中第一个参数为查询的名称, 第二个 Object对象数组既为要输入的参数集合。
java代码如下:
package test;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.impl.ClassPathResource;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.rule.QueryResults;
import org.drools.runtime.rule.QueryResultsRow;
public class Test {
public static void main(String[] args) {
KnowledgeBuilder kb =KnowledgeBuilderFactory.newKnowledgeBuilder();
kb.add(new ClassPathResource("test/test.drl"),ResourceType.DRL);
KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase();
knowledgeBase.addKnowledgePackages(kb.getKnowledgePackages());
StatefulKnowledgeSession statefulSession = knowledgeBase.newStatefulKnowledgeSession();
//向当前WorkingMemory当中插入Customer对象
statefulSession.insert(generateCustomer("张三",20,"F"));
statefulSession.insert(generateCustomer("李四",33,"M"));
statefulSession.insert(generateCustomer("王二",43,"F"));
//调用查询
QueryResults queryResults=statefulSession.getQueryResults("testQuery", new Object[]{new Integer(20),"F"}); //函数名 和参数
for(QueryResultsRow qr:queryResults){
Customer cus=(Customer)qr.get("customer");
System.out.println("customer name :"+cus.getName());
}
statefulSession.dispose();
}
/**
* 产生Customer对象
*/
public static Customer generateCustomer(String name,int age,String gender){
Customer cus=new Customer();
cus.setAge(age);
cus.setName(name);
cus.setGender(gender);
return cus;
}
}
Drools 查询学习的更多相关文章
- Drools 函数学习
Drools 函数学习 函数是定义在规则文件当中一代码块,作用是将在规则文件当中若干个规则都会用到的业务操作封装起来,实现业务代码的复用,减少规则编写的工作量.函数的编写位置可以是规则文件当中 pac ...
- Mysql查询——学习阶段
1.开篇 搞开发的都知道,当数据量很大的时候,我们的代码逻辑的简单性就显得十分重要,否则处理起来就需要花费相当多的时间.另外还有一个地方需要注意的是我们写的sql语句. 一个拥有多年开发的资深开发者可 ...
- MVC中使用Entity Framework 基于方法的查询学习笔记 (三)
紧接上文,我们已经学习了MVC数据上下文中两个常用的类,这两个类承载着利用函数方式进行数据查询的全部内容,我们既然已经了解了DbSet<TEntity> 是一个泛型集合,并且实现了一些接口 ...
- MVC中使用Entity Framework 基于方法的查询学习笔记 (一)
EF中基于方法的查询方式不同于LINQ和以往的ADO.NET,正因为如此,有必要深入学习一下啦.闲话不多说,现在开始一个MVC项目,在项目中临床学习. 创建MVC项目 1.“文件”--“新建项目”-- ...
- sql查询学习和实践点滴积累
https://blog.rjmetrics.com/2008/10/28/correlated-subqueries-in-mysql/ http://www.mysqltutorial.org/m ...
- MVC中使用Entity Framework 基于方法的查询学习笔记 (二)
解释,不解释: 紧接上文,我们在Visual Studio2012中看到系统为我们自动创建的视图(View)文件Index.cshtml中,开头有如下这句话: @model IEnumerable&l ...
- .NET系列文章——近一年文章分类整理,方便各位博友们查询学习
由于博主今后一段时间可能会很忙(准备出书:<.NET框架设计—模式.配置.工具>,外加换了新工作),所以博客会很少更新: 在最近一年左右时间里,博主各种.NET技术类型的文章都写过,根据博 ...
- Drools引擎学习
首先上一段话: 为提高效率,管理流程必须自动化,即使现代商业规则异常复杂.市场要求业务规则经常变化,系统必须依据业务规则的变化快速.低成本的更新.为了快速.低成本的更新,业务人员应能直接管系统中的规则 ...
- MySQL 多表查询 学习与练习
一.介绍 首先先准备表 员工表和部门表 #建表 create table department( id int, name varchar(20) ); create table employee1( ...
随机推荐
- php字符串操作集锦
web操作, 主要就是对字符文本信息进行处理, 所以, 字符串操作几乎占了很大一部分的php操作.包括 注意strstr 和 strtr的区别? 前者表示字符串查找返回字符串,后者表示字符串中字符替换 ...
- JPA入门
JPA是什么 JPA全称Java Persistence API,是一组用于将数据存入数据库的类和方法的集合.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化 ...
- c#生成二维码
String link ="www.baidu.com";//这里一般是一个链接 封装后的方法,直接调用就可以了 public void CreateQRCode ...
- CentOS 6.5 安装 Redis-3.2.6
到官网下载最新版的 Redis-3.2.6, 我把它放到文件夹:/usr/local/src/centos-sdk/source2/redis 安装脚本 redis-3.2.6.sh #!/bin/b ...
- Fedora下依赖库的解决
转载于http://blog.sina.com.cn/s/blog_6f74890d0101dpp4.html x86_64版本的fedora中打开共享对象文件失败的解决小技巧———以qq for l ...
- 答辩HTML5
答辩有三个项目,有三个游戏和知乎,游戏都是有js写的,我想说的是想要做一个是那么难啊!老师给了我们游戏的项目还有游戏的思路构成,完成项目.还有一个知乎,也很难,用到HTML,css3,php,数据库, ...
- clearfix的应用
之前遇到一个问题,引用Bootstrap框架时 一行显示四个模块,小屏幕时显示两个模块 当内容一样时,大小屏幕时一样的,但是当其中一个和另一个内容不同时,展示效果就会有错乱 <div class ...
- Android的Intent.FLAG_ACTIVITY_CLEAR_TOP无效
转载:http://blog.csdn.net/u011361576/article/details/48626237 今天写代码遇到了一个问题: 当 B - A - B 跳转的时候,使用Intent ...
- GpuImage简单使用
声明变量 @interface ********** { GPUImageVideoCamera *Camera; GPUImageOutput *Filters; GPUImageView *Cam ...
- Picard报错“MAPQ should be 0 for unmapped read”的解决方法
picard对bwa生成的sam文件进行reorder时,报错如下: Getting Help Exception in thread "main" htsjdk.samtools ...