我有我試圖從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
這需要比較兩個集合的重疊問題的關心,以及用戶沒有記錄的情況。 (希望能對此進行一些驗證)。
這工作,謝謝。我的規則似乎有另一個問題..你能解決這個問題嗎? –