bave règle de flux de
J'ai un étrange problème avec drools :
J'ai les règles suivantes :
rule "is my dog a baby?"
ruleflow-group "dog"
salience 10
when
dog : Dog(age <1 )
then
dog.setIsBaby(true);
end
rule "baby dog"
ruleflow-group "dog"
salience 9
when
myData : MyData( myDog.isBaby() == false)
then
System.out.println(myData.getMyDog().getIsBaby());
end
Je l'insère dans ma session myData et myData.getMyDog()
, où myData.getMyDog.isBaby==false
La première règle est tiré et que mon chien est d'être un bébé. Puis, la seconde est tiré, et même il imprime vrai .(même si la condition est fausse)
Et quand je test après la mise à feu de toutes les règles , myDog dans myData est d'être un bébé .
Ce que je fais mal ici ? Pourquoi la deuxième règle est déclenchée ? le problème est dans la session (stateful dans mon cas) ?
Je pense que j'ai besoin de dire que j'ai modifier myData:myDog quelque part ,mais je ne suis pas sûr de l'endroit où .
Espère que ma question est claire, si ce n'est me dire.
Vous devez vous connecter pour publier un commentaire.
Lorsque vous modifiez la mémoire de travail faits, vous avez besoin de dire Bave que les données ont changé de sorte qu'il peut ré-évaluer toutes les règles.
Bave évalue les faits, avant de tirer un d'eux correspond à des règles. Si vous avez un chien avec l'âge = 0 et bébé = false, votre règlement sera activé. Lorsque votre
is my dog a baby?
règle est déclenchée, elle ne change pas le fait que lors de la Bave évalué lababy dog
règle, lamyDog.isBaby() == false
condition est vrai.Pour informer Bave que vous avez modifié certains fait, utiliser la
update()
connaissance de la méthode d'assistance. Gardez à l'esprit que la Bave des associés fait poignées pour un objet spécifique. Si une règle référencesMyData
, et vous voulez que la règle d'être ré-évalué lors de laMyData.myDog
objet a changé, vous aurez besoin d'utiliserupdate()
sur leMyData
objet; il suffit de faireupdate()
sur votreDog
objet, ne causera pas lababy dog
règle d'être ré-évalué.Essayez de changer votre
is my dog a baby?
règle suivante:Que vous devez faire
sur votre première règle et la réécriture de la quand de votre deuxième règle comme
La règle doit être écrit de cette manière, alors bave peut détecter automatiquement les règles qu'il a à courir à nouveau après un effet change.
Chaque fois que vous modifiez un fait dans le moteur de règles, vous devez dire à la mémoire de travail que vous avez changé avec la mise à jour.
Je n'ai pas utilisé bave depuis la version 4, mais je suppose que cela s'applique toujours.
Oui, vous devriez le mettre à jour à la fois du chien et de la carte.
Cheers
Vous pouvez mettre à jour le chien dans la mémoire de travail en utilisant
modify
ouupdate
connaissance des méthodes d'assistance. Si vous pouvez tout de la fonction ci-dessus Bave ré-évaluer les règles de nouveau, et vous finirez vers le haut avec une boucle infinie. si vous avez aussi besoin de vous pas de boucle d'attribut dans votre règle ou de modifier vous condition dedog : Dog(age <1, isBaby == false )
de sorte que la prochaine fois il n'évaluera pas la même règle à nouveau et mettre à jour les isBaby de vrai, encore et encore.