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" );