首页 > 解决方案 > 检索插入到 Drools 会话中的所有规则,这些规则正在使用 drools 查询在 KieSession 中打印

问题描述

我在 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,那么之后会问哪个问题。一些问题也将从树中删除。我需要图像中描述的连接树状。有什么办法可以从流口水中得到这样的树吗?谢谢

树状结构

标签: javadrools

解决方案


在您的 DRL 文件中,您可以访问一个名为drools. 这是KnowledgeHelper的一个实例,它使您可以访问有关规则、环境、工作内存等的大量信息。该链接指向 的源代码KnowledgeHelper,因为文档仅讨论最常用的方法(通常用于获取规则名称之类的东西。)

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

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

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

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

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

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


推荐阅读