1. 程式人生 > >41、Drools語法篇之元資料

41、Drools語法篇之元資料

Declaring Metadata元資料可能會分配到幾個不同的結構在Drools:事實型別、屬性和規則。Drools使用符號(@)引入元資料,它總是使用表單:@metadata_key(metadata_value )有括號metadata_value是可選的。例如,如果你想宣告一個元資料屬性像author,其價值是bot,你可以簡單地寫:@author( Bob )Drools允許任意元資料屬性的宣告,但一些有特殊意義的引擎,而另一些人只是在執行時用於查詢。Drools允許宣告元資料的型別和屬性。任何元資料之前宣告的屬性型別分配給事實型別,而元資料後宣佈一個屬性被分配到特定的屬性
import java.util.Date
declare Person
    @author( Bob )
    @dateOfCreation( 01-Feb-2009 )
    name : String @key @maxLength( 30 )
    dateOfBirth : Date 
    address : Address
end
上面的例子中,有兩個元資料項宣告的型別,@author和 @dateOfCreation,和兩個名為@key和@maxLength,這裡,我們要注意的是 @key元資料 沒有要求值,所以() "括號" 和屬性值可以省略Predefined class level annotations預定義的類級別註釋有些註釋預定義的語義解釋的引擎。下面列出這些預定義的註釋和它們的含義。@role( <fact | event> )@role註釋定義引擎應如何處理該型別的例項:要麼是定期的事實或事件。它接受兩個可能的值:fact : 是預設的,是處理型別作為一個普通的fact。event : 是處理一個event 型別 event :事件
@typesafe( <boolean> )預設情況下所有型別宣告編譯啟用了型別安全;@typesafe(false)提供了一種方法來覆蓋這個行為通過允許一個備用,型別安全評估所有約束生成MVEL約束和動態執行。這一點非常重要,當處理集合,沒有泛型或混合型集合。@timestamp( <attribute name> )每個事件都有一個關聯的時間戳分配給它。預設情況下,對於一個給定的事件的時間戳從會話讀時鐘和分配給當時的事件事件插入到工作記憶。雖然,有時候,事件的時間戳作為自己的屬性。在這種情況下,使用者可能告訴引擎使用時間戳從事件的屬性而不是從會話讀時鐘。@duration( <attribute name> )
Drools既支援事件語義:時間點事件和基於間隔事件。一個時間點事件都被表示為一個基於間隔事件的持續時間為零。預設情況下,所有事件持續時間為零。使用者可能屬性不同的時間事件通過宣告屬性的事件型別包含事件的持續時間。@expires( <time interval> )事件可能會自動過期一段時間後,在工作記憶。通常出現這種情況時,基於現有的規則知識庫,事件可以不再匹配和啟用任何規則。雖然,可以顯式地定義事件時應該到期。@expires( <timeOffset> ) [#d][#h][#m][#s][#[ms]]例如:@expires( 1h35m )@propertyChangeSupportFacts實現支援屬性更改Javabean(tm)中定義的規範,現在可以進行註釋,這樣發動機本身註冊監聽變化事實屬性。 boolean,用於insert()方法在Drools 4 API是棄用,不存在drools-api模組。Predefined attribute level annotations預定義的屬性級註釋@position模式支援位置引數型別宣告。簡單的說明,就是該元資料起到的作用時標識,例如:
declare Person
    count : int @position(1)
    name:String @position(0)
end
在規則中的引用,正確的寫法是,Person p=newPerson("張三",10);如果這兩個兩個值的順序變了,也是會報錯的。所以,我們現在應該明白這個元資料的作用了吧,就是指定引數位置的宣告@key 用法比較簡單屬性將被用作一個關鍵識別符號的型別,所以,生成的類將實現equals()和hashCode()方法時考慮屬性比較這種型別的例項。Drools將生成一個建構函式使用所有關鍵屬性作為引數。我們通過例子來說明一下:
declare Person2
    count : int @key
    name:String
end
count:對於前面的示例,Drools將生成equals()和hashCode()方法,還會生成一個建構函式,我們就可以寫成
rule "3declare使用3"
    when
        eval(true)
    then
       Person2 p=new Person2(40 );
       insert(p);
end
Declaring Metadata for Existing Types現有型別的元資料Drools允許現有型別的元資料屬性的宣告一樣,當宣佈為新的事實型別元資料屬性。唯一的區別就是沒有欄位宣告那我們舉個例子說明一下:
import  com.jars1.jars1.Person;
declare  Person
      @author( Bob )
      @dateOfCreation( 01-Feb-2009 )
end 
declare  com.jars1.jars1.Person
      @author( Bob )
      @dateOfCreation( 01-Feb-2009 )
end

下面是小編的微信轉帳二維碼,小編再次謝謝讀者的支援,小編會更努力的

----請看下方↓↓↓↓↓↓↓

百度搜索 Drools從入門到精通:可下載開源全套Drools教程

深度Drools教程不段更新中:

更多Drools實戰陸續釋出中………

掃描下方二維碼關注公眾號 ↓↓↓↓↓↓↓↓↓↓