我应该根据哪个数据对象创建 Drools/Kie 会话?

Per which data object should I create my Drools/Kie session?

我有以下 POJO:

public class Transaction {

    @Id
    private long id;

    private String organisationId;

    private String resposibleName;

    private DateTime transactionTime;

    private BigDecimal amount;

    ...

}

我想应用我的规则。例如,一个示例规则可能是关于它的数量:

rule "SampleRule"
    when
        $transaction : Transaction( amount > 10)
    then
        $transaction.setStatus(Status.INVALID);
end

我还想应用一些更复杂的规则,例如:

  1. WHEN上周(基于transactionTimeorganisationId的Transactions per amount字段之和大于x,THEN $transaction.setStatus(Status.INVALID);
  2. WHEN 有一项过去的交易与正在评估的当前交易具有相同 responsibleName,但与当前交易不同 organisationIdTHEN $transaction.setStatus(Status.INVALID);

当对 RESTful 端点进行查询时:

  1. 我正在创建一个新的 KieSession
  2. 将单个 Transaction 对象添加到会话中,
  3. 添加可能与具有不同 POJO 的当前对象相关的更多事务对象(例如,说 PastTransaction 作为具有与 Transaction 相同字段的精确副本,我正在添加多个事务通过与 PastTransaction POJO 相同的 organisationId,这样我就可以在这些字段上累积金额字段,同时能够在我的 Transaction 对象上应用更多基本规则。
  4. 以同样的方式,我将由同一个 responsibleNameResponsibleNameTransaction POJO 进行的所有交易相加,并编写一个规则来检查其中是否有任何不等于那个我在 KieSession.
  5. 中的单个 Transaction 对象

我想知道是否有一种 easier/more 最佳方法来实现我一直在做的事情,并针对我正在为哪个实体组建 KieSession 进行优化。我已经为我的 Transaction POJO 编写方法并在规则执行中命中数据库(例如编写一个方法 getAllTransactionsByTheResponsibleName 其中 returns 一个列表,然后检查是否有一个对象具有不同的 organisationId).以同样的方式,我可以将相关事务作为列表添加到 KieSession,然后在规则中查询列表,这至少可以避免我在不同名称下使用相同的 POJO。

更新:

根据评论进一步阐述,在工作内存中保留大约十亿 Transaction 秒(所有事务的会话)是否可行?或者,我可以将每个 responsible/organisation 的交易放入 KieSession(每个 responsible/organisation 的会话)。那么当会话中有多个事务时,我如何仅在正在评估的最新事务的字段上应用一些规则(或者甚至在其上设置一个字段)(例如 $transaction.setStatus(Status.INVALID); 当 #1 为真时,$transaction 是当前评估的那个)?

可能无法让您的 non-techies 完全独立地嬉戏。全面讨论您可能需要添加的内容需要全面了解所有规则,而我不具备这些知识。但是,即使有数十亿个交易通过您的工作内存,您 Q 中的 #1 和 #2 也可以处理。

用例 1:检查时间范围内每个帐户的阈值可以通过为每个帐户保留一个辅助事实 ("AccountSums") 和 n 个每日总和来完成。对于任何新的交易,要么更新最后的总和,要么 "shift" 总和加上 0 总和并设置最后的总和,或者创建新的 AccountSums;维护最后 n 笔总和-技术人员可以仅根据 AccountSums(或结合(最后)匹配交易)编写支票。

rule "check 7 days limit"
when
    $t: Transaction( $orgId: organisationId,
                     $transT: transactionTime,
                     amount > 0, status == Status.VALID )
    AccountSums( organisationId == $orgId,
                 lastTransactionTime == $transT,
                 runningWeeklySum > 1000000 )
then
    modify( $t ){ setStatus( Status.INVALId ) }
end

rule "create AccountSums"
when
    $t: Transaction( $orgId: organisationId,
                     amount > 0 )
    not AccountSums( organisationId == $orgId )
then
    insert( new AccountSums( $orgId ) );
end 

对于 "shifting" 总和等,您至少需要一条附加规则。

用例 2:维护一个辅助事实 ("NameId"),实例包含负责名称和 organizationId(或包含 Map 的单个实例。)如果另一个事务到达,则创建一个新的 NameId(或 Map 条目),或比较相等和不相等的 Id。

如果您的数据量如您所说,则必须压缩历史记录。或许可以让研究人员编写简单的评估规则,但按照我在此处概述的思路设计规则模式至少是为了压缩 meta-data,而不是你可以留给麻瓜的事情。