2013-11-23 31 views
0

我意識到標題很瘋狂,但它確實是我能想到的最好的。如果有人有更好的建議,請留下評論,我會編輯。Drools約束對象不存在,其成員字段包含P以外的值

這個問題是一個後續的問題在這裏問:Drools Constraint object other than P is found in collection

對於那些不想單擊誰,該職位描述的解決方案,在其中你想知道這種情況是否存在的事實CustomType,其具有包含其他的值大於P. 這個問題最終是以下一個成員字段:

$c: CustomType() 
exists Object(this != objectP) from $c.collection 

上面的代碼工作很大。我的問題是,我想知道何時不存在具有此屬性的CustomType類型的對象。現在,因爲第2行依賴於第1行給出的綁定變量,所以我們不能簡單地用非操作符否定第1行。這樣做會引發運行時異常。以下是如何我直覺想編寫的代碼,但請記住,這是行不通的:

not $c: CustomType() 
exists Object(this != objectP) from $c.collection 

我不能簡單地否定線2條,因爲那麼該規則將需要至少一個對象的存在CustomType。我想知道第一個代碼示例何時不是這種情況。

我的內心流氓告訴我原來的解決方案可能有缺陷。理想情況下,我們希望在CustomType的括號()內表示第2行。這將表達更多的沿着「有一個CustomType屬性」的行,而不是「有一個CustomType,並有一個對象的屬性」。前者我們可以否定一個不是運營商,但我不知道如何處理後者。

回答

2

當你需要與他們的約束條件,如這些,需要在多條線路中表達,並否定工作,我想你走向世界的推理和真理的維護:

http://blog.athico.com/2010/01/drools-inference-and-truth-maintenance.html

即你的規則可以是這樣的:

rule "Determine presence of non-P objects" when 
    $c: CustomType() 
    exists Object(this != objectP) from $c.collection 
then 
    insertLogical(new ContainsNonP($c)); 
end 

rule "There are some non-P objects" when 
    $c: CustomType() 
    exists ContainsNonP(customType == $c) 
then 
    ... 
end 

rule "There are no non-P objects" when 
    $c: CustomType() 
    not exists ContainsNonP(customType == $c) 
then 
    ... 
end 

注意的是,如果第一條規則尚未啓動上述最後一條規則可激活。如果激活的順序對您的規則很重要,您可能希望定義一些顯着性。