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

问题描述

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

str="dog cat cat dog"
pattern="abba"
wordPattern(pattern,str)```



Output:
dog cat cat dog
dog cat cat dog
False

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

要做什么 我正在尝试编写一个查询,以使用drools查询返回在drool会话中存在的所有值。 像这样的东西:

  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");
        }
    });

这是我已经在系统中使用的查询。我希望对此查询进行泛化,并仅通过单个查询获取所有(不同类的)对象。

我的KieBaseModel

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

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

tree structure

解决方法

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

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

很显然,我不熟悉您的特定用例,因此您需要更新任何代码以匹配您的用例。但是,假设我想让所有AttackCategory个实例保留在WorkingMemory中,我可能会这样做:

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只知道其工作记忆中的事实,而不知道它们是如何到达那里的。侦听器的工作方式是,它们自己挂接到insertdelete处理程序中,并在这些方法执行时触发。这些对象一旦插入,便与工作内存中的任何其他对象一样(也就是说,您无法区分它们是如何到达的。)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...