drools-数据提取和属性筛选_drools 多层对象-程序员宅基地

技术标签: java  

bean

package com.sample;

public class Person {
	private String name;
	private int age;
	private Gender gender;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Gender getGender() {
		return gender;
	}
	public void setGender(Gender gender) {
		this.gender = gender;
	}
}

条件筛选

package com.sample
 
import com.sample.Person;
import com.sample.Gender;
rule "find"
    when
    	// 注释
    	// 1. 支持//注释
		/*  
		   2. 支持多行注释
		*/
		// 3. #注释能用,但是有些不能用,版本问题?设置问题?这个不太清楚,反正java注释通用
        
        // 筛选
        /*
           1. 空条件筛选:表示无筛选条件,全量接收
           		Person()
           2. 单条件筛选:通过属性名直接进行值判断,筛选属性值满足条件的对象
           		Person(name == "godme")
           3. 多条件筛选:多条件筛选即多属性限定,用逗号进行分隔,多个筛选条件同时存在,同时满足才符合筛选条件
           		Person(name == "godme" , age < 25)
        */
        
        // 筛选操作符说明
        /*	
        	 0. 基本的框架其实就是指定类,在括号中进行属性值的筛选
        	 1. 多属性之间的筛选通过逗号进行分隔
       	 	 2. 属性判断支持一般的判定符,大于,小于,等于,不等 ... 等系列操作
       		 3. 操作符针对类型,不能使用不适合的条件判定符操作不对应的数据
        */

        Person(name == "godme") 
       	// 单对象的多属性关联筛选要严格区别于其他条件关联,后续的慢慢学习
       	/*
       		1. 单一对象筛选
       		2. 对象联合筛选
       		3. 条件联动组合
       	*/
    then
        System.out.println("is him");
end

对象获取

package com.sample
 
import com.sample.Person;
rule "find"
    when
    	/*
    		规则文件当中也可以存在变量,通过变量来存储值,可以有很多用途
    		1. 关联筛选:通过用变量进行筛选,可以进行一个动态过滤,不必那么死板
    			Person(name == $name)
    		2. 操作传递
    			通过$person:Person()提取对象
    			可以再then的操作语句中进行操作,针对对象进行处理
    	*/
    	
    	/*
    		替换办法
    		1. 变量名
    			无限定,不重复即可,不必类型声明,自动判别
    		2. 赋值符
    			:冒号,不再是等号=
    	*/
    	/*
    		作用对象
    		1. 对象
    		2. 属性
    	*/
    	/*
    		命名
    		一般可以用$开头,同名来进行值记录,类似于this,便于区分,也 不会混淆
    		但是没有硬性规定,还是可以随便自定义
    	*/
        $person:Person($name:name == "godme") 
    then
        System.out.println($person.getName());
end

数据插入

package com.sample;

import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.logger.KnowledgeRuntimeLogger;
import org.drools.logger.KnowledgeRuntimeLoggerFactory;
import org.drools.runtime.StatefulKnowledgeSession;

public class DroolsTest {

    public static final void main(String[] args) {
        try {
            KnowledgeBase kbase = readKnowledgeBase();
            StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
            KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
            // 数据生成
            Person person = new Person();
            // 属性填充
            person.setName("godme");
            // 数据插入
            ksession.insert(person);
            // 规则执行
            ksession.fireAllRules();
            logger.close();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    private static KnowledgeBase readKnowledgeBase() throws Exception {
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"), ResourceType.DRL);
        KnowledgeBuilderErrors errors = kbuilder.getErrors();
        if (errors.size() > 0) {
            for (KnowledgeBuilderError error: errors) {
                System.err.println(error);
            }
            throw new IllegalArgumentException("Could not parse knowledge.");
        }
        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
        return kbase;
    }
}

代码部分,可以万年不变的

  1. 创建对象
  2. 属性填充
  3. 对象插入
  4. 规则执行

主体的逻辑都在规则文件中定义,至于规则文件中的更高级操作,目前不得而知。

现在只能专注于逻辑的编辑。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wait_for_eva/article/details/81981491

智能推荐

Fragment动态添加+android笔记2-程序员宅基地

文章浏览阅读536次。这个布局不要写错了。这个是fragment.xml。

数字孪生模型构建理论及应用-程序员宅基地

文章浏览阅读5.4k次,点赞3次,收藏42次。源自:计算机集成制造系统作者:陶飞 张贺 戚庆林 徐 俊 孙铮 胡天亮 刘晓军 刘庭煜 关俊涛 陈畅宇 孟凡伟 张辰源 李志远 魏永利 朱铭浩 肖斌数字孪生作为实现数字化转型和促进智能化升级的重要使能途径,一直备受各行各业关注,已从理论研究走向了实际应用阶段。数字孪生是以多维虚拟模型和融合数据双驱动,通过虚实闭环交互,来实现监控、仿真、预测、优化等实际功能服务和应用需求,其中数字孪生模型构建是实现数字孪生落地应用的前提。_数字孪生模型

spring揭秘总结(一)——spring的Ioc容器_spring ioc容器-程序员宅基地

文章浏览阅读1.3k次。spring揭秘这本权威书籍阅读后的总结分享,希望能帮助到你_spring ioc容器

SQLServer中top关键字的用法_sql server top-程序员宅基地

文章浏览阅读6.4k次,点赞2次,收藏12次。实例1.select top 10 * from 成绩信息 作用:查询前十行数据2.select top 10 percent * from 成绩信息 作用:查询前10%行的数据3.declare @i int set @i=20 select top (@i) percent * from 成绩信息声明了一个变量i为整型,然后对变量i复制为20,然后就可以限制20%行数的数据了。4.declare @i int set @i=20 ..._sql server top

2020牛客国庆集训派对day5 B.Hyperdrome_b\hyperdrome-程序员宅基地

文章浏览阅读2.9k次。2020牛客国庆集训派对day5 B.Hyperdrome题目链接题目描述Hypergnome planet is famous for its Great Universal Games between gnomes — the Games between gnomes from each part of the galaxy in various disciplines.The most popular discipline in the Games is the Hyperdrome disc_b\hyperdrome

Python界面 PyQT可视化开发(python3+PyQt5+Qt Designer)-程序员宅基地

文章浏览阅读7.5k次,点赞15次,收藏71次。前言 以前制作一个Python窗体界面,我都是用GUI窗口视窗设计的模块Tkinter一点一点敲出来的,今天朋友问我有没有Python窗体的设计工具,“用鼠标拖拖”就能完成窗体设计,我查了查相关资料,果然有一款好用的工具——Qt Designer。1.安装Qt Designer 这里需要安装两个东西:PyQt5和PyQt5-tools:安装PyQt5:打开CMD或者PowerShell,在命令窗中输入 pip install PyQt5 执行结果如下:..._pyqt可视化

随便推点

ezcad旋转轴标刻参数_激光打标机软件ezcad中的曲线圆弧排文本参数说明及设置...-程序员宅基地

文章浏览阅读2.9k次。或者单击FI 图标。在绘制文字命令下,按下鼠标左键即可创建文字对象。4.7.2 激光打标机软件EzCad2 支持曲线排文字,如果您单击的位置足够接近于一条曲线图形,那么您输入的文字将会随着该曲线的轨迹排列。当前文字是曲线排文字时,点击 后系统弹出如图 4-12 所示对话框 。图 4-12 曲线文字表示文字总是平行于曲 线的切线放置,如图 4-13 所示。图 4-13 正常放置表示文字总是垂直放置,..._ezcad激光打标详细教程

打开视频文件提示服务器异常,视频解析服务器异常-程序员宅基地

文章浏览阅读1.2k次。视频解析服务器异常 内容精选换一换修改DNS服务器可以很快同步到顶级域服务器并在网络中生效。但是,域名服务商处NS记录的TTL值通常设置为48小时,这样假如某些地区Local DNS缓存了域名的NS记录,则最长需要48小时才能刷新成新的NS记录,变更为修改后的DNS服务器。因此,修改域名DNS服务器的生效时间请以域名服务商处的说明为准。在等待修改生效期间,请勿删除域名在原反向解析主要应用于自建邮箱..._云聚鹰视频解析错误

K-means算法和高斯混合模型的异同_高斯混合模型和kmeans之间有什么区别-程序员宅基地

文章浏览阅读1.5w次,点赞11次,收藏52次。写这篇文章的缘由是因为早上的机器学习讨论班大家对于一句话:用于向量化的k均值是高斯混合模型的一个硬版本(出处:机器学习导论,隐马尔科夫模型,p247,(15-36))产生了深刻的思考然后不理解,在结合老师的讲解以及搜索资料后,决定记录下来。这一部分属于无监督学习的内容,无监督学习内容主要包括:Kmeans聚类算法、高斯混合模型GMM及EM算法等。Kmeans聚类其实聚类算法除了Kmeans,还有其..._高斯混合模型和kmeans之间有什么区别

精简指令集(RISC)和复杂指令集(CISC)的区别_精简指令集和复杂指令集-程序员宅基地

文章浏览阅读2.4k次。RISC是精简指令集CPU,指令位数较短,内部还有快速处理指令的电路,使得指令的译码与数据的处理较快,所以执行效率比CISC高,不过,必须经过编译程序的处理,才能发挥它的效率,我所知道的IBM的 Power PC为RISC CPU的结构,CISCO 的CPU也是RISC的结构。复杂指令集CPU内部为将较复杂的指令译码,也就是指令较长,分成几个微指令去执行,正是如此开发程序比较容易(指令多的缘故),但是由于指令复杂,执行工作效率较差,处理数据速度较慢,PC 中 Pentium的结构都为CISC CPU。_精简指令集和复杂指令集

wps 字体对系统无效_linux版WPS系统缺失字体的解决办法-程序员宅基地

文章浏览阅读1.3k次。每次启动linux版WPS就会弹出“系统缺失字体……”提醒对话框,对于系统缺失字体有以下几种:wingdings、wingdings 2、wingdings 3、Webdings、MT Extra,下面就来讲解如何让系统不缺失这些字体呢?从网上找到wingdings、wingdings 2、wingdings 3、Webdings、MT Extra这些字体进入主文件夹,按Ctrl+h键(显示隐藏文..._wps提示方正黑体_gbk对系统无效

利用MATLAB对图像中物体进行计数_matlab特殊形状计数-程序员宅基地

文章浏览阅读1.6w次,点赞18次,收藏178次。**利用MATLAB对一张图片中相同得物体进行计数。**MATLAB中已有函数可对二值化中的白色区域进行计数。[labeled,numObjects]=bwlabel(‘图像名’,8);运行后numObjects(即物体个数)的值会显示在右侧的工作区中。因此我们需要做的是对图像进行处理,包括二值化,除噪等。若直接将图像转化为二值图像进行计数,则无法得到正确数据。如clc;clo..._matlab特殊形状计数

推荐文章

热门文章

相关标签