2013-02-05 63 views
0

我有我試圖從Drools的生成配送對象的對象圖。具體地,配送對象代表一個規則,或者是滿足或不滿足。我的對象圖如下所示:Drools的對象圖規則定義

Users ---> many Requirements --> Event 
     `--> many Records  ----^ 

記錄能夠滿足要求,如果它們都指向同一事件。這會在Drools中生成一個Fulfillment對象。

一個減少停機規則產生應驗如下:

rule "fulfils" 
when 
    $u : User() 
    $rec : Record() from $u.records 
    $r : Requirement(event contains $rec.event) from $u.requirements 
then 
    insertLogical(new Fulfillment($u, $rec, $r, true)); 
    System.out.println("Inserting logical"); 
end 

rule "unfulfils" 
when 
    $u : User() 
    $rec : Record() from $u.records 
    $r : Requirement(event not contains $rec.event) from $u.requirements 
then 
    insertLogical(new Fulfillment($u, $rec, $r, false)); 
    System.out.println("Inserting logical"); 
end 

query "fulfillment" 
    $fulfillment : Fulfillment() 
end 

我碰到這裏的問題是,如果用戶沒有記錄,沒有插入的要求履行。我相信這是因爲沒有記錄()來搜索到滿足我的圖表。

是否有使用記錄,而不需要大於零存在的方法嗎?

而且,我需要在此兩個規則同時插入真假應驗還是有更好的方式來做到這一點?

編輯

我與這些規則所面臨的另一個問題是,如果Requirement(event contains $rec.event)任何記錄符合事件的定collection不完成尋找任務。是否有更好的方法來查找在多條記錄的單個事件與單個要求多個事件之間是否存在重疊?

另一個編輯

這裏的另一種方法,我沒想起來。除了插入應驗如果找不到要求/記錄對,爲什麼不insertLogical Fullfillments對於沒有匹配的正Fullfillment所有要求:

rule "unfulfils" 
when 
    $u : User() 
    $r : Requirement() from $u.requirements 
    not(Fulfillment(user == $u, requirement == $r, fulfilled == true)) 
then 
    insertLogical(new Fulfillment($u, null, $r, false)); 
    System.out.println("Inserting logical"); 
end 

query "fulfillment" 
    $fulfillment : Fulfillment() 
end 

這需要比較兩個集合的重疊問題的關心,以及用戶沒有記錄的情況。 (希望能對此進行一些驗證)。

回答

1

使用您的具體情況2條不同的規則,是一種常見的模式。它使您的規則庫更易於閱讀(並以一種維護方式)。 關於你提到的關於無記錄()的問題,我想你可以寫這樣的事情(如果我理解正確你的問題):

rule "unfulfils because of no Record" 
when 
    $u : User(records == null || records.empty == true) //A user without records 
    $r : Requirement() from $u.requirements // but with Requirements 
then 
    //You don't have a record to set in your Fulfillment object 
    insertLogical(new Fulfillment($u, $rec, null, false)); 
    System.out.println("Inserting logical"); 
end 
+0

這工作,謝謝。我的規則似乎有另一個問題..你能解決這個問題嗎? –