DRL (Drools Rule Language)是drools规则语言的简称,在使用drools规则引擎的时候,咱们常常把写好的规则放在.drl文件中,而后规则引擎再去加载规则,那么一个drl文件基本组成是什么样子的呢?继续向下看:java
package //包名 import //导入的哪些类 function // 可选,定义的函数 query // 可选,定义的查询 declare //可选, 声明 global // 可选,定义的全局变量 rule "规则名1" // 属性 when // 条件 then // 符合条件后执行的动做 end rule "rule2 name" ...
下面的一段示例DRL规则(注意这个例子只是一个规则,而不是整个规则文件的内容,全部它没有写出package,import)定义了在一个贷款决策服务中对年龄条件的限制:segmentfault
rule "Underage" salience 15 agenda-group "applicationGroup" when $application : LoanApplication() Applicant( age < 21 ) then $application.setApproved( false ); $application.setExplanation( "Underage" ); end
下图是一个规则文件几个元素通常顺序:
package: drools中的package和java中的package语法同样,一个DRL文件只能有一个package并且必须是在第一个行,其余的元素均可以包含一个或多个,可是规则名称要惟一。
例如:session
package com.cn.somepackage;
package后面的“;”是可选项,任何的规则属性均可以定义在包级别,这样就会成为规则的默认属性,同时若是在规则上从新设置属性,也会覆盖规则的默认属性 。
import:app
相似于java中的import语句,用于导入相关要使用的类或对象,格式是packageName.objectName,多个import语句用多行分割,Drools引擎会自动导入和相同package下的类和java.lang.下的类。
例如:函数
import org.mortgages.LoanApplication;
function:spa
function的结构以下:code
function的定义是放在drl规则文件中而不是java类中,定义了function在后面的规则中就能够调用了;除此以外,也能够在外面的java类中定义一个静态方法,再导入到drl文件中;例如:对象
function String hello(String applicantName) { return "Hello " + applicantName + "!"; } rule "Using a function" when // Empty then System.out.println( hello( "James" ) ); end
import function my.package.applicant.hello; rule "Using a function" when // Empty then System.out.println( hello( "James" ) ); end
query:
query语句在drl文件中是用来从drools引擎的working memory中查询出相关的facts。在drl文件中定义query语句,在java代码中调用就能够获取到查询的结果。经过:ksession.getQueryResults("name")返回一个QueryResults ,name是查询的名称,这个name要在整个kbase中是惟一的。例如:blog
query "people under the age of 21" $person : Person( age < 21 ) end
QueryResults results = ksession.getQueryResults( "people under the age of 21" ); System.out.println( "we have " + results.size() + " people under the age of 21" );