2013-11-15 28 views
1

這篇文章表明,加入一些事實類作爲嵌套規則的方式嵌套規則。 http://drools.46999.n3.nabble.com/How-can-I-nested-rules-td4020488.html#a4020681Drools的 - 用事實類

我想知道 - 有沒有保證,「年齡和性別的女性」,「懷孕」和「懷孕」「Pregnant2」之前之前執行? 據我注意到,在我的應用程序中總是這樣。但是,它是否記錄在Drools文檔的某處,還是僅僅是等待崩潰的卡片房子?

rule "Age and gender women" 
    when 
     $p : Person(p1 >= 12 && p2 = 1) 
    then 
     insertLogical(new CouldHaveBeenPregnant($p)); 
end 

rule "Pregnant" 
    when 
     $p : Person(p3 > 1) 
     CouldHaveBeenPregnant(person == $p) 
    then 
     insertLogical(new HasBeenPregnant($p)); 
end 

rule "Pregnant2" 
    no-loop 
    when 
     $p : Person(p4 <= P3) 
     HasBeenPregnant(person == $p) 
    then 
     $p.setStatus("OK"); 
     update($p); 
end 

感謝您的幫助提前

編輯: 當我必須添加新的規則我的問題出現了,說:「沒有懷孕」,在那裏我必須做一些事情的時候人不在HasBeenPregnant (person == $ p)。推理原則有時並不奏效(如預期)。因爲有時候,「不懷孕」的規則會先被執行,然後事後證明這個人正在懷孕,即「懷孕」後來會變得真實。但「不懷孕」的結果已經運行。

因此,在任何建議如何克服呢?

+0

據我所知,其中的規則進行測試的順序不應該的問題。當插入(或刪除或更改)與某些其他規則相關的事實時,將再次測試這些規則。 –

回答

1

沒有秩序的保證,其中的規則進行評估時,他們所有的比賽。然而,在上面的例子中,訂單被迫以最好的方式。當與適當的屬性工作存儲器的人其實

的第一條規則將被激活。

第二個規則不會激活,直到工作記憶中有一個人這個事實被稱爲CouldHaveBeenPregnant,它引用該人。當規則1激活並插入它時,CouldHaveBeenPregnant僅在工作內存中。

同樣,第三條規則只會在有一個匹配屬性的人 hasBeenPregnant引用該人的事實時激活。 HasBeenPregnant事實只能由第二條規則插入。

即第3條不能激活,直到第2條後,無法啓動,直到規則1.

後,這就是被稱爲「推理」,並且是很好的規則設計的一個重要工具。馬克·普羅克特(Drools的鉛)寫了一篇很好的博客條目約在這裏:

http://blog.athico.com/2009/11/what-is-inference-and-how-does-it.html

+0

史蒂夫,你好,非常感謝你的回覆。這是我需要閱讀的文章。當我不得不添加一條新規則時,說「不懷孕」,當人不是HasBeenPregnant(person == $ p)時,我必須做些什麼。此推理規則有時無法正常工作(如預期)。那麼,關於如何克服這個問題的任何建議? – Anu

+0

它應該通常很好。我懷疑你的意外行爲可能是因爲HasBeenPregnant不在工作記憶中有兩個原因。首先是因爲患者從未懷孕過,而且當規則2尚未激活時。一種選擇是確保上述規則具有更高的「顯着性」,以確保它們首先被激活。另一種,可能是更安全的選擇可能是創建一個單獨的HasNeverBeenPregnant事實,編寫針對的是規則,而不是假設HasBeenPregnant不存在意味着同樣的事情。 – Steve

+0

謝謝史蒂夫。從日誌中,我看到這種行爲是因爲規則還沒有被激活。我喜歡第二個提議(因爲不想引入流量控制),但有時規則中的實際條件與「和」條件有很大的關聯。否定所有條件會使我的開發工作翻倍。另外,正如你所知道的,我們必須否定使用「OR」條件,並且如果不止一個條件成立,那麼它會不止一次運行規則的結果,這是不可取的。任何更好的方式做這個?分鐘×評論可能只能編輯5分鐘 – Anu

相關問題