java - 检索插入到 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,那么之后会问哪个问题。一些问题也将从树中删除。我需要图像中描述的连接树状。有什么办法可以从流口水中得到这样的树吗?谢谢
解决方案
在您的 DRL 文件中,您可以访问一个名为drools
. 这是KnowledgeHelper
类的一个实例,它使您可以访问有关规则、环境、工作内存等的大量信息。该链接指向 的源代码KnowledgeHelper
,因为文档仅讨论最常用的方法(通常用于获取规则名称之类的东西。)
从drools
变量中,您可以访问WorkingMemory
对象(链接到源),这使您可以访问工作内存中的所有对象。您应该能够根据需要使用iterateObjects
或iterateFactHandles
遍历工作记忆中的数据。
显然我不熟悉您的具体用例,因此您需要更新任何代码以匹配您的用例。但是,假设我想获取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 确实可以让您访问工作记忆和一般环境,但听众不在此范围内。Drools 只知道其工作记忆中的事实,而不知道它们是如何到达那里的。侦听器的工作方式是它们自己挂接到insert
和delete
处理程序,并在这些方法执行时触发;这些对象一旦插入,就与工作内存中的任何其他对象一样(也就是说,您无法区分它们是如何到达那里的。)
推荐阅读
- java - SonarQube FindBugs 分析器(使用 SpotBugs 3.1.0-RC6)不支持 JDK 11
- mysql - 如何在 MySQL 8 中使用空间索引而不会出错?
- python - URLError:引发异常时如何获取响应正文
- docker - Windows docker,在 winpty 命令行下指定命名卷导致包含无效字符问题
- machine-learning - 我们可以将 Keras 模型的准确度指标用于 Image Captioning 模型吗?
- python - 错误:无法找到 conda 二进制文件。Anaconda 安装了吗?
- android - Firestore 返回的文档较少
- windows - WinPE Windows 10 映像 - 在 BATCH 脚本中的“暂停”之后无法调用“wpeutil 重启”
- r - 创建这个数据框我做错了什么?
- sql - 需要为以下创建一个视图