0

我想从嵌套集合中创建事实集合,其中事实不与工作内存中的另一个事实共享属性。

假设我有一个 Person 类,其中包含一组 Address 对象。我想要来自 Person John 的所有 Address 事实的集合,这些事实与当前工作内存中的 Address 事实具有相同的邮政编码。

我认为这样做的唯一方法是使用“来自累积”,但我无法弄清楚如何在源模式行中添加额外的条件。当我尝试以下操作时,出现规则编译错误:

when
    p:   Person(name == "John")
    h:   HashSet(size > 0) from accumulate (addr: Address(zc: zipcode) from p.addresses /*and not Address(zipcode == zc)*/, 
                                            init(Set s = new HashSet();)
                                            action(s.add(addr);),
                                            result(s) 
                                           )    

我需要一次在“then”子句中迭代最终集合的内容;否则,我会将源模式和“非”检查从“来自累积”中移出,并完全取消“来自累积”。

有什么办法可以做我所描述的吗?提前致谢。

4

2 回答 2

0

由于无法将“即时”事实$person.address与 WM 网络中的适当事实结合起来,您将不得不求助于 Java。

when
$person: Person(name == "John")
$except: HashSet from collect Address()
hashset: HashSet(size > 0)
            from accumulate (addr: Address() from $person.addresses, 
               init(Set s = new HashSet();)
               action( if( ! $except.contains(addr) ){
                         s.add(addr);
                       } ),
               result(s) )

如果 Person 的 Address 组件也是正确的事实,那么所有这些都不是必需的。根据 DB 设计中的 Normal Forms 的数据模型也更适合 Drools。

编辑如果您只需要跳过具有特定邮政编码的地址,请累积邮政编码集。

when
$person: Person(name == "John")
accumulate( Address($zip: zipcode); $except: collectSet($zip) )
hashset: HashSet(size > 0)
            from accumulate ($addr: Address( $zx: zipcode) from $person.addresses, 
               init(Set s = new HashSet();)
               action( if( ! $except.contains( $zx ) ){
                         s.add( $addr );
                       } ),
               result(s) )
于 2016-02-05T05:30:58.837 回答
0

如果您要比较的地址在您的会话中已经是一个事实(并且您在会话中有一个或者您有一种唯一标识它的方法),那么您可以尝试这样的事情:

rule "Test"
    $p: Person(name == "John")
    $a: Address()
    $s: Set( size > 0 ) from collect (
        Address(zipcode != $a.zipcode) from $p.getAdresses()
    )
then
    //The Set $s contains all the addresses from John having
    //a different zipcode than the Address in your working memory. 
end

希望能帮助到你,

于 2016-02-05T07:10:37.593 回答