【问题标题】:retrieving all rules inserted into drools session which are being printed in KieSession using drools query检索插入到 Drools 会话中的所有规则,这些规则正在使用 drools 查询在 KieSession 中打印
【发布时间】:2020-09-09 14:15:49
【问题描述】:

我在 drools 会话中插入了许多规则,并且我使用 KieSession 提供的事件侦听器将它们打印出来。代码如下:

  kSession.addEventListener(new RuleRuntimeEventListener() {
        @Override
        public void objectInserted(ObjectInsertedEvent event) {
            System.out.println("==> " + event.getObject() + " inserted");
        }

        @Override
        public void objectUpdated(ObjectUpdatedEvent event) {
            System.out.println("==> " + event.getObject() + " updated");

        }

        @Override
        public void objectDeleted(ObjectDeletedEvent event) {
            System.out.println("==> " + event.getOldObject() + " deleted");
        }
    });

我想获取在 objectInserted 中打印的所有规则,并且不是由使用 drools 查询的 objectDeleted 方法触发的。我没有找到一种方法来做到这一点。我不想使用 Java 而是 Drools。我是流口水的新手,在互联网上没有找到太多关于此的信息。任何帮助将非常感激。谢谢

我想做的事 我正在尝试编写一个查询,该查询返回我使用 drools 查询的 drool 会话中存在的所有值。 像这样:

query "Query all attack categories"
AttackCategory($category : value)
end

这是我已经在我的系统中使用的查询。我希望这个查询被泛化并只用一个查询来获取所有(不同类的)对象。

我的 KieBaseModel

     KieBaseModel kbaseModel = kmoduleModel
            .newKieBaseModel(DEFAULT_KIE_BASE_NAME)
            .setDefault(true)
            .setEqualsBehavior(EqualityBehaviorOption.EQUALITY)
            .setEventProcessingMode(EventProcessingOption.CLOUD);

要求更新 我可以从drolls 中获取对象,但是有什么方法可以得到图像中定义的树结构。我也想获得问题之间的链接。就像,如果问题 1 被回答了,那么在它之后会问哪个问题,如果问了 1 级 q1,那么之后会问哪个问题。一些问题也将从树中删除。我需要图像中描述的连接树状。有什么办法可以从流口水中得到这样的树吗?谢谢

【问题讨论】:

  • 您所说的“我不想使用 Java [做]”是什么意思——您在自己的示例中使用的是 Java。 ?
  • 是的。我正在使用java。我的意思是我想获取插入到会话中的规则,这些规则在会话结束时不会被删除,或者它达到我之前的条件,我想使用流口水查询来获取这些可用的值。我希望你能理解这个问题。
  • 如果你打算使用监听器——我就是这么做的——它仍然会用 Java 编写。您将需要展示一个示例来说明“在 Drools 中执行”的意思,因为我不知道您要的是什么。 (即使是说明您为什么要这样做的示例规则也可能会有所帮助。)
  • @RoddyoftheFrozenPeas 我已经更新了这个问题。请看一看。我想获取所有可用值,因为我想在用户结束回答问题时生成一个结构,并且在我将显示为树的结构中,我想向用户展示他遵循了哪条路径以及什么是最终结果。
  • 你在流模式下使用drools吗?这就是你引用持续行动的原因(例如回答后续问题?)

标签: java drools


【解决方案1】:

在您的 DRL 文件中,您可以访问名为 drools 的变量。这是KnowledgeHelper class 的一个实例,它使您可以访问有关规则、环境、工作内存等的大量信息。链接是KnowledgeHelper 的源代码,因为documentation 只讨论了最常用的方法(通常用于获取规则名称等内容。)

drools 变量,您可以访问WorkingMemory object(链接到源代码),这使您可以访问工作内存中的所有对象。您应该可以根据需要使用iterateObjectsiterateFactHandles 在工作内存中遍历数据。

显然我不熟悉您的具体用例,因此您需要更新任何代码以匹配您的用例。但是,假设我想获取 WorkingMemory 中剩余的所有 AttackCategory 实例,我可能会这样做:

drools.getWorkingMemory()
      .iterateObjects(new ObjectFilter() {
          @Override
          public boolean accept(Object object) {
            return object instanceOf AttackCategory;
          }
       ) // now you have an instance of Iterator<? extends AttackCategory>

如果您希望迭代事实句柄,也可以用iterateFactHandles 替换iterateObjects

请注意,这些迭代器不是线程安全的。

您也可以在 Java 中执行此操作并从 DRL 调用此类实用程序方法,但您表示您更愿意在 Drools 本身中执行此操作。不幸的是,虽然 drools 确实可以让您访问工作记忆和一般环境,但听众不在此范围内。 Drools 只知道其工作记忆中的事实,而不知道它们是如何到达那里的。侦听器的工作方式是它们自己钩入insertdelete 处理程序,并在这些方法执行时触发;这些对象一旦插入,就与工作内存中的任何其他对象一样(也就是说,您无法区分它们是如何到达那里的。)

【讨论】:

  • 感谢您的详细回答。我会试试这个方法。
  • 请看问题。我已经更新了一些东西。谢谢
  • 您现在已将问题更改为完全不同的问题。不,你不能得到树结构。
  • 我们将其视为决策树。我们想知道哪个父母生了哪个孩子。是否可以使用 Java 或 Drools 或使用 Java 中的某些侦听器?
  • Java 具有树形数据结构,可以使用这些数据结构并根据需要进行填充。不过,这与您提出的问题并不真正相关,即如何从内存中获取对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
相关资源
最近更新 更多