【问题标题】:Comparing two instances of same objects in Drools比较 Drools 中相同对象的两个实例
【发布时间】:2014-10-17 05:12:21
【问题描述】:

我有一个模型对象 Account

package com.drool.model;

import java.util.Date;

public class Acccount {

    private int id;
    private int balance;
    private Date transDate;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getBalance() {
        return balance;
    }
    public void setBalance(int balance) {
        this.balance = balance;
    }
    public Date getTransDate() {
        return transDate;
    }
    public void setTransDate(Date transDate) {
        this.transDate = transDate;
    }



}

流口水规则

import com.drool.model.Acccount

rule "accountTransaction"
when
$first : Acccount()
$second : Acccount( this != $first, transDate==$first.transDate )
then
System.out.println("second Accounbt had latest transaction");
end

测试应用代码:

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("HelloWorld.drl"), ResourceType.DRL);
KnowledgeBase kbase = kbuilder.newKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
Acccount account = new Acccount();
account.setBalance(1000000);
account.setId(123);
account.setTransDate(new Date());
Acccount account1 = new Acccount();
account1.setBalance(200);
account1.setId(1234);
account1.setTransDate(new Date());
ksession.insert(account);
ksession.insert(account1);
ksession.fireAllRules();

输出:

second Accounbt had latest transaction
second Accounbt had latest transaction

我是流口水的新手,当我运行上面的示例时。结果被打印两次,理想情况下应该只打印一次。请让我知道我的规则是否正确?

【问题讨论】:

    标签: java drools rule-engine


    【解决方案1】:

    一对像这样的约束:

    $first : Acccount()
    $second : Acccount( this != $first, transDate==$first.transDate )
    

    如果它完全触发,它必然会触发两次。对于同一日期的两个帐户事实,事实 A 绑定到 $first,因此事实 B 匹配并绑定到 $second。但是 A 和 B 的对称性并没有被约束打破,因此同样的事情再次发生,A 和 B 交换角色。

    为避免这种情况,请使用具有排序关系的唯一属性,大概是id

    $first : Acccount( $id1: id )
    $second : Acccount( id > $id1, transDate==$first.transDate )
    

    【讨论】:

      【解决方案2】:

      如果您想使用“Account (name=" 格式”比较同一类的两个实例,您会怎么做。

      【讨论】:

        猜你喜欢
        • 2017-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 2019-05-29
        相关资源
        最近更新 更多