繁体   English   中英

在流口水中坚持知识会议

[英]Persisting Knowledge Session in Drools

目标:我想继续/重复使用曾经创建过的流口水知识会议,以再次激发规则。

问题:我想使用具有超过一万条规则的决策表来创建知识会话。 创建此会话并每次都将其丢弃是不可行的,我想存储一次创建的会话,该会话可以通过密钥进行标识,然后一次又一次地重复使用该会话。 我已经尝试过Drools的jpa知识服务和kie的编组,但是两者都不起作用。 它需要一个Knowledgebase实例,并且每次用drools表创建一个新的Knowledgebase实例对于我的用例来说都是不理想的,因为这需要花费很多时间。 如何存储创建的知识库ID,并在以后使用它检索该知识库? 或者如何在没有kbase信息的情况下持久保存kSession?

编辑 :我们有一组规则,我们需要将当前数据与旧数据集进行比较,以确定新数据的参数值。
旧数据集非常庞大,并且每月仅更改一次。 当前,我们要解决的方法是对旧数据中的每一行都有一个规则。 这加载起来非常慢,我们必须对请求执行一次,然后针对当前数据集中的每个条目迭代触发规则。 您提供的解决方案有效。 所以现在,我不必一次又一次地加载,这解决了我的目的。 但是,如果我考虑一下,它似乎并不是最好的解决方案。
我正在尝试的另一种方法是,将旧数据集作为事实插入会话中,然后持久保存该会话。 下次加载会话时,我将拥有可用的事实,并且可以使用它来激发规则。 您认为这种方法更好吗? 还有其他建议吗?

快速启动的一种好方法是将KieBase保存到文件并在需要时读取它。

    KieBase kieBase = kieContainer.getKieBase();
    FileOutputStream fos1 = new FileOutputStream( KBPATH );
    ObjectOutputStream oos1 = new ObjectOutputStream( fos1 );
    oos1.writeObject( kieBase );
    oos1.close();

    FileInputStream fis9 = new FileInputStream( KBPATH );
    ObjectInputStream ois9 = new ObjectInputStream( fis9 );
    KieBase kieBase = (KieBase)ois9.readObject();
    KieSession kieSession = kieBase.newKieSession();

(但是,使用10,000条规则的决策表似乎并不是使用Drools的正确方法。不仅编译可能很慢-插入时如何执行?)

稍后根据您添加到问题中的简单情况,我建议将行数据作为事实插入,然后使用一条规则

rule "update discount"
when
  $op: OldPerson( $oloc: location, $oage: age, $odis: discount )
  $np: NewPerson( location == $oloc, age == $oage, discount != $odis )
then
  modify( $np ){ setDiscount( $odis ) }
end

不值得坚持什么; 为新老人们使用任何文件格式; 可能甚至不值得压缩。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM