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;
}