使用 drools 查询检索插入到 drools 会话中的所有规则,这些规则正在 KieSession 中打印

retrieving all rules inserted into drools session which are being printed in KieSession using drools query

我在 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。我是流口水的新手,并没有在互联网上找到太多关于这个的信息。任何帮助将非常感激。谢谢

我想做什么 我正在尝试编写一个查询,该查询 returns 我使用 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 中获取对象,但是有什么方法可以获取图像中定义的树结构。我也想在问题之间得到一个 link。就像,如果回答了问题 1,那么在它之后问了哪个问题,如果问了 1 级 q1,那么在之后问了哪个问题。一些问题也将从树中删除。我需要图像中描述的连接树状。有什么办法可以从drools得到这样一棵树吗?谢谢

在您的 DRL 文件中,您可以访问名为 drools 的变量。这是一个实例 KnowledgeHelper class, which gives you access to a bunch of information about the rules, environment, working memory, etc. The link is to the source code for KnowledgeHelper, since the documentation 只讨论最常用的方法(通常用于获取规则名称之类的东西。)

drools 变量,您可以访问 WorkingMemory object(link 来源),这使您可以访问工作内存中的所有对象。您应该能够根据需要使用 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 处理程序,并在这些方法执行时触发;这些对象一旦插入,就像工作内存中的任何其他对象一样(也就是说,您无法区分它们是如何到达那里的。)