2013-04-08 101 views
0

是否可以將事實插入作爲通配符的Drools工作內存(例如對查詢的約束)?Drools查詢「通配符」

例如,假設我有以下規則:

rule "meal_exceptions_1" 
    agenda-group "MEAL" 
    salience 100 
    when 
     Meal(id = "Breakfast") 
     Person(name == "Sally") 
    then 
     insert(new Food("Jelly")); 
     drools.setFocus("OTHERGRP"); 
end 

rule "meal_breakfast" 
    agenda-group "MEAL" 
    when 
     Meal(id == "Breakfast") 
    then 
     insert(new Food("Cornflakes")); 
     drools.setFocus("OTHERGRP"); 
end 

rule "meal_dinner" 
    agenda-group "MEAL" 
    when 
     Meal(id == "Dinner") 
    then 
     insert(new Food("Fish Fingers")); 
     drools.setFocus("OTHERGRP"); 
end 

我要回答的問題是「什麼都可能被下令早餐可能食品」(也許我訂購的用品廚房)。

我可以很容易地插入一個事實new Meal("Breakfast")將結果限制爲僅適用於早餐的結果。但是,我的申請並不知道哪些人可能會要求例外,甚至不知道整個人是誰。我想添加另一個事實沿Person("*")的行,以便這將符合第一條規則,即使我不知道(或關心!),這是特別是薩利誰已經要求不同的食物。

期望的輸出是包含玉米片和果凍的工作記憶。是否有可能發佈這樣的查詢,而不具體瞭解潛在的例外情況?

回答

1

我不知道任何這樣的通配符,我有點懷疑它甚至有可能。 我不會問你爲什麼從Drools規則中插入事實,你可能有一些很好的理由,否則回到繪圖板。

因爲這些都是例外情況,所以處理這種情況的一種方法是在會話中註冊所有異常情況。在這個基本情況下,你只需要註冊Person(「Sally」),你會得到果凍和玉米片的清單。

作爲一種替代方案,您可以添加一個標記,例如Person.wildcard,並將您的LHS更改爲Person(name == "Sally" || wildcard)之類的內容,但這是一種交易,我懷疑自從您在規則中自行註冊事實以來,您是否願意進行交易。