-5

1 つのルールで同じクラスの 2 つのオブジェクトを比較する必要があります。しかし、ある属性がメインクラスで作成されたオブジェクトに属していることをどのように知ることができますか? 私は助けが必要です!

public class CheckerMain {

    public static void main(String[] args) {
        try {
            KnowledgeBase kbase = readKnowledgeBase();
            StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
            KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "ConflictChecker");

            DeonticConcept deoCon1 = new DeonticConcept("forbidden");        
            DeonticConcept deoCon2 = new DeonticConcept("permission");

            ksession.insert(deoCon1);
            ksession.insert(deoCon2);

            ksession.fireAllRules();
            logger.close();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    private static KnowledgeBase readKnowledgeBase() throws Exception {
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add(ResourceFactory.newClassPathResource("Rules.drl"), ResourceType.DRL);
        KnowledgeBuilderErrors errors = kbuilder.getErrors();
        if (errors.size() > 0) {
            for (KnowledgeBuilderError error: errors) {
                System.err.println(error);
            }
            throw new IllegalArgumentException("Could not parse knowledge.");
        }
        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
        return kbase;
    }
}

オブジェクト deoCon1 と deoCon2 でインスタンス化された属性 nameConceptDeontic を 1 つのルールで比較します。どうすればこれを行うことができますか?

4

2 に答える 2

0

このようなもの?

rule "..."
when
    $dc1: DeonticConcept()
    $dc2: DeonticConcept(this != $dc1, nameConceptDeontic == $dc1.nameConceptDeontic)
then
    ...
end

上記は2回アクティブになることに注意してください。1&2用と2&1用。それを防ぐ必要がある場合は、2 回目のアクティベーションをブロックすることをお勧めします。これを行う 1 つの方法は、MatchedConcepts ファクトを挿入し、そのようなファクトが存在しないという追加の制約を追加することです。

于 2013-10-04T14:05:45.100 に答える
0

「instanceFoo のクラスを特定するにはどうすればよいですか?」と尋ねていると思います。しかし、文法は解読するのが難しいです。

instanceofその場合は、演算子を使用してください。あなたの場合、instanceFoo は属性の親オブジェクトになります。

if (instanceFoo instanceof classBar){
    //do stuff
}

または、 http://docs.oracle.com/javase/tutorial/reflect/class/classNew.htmlgetClass()で詳細に説明されているメソッドを試すこともできます。

于 2013-09-13T00:01:45.430 に答える