问题描述
我在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,那么之后又问了哪个问题。一些问题也会从树中删除。我需要图像中描述的树状连接。有什么办法可以从流口水中得到这样的树吗?谢谢
解决方法
在您的DRL文件中,您可以访问名为drools
的变量。这是KnowledgeHelper
class的一个实例,它使您可以访问有关规则,环境,工作内存等的大量信息。该链接指向KnowledgeHelper
的源代码,因为{{ 3}}仅讨论最常用的方法(通常用于获取规则名称之类的东西。)
您可以从drools
变量访问documentation(链接到源代码),从而可以访问工作内存中的所有对象。您应该能够根据需要使用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只知道其工作记忆中的事实,而不知道它们是如何到达那里的。侦听器的工作方式是,它们自己挂接到insert
和delete
处理程序中,并在这些方法执行时触发。这些对象一旦插入,便与工作内存中的任何其他对象一样(也就是说,您无法区分它们是如何到达的。)