Java 从drools的有状态会话获取事实
我试图从规则中获取新插入的事实:Java 从drools的有状态会话获取事实,java,drools,Java,Drools,我试图从规则中获取新插入的事实: import com.neu.als.thesis.db.beans.FLTBean import com.neu.als.thesis.db.beans.StudentBean rule "Excellent" no-loop when $m: FLTBean ( listeningScore > 85 && listeningScore < 101 ) then Stud
import com.neu.als.thesis.db.beans.FLTBean
import com.neu.als.thesis.db.beans.StudentBean
rule "Excellent"
no-loop
when
$m: FLTBean ( listeningScore > 85 && listeningScore < 101 )
then
StudentBean studentBean = new StudentBean();
studentBean.setKnowledgeLevel( "Excellent" );
insert( studentBean );
end
调用processFacts方法的是
public String evaluateConceptKnowledgeLevel( double FLTmark )
{
String knowledgeLevel = null;
// test
InferenceEngine ie = new InferenceEngine();
KnowledgeBase kbase;
try
{
kbase = ie.readKnowledgeBase( "KnowledgeLevel.drl" );
FLTBean bean = new FLTBean();
bean.setListeningScore( FLTmark );
ie.processFacts( kbase, bean );
}
catch( Exception e )
{
e.printStackTrace();
}
// up to here
return knowledgeLevel;
}
有几个选择
传入简单名称而不是完整的类名
改变
Collection<Object> result = findFacts( ksession, "com.neu.als.thesis.db.beans.StudentBean" );
public boolean accept( Object object ) {
return object.getClass().getSimpleName().equals( factClass );
}
protected Collection<Object> findFacts(
final StatefulKnowledgeSession session,
final String factClass ) {
ObjectFilter filter = new ObjectFilter() {
@Override
public boolean accept( Object object ) {
return object.getClass().getSimpleName().equals( factClass );
}
};
Collection<Object> results = session.getObjects( filter );
return results;
}
到
更改findFacts方法,将实际类作为参数并与之进行比较
改变
Collection<Object> result = findFacts( ksession, "com.neu.als.thesis.db.beans.StudentBean" );
public boolean accept( Object object ) {
return object.getClass().getSimpleName().equals( factClass );
}
protected Collection<Object> findFacts(
final StatefulKnowledgeSession session,
final String factClass ) {
ObjectFilter filter = new ObjectFilter() {
@Override
public boolean accept( Object object ) {
return object.getClass().getSimpleName().equals( factClass );
}
};
Collection<Object> results = session.getObjects( filter );
return results;
}
受保护的集合findFacts(
最后一次StatefulKnowledgeSession,
最终字符串(类){
ObjectFilter筛选器=新建ObjectFilter(){
@凌驾
公共布尔接受(对象){
返回object.getClass().getSimpleName().equals(factClass);
}
};
收集结果=session.getObjects(过滤器);
返回结果;
}
到
受保护的集合findFacts(
最后一次StatefulKnowledgeSession,
最后一节课(第二节课){
ObjectFilter筛选器=新建ObjectFilter(){
@凌驾
公共布尔接受(对象){
返回object.getClass().equals(factClass);
}
};
收集结果=session.getObjects(过滤器);
返回结果;
}
假设您的事实都是Java类,那么比较类的第三个选项是更好的选项。如果您使用声明的类型,那么简单的名称很有用,因为您不太可能引用Drools生成的实际类
当您测试这些东西时,Drools API还提供了session.getObjects()方法,该方法没有参数。通过打电话,你将得到工作记忆中所有事实的参考,无论它们是什么。编写筛选器时,最好使用它来向自己证明预期事实在工作内存中,然后添加筛选器,这样您就可以根据它们的类和属性来选择特定事实。要么
结果
为空,要么从未调用该方法。假设是第一个,您在规则中使用此值studentBean.getKnowledgeLevel()
在FactFactFacts()
中尝试了什么调试?@clwhisk I S.O.P,并且打印良好。我也确信规则之所以被调用是因为这个。我还尝试在findFacts
方法中打印参数,它也有值。有什么想法吗?你指的是哪些参数?我唯一想说的是,如果findFacts
的返回值是一个空列表,这应该会准确地指出在该方法中查找的位置。@clwhisk我想我的错误是如何打印事实。我所说的参数是findFacts
方法的参数。我更新了我的帖子。我将session.getObject()
打印到findFacts
方法,结果是org.drools.impl.StatefulKnowledgeSessionImpl$ObjectStoreWrapper@f886d9
这意味着会话中有一个对象,对吗?但是,当我从另一个方法调用它时,它的循环与我上面发布的相同,对象没有响应代码>以获取值。但是我怎样才能从那里得到bean呢?session.getObjects()没有过滤器,它提供了工作内存中所有对象的列表,包括您的规则插入的对象。如果使用ObjectFilter参数,则返回的对象列表必须与ObjectFilter的accept(object)方法中的内容匹配。如果您的bean与您在对象过滤器中设置的约束相匹配,那么它将被返回代码>Bean已经在结果中了
对吗?我的问题是我到底要如何从那里得到它?集合没有.get()
。我尝试将它转换为集合
,但仍然没有成功
public boolean accept( Object object ) {
return object.getClass().getName().equals( factClass );
}
protected Collection<Object> findFacts(
final StatefulKnowledgeSession session,
final String factClass ) {
ObjectFilter filter = new ObjectFilter() {
@Override
public boolean accept( Object object ) {
return object.getClass().getSimpleName().equals( factClass );
}
};
Collection<Object> results = session.getObjects( filter );
return results;
}
protected Collection<Object> findFacts(
final StatefulKnowledgeSession session,
final Class factClass ) {
ObjectFilter filter = new ObjectFilter() {
@Override
public boolean accept( Object object ) {
return object.getClass().equals( factClass );
}
};
Collection<Object> results = session.getObjects( filter );
return results;
}