0

ファクトが作業メモリ内の別のファクトとプロパティを共有しない、ネストされたコレクションからファクトのコレクションを作成したいと考えています。

Address オブジェクトのコレクションを持つ Person クラスがあるとします。現在作業メモリ内にある Address ファクトと同じ郵便番号を持たないPerson John からのすべての Address ファクトのセットが必要です。

これを行う唯一の方法は「fromアキュムレート」を使用することだと考えていますが、ソースパターン行に追加条件を追加する方法がわかりません。以下を試すと、ルールのコンパイル エラーが発生します。

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」句で反復するには、最終コレクションの内容を一度にすべて取得する必要があります。それ以外の場合は、ソース パターンを移動し、「not」チェック アウトを「からの蓄積」から除外し、「からの蓄積」を完全に廃止します。

私が説明していることを行う方法はありますか?前もって感謝します。

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 設計の正規形に従ったデータ モデルは、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 に答える