从工作记忆中检索特定类型的事实

时间:2013-02-22 23:51:05

标签: drools drools-fusion

而不是检索所有事实,我需要从工作记忆中检索特定类型的事实。

我了解到我可以从工作记忆中检索所有事实,如下所示。

drools.getWorkingMemory().getWorkingMemoryEntryPoint("Stream").getObjects();

请提供一些指示,以便从工作记忆中检索特定类型的对象。

2 个答案:

答案 0 :(得分:7)

您可以使用查询,而不是使用getObjects()方法。查询就像没有RHS的规则:

query "getObjectsOfClassA"
    $result: ClassA()
end

您可以在查询中使用DRL语言的所有功能来创建非常复杂的匹配模式。您甚至可以将参数传递给查询:http://docs.jboss.org/drools/release/5.5.0.Final/drools-expert-docs/html_single/#d0e7632

然后,在您的java代码中,您可以使用:

调用您的查询
QueryResults results = ksession.getQueryResults( "getObjectsOfClassA" ); 
for ( QueryResultsRow row : results ) {
    ClassA classA = ( ClassA ) row.get( "$result" ); //you can retrieve all the bounded variables here
    //do whatever you want with classA
}

如果您需要所有ClassA的集合,您可以在查询中使用累积函数。

希望它有所帮助,

答案 1 :(得分:6)

您可以使用ObjectFilter

Collection<Object> myfacts = session.getObjects( new ClassObjectFilter(MyFact.class) );

不幸的是,在Drools 5.5.0 Final中,生成的集合包含的方法并没有按预期工作。通常,如果搜索的对象等于集合中的某些内容,则contains方法返回true,但Drool的集合只查找具有相同引用的对象(它使用==来比较对象)