使用 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 来源),这使您可以访问工作内存中的所有对象。您应该能够根据需要使用 iterateObjects
或 iterateFactHandles
在工作内存中遍历数据。
显然我不熟悉您的具体用例,因此您需要更新所有代码以匹配您的用例。但是假设我想获得 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 只知道其工作记忆中的事实,但不知道它们是如何到达那里的。侦听器的工作方式是它们自己连接到 insert
和 delete
处理程序,并在这些方法执行时触发;这些对象一旦插入,就像工作内存中的任何其他对象一样(也就是说,您无法区分它们是如何到达那里的。)
我在 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 来源),这使您可以访问工作内存中的所有对象。您应该能够根据需要使用 iterateObjects
或 iterateFactHandles
在工作内存中遍历数据。
显然我不熟悉您的具体用例,因此您需要更新所有代码以匹配您的用例。但是假设我想获得 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 只知道其工作记忆中的事实,但不知道它们是如何到达那里的。侦听器的工作方式是它们自己连接到 insert
和 delete
处理程序,并在这些方法执行时触发;这些对象一旦插入,就像工作内存中的任何其他对象一样(也就是说,您无法区分它们是如何到达那里的。)