【问题标题】:Persisting Knowledge Session in Drools在 Drools 中持久化知识会话
【发布时间】:2016-03-17 07:46:25
【问题描述】:

目标:我想持久化/重用一个创建后的 drools 知识会话以再次触发规则。

问题:我想使用包含超过 1 万条规则的决策表创建一个知识会话。创建此会话并每次都将其处理掉是不可行的,我想存储创建后的会话,该会话可以通过密钥识别并一次又一次地重复使用此会话。 我已经尝试过 drools 的 jpa 知识服务和 kie 的编组,但两者都没有奏效。它需要一个知识库实例,并且每次都使用 drools 表创建一个新的知识库实例对于我的用例来说是不可取的,因为这需要相当长的时间。如何存储创建的知识库的 id 并在以后使用它来检索这个库?或者如何在没有 kbase 信息的情况下持久化我的 kSession?

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

【问题讨论】:

  • 我需要一些样本数据和更多细节。 - 一旦有一个 DT 来确定基于 4 或 5 个字段的保险费率,在几个步骤中改变值,执行所有组合以测试与一个特定集合的相等性。导致 (IIRC) 50,000 行 - 太慢了。将数据作为事实插入确实是解决方案。而且我认为您不必用这些事实来组织会议。从您拥有的任何形式(Object*Stream 甚至 XML)解组它们应该足够快,因为针对少量规则的插入不应该很慢。
  • 场景是我们有三个字段,假设字段是位置、年龄和折扣。这占了大约 5 万行旧数据。现在,如果我们的新数据的位置和年龄与之前的值匹配,我们将新数据的折扣设置为旧数据的折扣。为此,我需要将新数据的每个条目与旧数据列表进行比较,并相应地设置折扣。你建议我怎么做?如果您需要更多信息,请告诉我。
  • 这与我描述的场景非常相似。执行时间取决于您将 50,000 个对象的数据放入内存的速度,即 i/o 时间。 50000 次插入和 1000 次发射太快了,不值得计时。
  • 我尝试插入多个事实,它对我有用。该过程相对超快,并且无需持久会话即可实现。谢谢!

标签: jpa persistence marshalling drools unmarshalling


【解决方案1】:

快速启动的一个好方法是将 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

不值得坚持任何东西;为新老用户使用任何文件格式;可能甚至不值得拉链。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 2015-11-30
    • 1970-01-01
    • 2014-10-03
    • 2017-05-05
    • 1970-01-01
    相关资源
    最近更新 更多