drools規則語言指南(一)

簡介:

DRL (Drools Rule Language)是drools規則語言的簡稱,在使用drools規則引擎的時候,咱們常常把寫好的規則放在.drl文件中,而後規則引擎再去加載規則,那麼一個drl文件基本組成是什麼樣子的呢?繼續向下看:java

drools規則文件的組成

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

下圖是一個規則文件幾個元素通常順序:
file
package: drools中的package和java中的package語法同樣,一個DRL文件只能有一個package並且必須是在第一個行,其餘的元素均可以包含一個或多個,可是規則名稱要惟一。
例如:session

package com.cn.somepackage;

package後面的「;」是可選項,任何的規則屬性均可以定義在包級別,這樣就會成爲規則的默認屬性,同時若是在規則上從新設置屬性,也會覆蓋規則的默認屬性 。
import:app

file

相似於java中的import語句,用於導入相關要使用的類或對象,格式是packageName.objectName,多個import語句用多行分割,Drools引擎會自動導入和相同package下的類和java.lang.下的類。
例如:函數

import org.mortgages.LoanApplication;

function:spa

function的結構以下:code

file

function的定義是放在drl規則文件中而不是java類中,定義了function在後面的規則中就能夠調用了;除此以外,也能夠在外面的java類中定義一個靜態方法,再導入到drl文件中;例如:對象

  • 在drl文件中直接定義
function String hello(String applicantName) {
    return "Hello " + applicantName + "!";
}

rule "Using a function"
  when
    // Empty
  then
    System.out.println( hello( "James" ) );
end
  • 導入外部static方法
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

  • 在drl文件中定義query
query "people under the age of 21"
    $person : Person( age < 21 )
end
  • 在java代碼中調用
QueryResults results = ksession.getQueryResults( "people under the age of 21" );
System.out.println( "we have " + results.size() + " people under the age  of 21" );
相關文章
相關標籤/搜索