使用Java代码访问Drools返回的事实对象

用户名

我有一个通过Guvnor控制台创建的流口水规则,如果满足条件,该规则将验证事实并将事实插入工作内存中。规则是:

    1. | rule "EligibilityCheck001" 
    2. |     dialect "mvel" 
    3. |     when 
    4. |         Eligibility( XXX== "XXX" , YYY== "YYY" , ZZZ== "ZZZ" , BBB == "BBB" ) 
    5. |     then 
    6. |         EligibilityInquiry fact0 = new EligibilityInquiry(); 
    7. |         fact0.setServiceName( "ABCD" ); 
    8. |         fact0.setMemberStatus( true ); 
    9. |         insert(fact0 ); 
   10. |         System.out.println( "Hello from Drools"); 
   11. | end 

执行规则的Java代码如下

RuleAgent ruleAgent = RuleAgent.newRuleAgent("/Guvnor.properties");
RuleBase ruleBase = ruleAgent.getRuleBase();
FactType factType = ruleBase.getFactType("mortgages.Eligibility");

Object obj = factType.newInstance();
factType.set(obj, "XXX", "XXX");
factType.set(obj, "YYY", "YYY");
factType.set(obj, "ZZZ", "XXX");
factType.set(obj, "BBB", "BBB");

WorkingMemory workingMemory = ruleBase.newStatefulSession();
workingMemory.insert(obj);
workingMemory.fireAllRules();
System.out.println("After drools execution");
long count = workingMemory.getFactCount();
System.out.println("count " + count);

一切看起来都很不错,输出如下:

Hello from Drools
After drools execution
count 2

我似乎找不到找到将EligibilityInquiry事实对象恢复到我的Java代码中并获取上述(serviceNamestatus规则中设置的属性的方法我已经使用了这种StatefulSession方法。

属性文件具有通过用户名和密码进行基本身份验证的快照链接。总共有2个事实:EligibilityInquiryEligibility

我对流口水是相当陌生的,对上述任何帮助都将受到赞赏。

异想天开

(注意:我固定了语句的顺序,即错字(“ XX”),并从输出中删除了注释。这不足为奇。)

此代码段假定EligibilityInquiry也在DRL中声明了该代码

FactType eligInqFactType = ruleBase.getFactType("mortgages", "EligibilityInquiry");
Class<?> eligInqClass = eligInqFactType.getFactClass();
ObjectFilter filter = new FilterByClass( eligInqClass );
Collection<Object> eligInqs = workingMemory.getObjects( filter );

过滤器是

public class FilterByClass implements ObjectFilter {
    private Class<?> theClass;
    public FilterByClass( Class<?> clazz ){
        theClass = clazz;
    }
    public boolean accept(Object object){
        return theClass.isInstance( object );
    } 
}

您可能还会使用query,它需要大约相同数量的代码。

// DRL code
query "eligInqs" 
    eligInq : EligibilityInquiry()
end

// after return from fireAllRules
QueryResults results = workingMemory.getQueryResults( "eligInqs" );
for ( QueryResultsRow row : results ) {
    Object eligInqObj = row.get( "eligInq" );
    System.out.println( eligInqClass.cast( eligInqObj ) );
}

或者,您可以调用workingMemory.getObjects()并迭代该集合并检查每个对象的类。

for( Object obj: workingMemory.getObjects() ){
    if( obj.isInstance( eligInqClass ) ){
        System.out.println( eligInqClass.cast( eligInqObj ) );
    }
}

或者,您可以(有或没有插入创建的EligibilityInquiry对象作为事实)将事实添加到中global java.util.List eligInqList并在Java代码中进行迭代。请注意,的APIStatefulKnowledgeSession是必需的(而不是WorkingMemory)。

   // Java - prior to fireAllRules
   StatefulKnowledgeSession kSession() = ruleBase.newStatefulSession();

   List<?> list = new ArrayList();
   kSession.setGlobal( "eligInqList", list );

   // DRL
   global java.util.List eligInqList;

   // in a rule
   then
       EligibilityInquiry fact0 = new EligibilityInquiry(); 
       fact0.setServiceName( "ABCD" ); 
       fact0.setMemberStatus( true ); 
       insert(fact0 );  
       eligInqList.add( fact0 ); 
   end

   // after return from fireAllRules
   for( Object elem: list ){
    System.out.println( eligInqClass.cast( elem ) );
   }

可能是致富的尴尬。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Java代码访问Drools返回的事实对象

来自分类Dev

JBoss Drools - 如何从 Java 获取数据(事实)到 DRL

来自分类Dev

Drools-使用事实类的嵌套规则

来自分类Dev

使用Drools Fusion计算滑动窗口中的事实数

来自分类Dev

使用Drools Fusion计算滑动窗口中的事实数

来自分类Dev

Java代码中不可访问的对象

来自分类Dev

在Angular中返回对象后无法访问代码

来自分类Dev

对于Drools中的任何事实,getFactHandle方法返回null

来自分类Dev

如何让Drools KnowledgeAgent检测事实?

来自分类Dev

Drools 与我的事实不符

来自分类Dev

访问从工厂返回的对象

来自分类Dev

访问从工厂返回的对象

来自分类Dev

(JNI)是Java代码返回的对象需要DeleteLocalRef吗?

来自分类Dev

使用W / React JS访问返回的Prom中的对象

来自分类Dev

如何使用javascript访问返回对象中的元素?

来自分类Dev

从主要范围(Scala)检索Drools事实

来自分类Dev

使用SWIG返回Java对象数组

来自分类Dev

如何使用Lambdas Java返回对象

来自分类Dev

访问ctypes返回的对象的方法

来自分类Dev

Java-访问对象

来自分类Dev

Java-访问对象

来自分类Dev

Drools为什么不使用Java 8?

来自分类Dev

如何访问列表中的事实

来自分类Dev

如何使用Java API获取CLIPS事实的字段数据?

来自分类Dev

使用for循环将代码转换为if,并将if内的自定义对象作为lambda的返回对象

来自分类Dev

序言:使用事实替换事实

来自分类Dev

从事实返回名称列表

来自分类Dev

使用对象访问指针

来自分类Dev

无法使用Java访问View对象的公共方法(Android)