Les arbres de décision et les moteurs de règles (Bave)
Dans l'application que je suis en train de travailler en ce moment, j'ai besoin de vérifier périodiquement l'admissibilité des dizaines de milliers d'objets d'un certain type de service. La décision diagramme lui-même est dans la forme suivante, tout simplement la plus grande:
Dans chacun des nœuds (cercles), j'ai besoin d'exécuter une action (la modification d'un objet du domaine, les informations du journal, etc). J'ai essayé à l'aide de Bave d'Experts de cadre, mais dans ce cas, j'avais besoin d'écrire une longue règle pour chaque chemin dans le diagramme conduisant à un nœud de fin. Bave Flux ne semble pas être construit pour un tel cas d'utilisation soit - je prendre un objet et ensuite, en fonction des décisions sur le chemin, je me retrouve dans l'un des nœuds finaux; et puis de nouveau pour un autre objet. Ou est-il? Pourriez-vous me donner des exemples ou des liens vers de telles solutions?
Mise à JOUR:
Bave Flux d'appels pourrait ressembler à ceci:
//load up the knowledge base
KnowledgeBase kbase = readKnowledgeBase();
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
Map<String, Object> params = new HashMap<String, Object>();
for(int i = 0; i < 10000; i++) {
Application app = somehowGetAppById(i);
//insert app into working memory
FactHandle appHandle = ksession.insert(app);
//app variable for action nodes
params.put("app", app);
//start a new process instance
ProcessInstance instance = ksession.startProcess("com.sample.ruleflow", params);
while(true) {
if(instance.getState() == instance.STATE_COMPLETED) {
break;
}
}
//remove object from working memory
ksession.retract(appHandle);
}
Qui est: je voudrais prendre un objet d'Application, démarrer un nouveau processus pour elle, lorsque le processus est terminé (la dernière, action nœud serait de modifier l'application d'une certaine manière), j'aimerais supprimer l'objet de la mémoire de travail et répétez le processus pour une nouvelle Application objet. Que pensez-vous de cette solution?
SOLUTION:
J'ai fini à l'aide de Bave Flux et il a travaillé très bien. Mon processus de prise de décision n'est pas aussi simple que Drools Expert de la demande et, selon l'endroit où l'arbre de décision le processus est-il besoin de charger des listes d'objets à partir de la base de données, les transformer, prendre des décisions, journal etc tout. J'utilise un Processus d'objet qui est passé au processus en tant que paramètre et stocke toutes mes variables globales (pour le processus) et de certaines méthodes pratiques qui sont répétées à différents points dans l'arbre (comme l'écriture de code Java dans le Script Task
nœuds n'est pas très pratique elle-même). J'ai aussi fini à l'aide de Java à prendre des décisions (et pas mvel
ou règles) - c'est plus rapide et je dirais plus facile à contrôler. Tous les objets avec lesquels je travaille sont transmises comme paramètres et utilisé comme Java normal variables dans le code.
OriginalL'auteur John Manak | 2011-02-03
Vous devez vous connecter pour publier un commentaire.
Drools expert est certainement le chemin à parcourir.
Si vous voulez éviter de vous répéter, pour les nœuds supérieurs, alors l'astuce est d'utiliser
insertLogical
(ou justeinsert
si vous êtes dans une session sans état), et à comprendre que les règles peuvent déclencher des règles (Ce n'est pas votre père requête SQL). Par exemple:Si la décision diagramme change souvent (et que vous voulez les non-programmeurs pour la modifier), jetez un oeil à la documentation sur des tables de décision (et DSL). Dans ce cas, vous aurez probablement répéter l'intégralité du chemin d'accès pour chaque règle, mais c'est effectivement ok dans la plupart des cas.
Qu'en Bave Flux? Je peux le modèle de l'arbre de décision à l'aide de et, ensuite, j'ai pu mettre un objet à la Mémoire de Travail, le processus et le laisser décider qui nœud de fin prendre, puis prendre l'objet, dans l'autre, il recommence et ainsi de suite? N'est-ce pas une meilleure solution?
Bave de Flux n'a pas de sens. Pas en disant qu'il ne pouvait pas travailler, mais puisque vous êtes à la prise d'une décision, d'une table de décision mis en œuvre avec un moteur de règles se sent beaucoup plus logique/physique. En essayant de l'adapter dans un flux de travail est bizarre: Un flux de travail est de longue durée, chaque nœud est un état.
Jetez un oeil à la décision "tables" dans la bave manuel de référence: downloads.jboss.com/drools/docs/5.1.1.34858.FINAL/drools-expert/... Vous ne voulez probablement pas à démarrer à partir XLS, mais l'utilisation de DRL directement, mais la conception de vos règles est le même: chaque règle est une décision de ligne.
Des tables de décision sont une fonctionnalité intéressante. Cependant, dans mon arbre de décision, il y a parfois plusieurs façons d'atteindre un objectif spécifique nœud et si je devais le réécrire dans les règles, leur nombre pourrait croître très rapidement. Aussi, pour mettre à jour les règles en cas de changement dans le schéma serait tout à fait une tâche fastidieuse. Donc, à mon avis, un arbre/schéma (même en Bave Débit) est un moyen plus naturel pour représenter la prise de décision.
OriginalL'auteur Geoffrey De Smet
J'ai eu un problème similaire et utilisé Neo4J nœud de base de données comme un simple et très souple, moteur de règles.
Vous pouvez utiliser est-il avec un RESTE d'interface de service de sorte qu'il est indépendant de l'application principale.
Vous pouvez aussi faire une demande distincte pour configurer les règles (même par les utilisateurs finaux).
OriginalL'auteur supercoco
Vous pouvez essayer la iLog cadre de sperme moteur de règles.
Comment Java Moteur de Règles API basée sur la norme JSR 94? Il y a aussi un appelle Jess. Vous pouvez trouver une liste sur ce lien: java-source.net/open-source/rule-engines
Vous 'll ont les mêmes problèmes de conception. La commutation du moteur de règles de mise en œuvre ne va pas aider. Bave met en œuvre la JSR-94, mais la JSR-94 API est trop restreinte pour la plupart des cas d'utilisation. Elle n'a pas évolué depuis des années.
OriginalL'auteur Sid