2015-03-26 2 views
-1

J'ai écrit un code dans JESS. Je cours maintenant le code de Java. J'ai couru à ce problème que je veux avoir la commande engine.execute ("") dans une boucle for. Code Mon exemple est:Exécuter r.execute() à partir de Java dans une boucle for

for (int i = 0; i < 10; i++){ 
    for (int j = 0; j < 10; j++){ 
r.executeCommand("(answer(ident headers.get(i)(text patientData.get(j).get(i))"); 
    } 
} 

où une réponse est deftemplate en JESS avec deux fentes. Je suis en train de lire un fichier texte en Java et d'insérer les valeurs dans les slots du deftemplate.

Merci, Ali

+0

vous n'avez pas posé de question ou fourni d'informations sur l'erreur que vous rencontrez. S'il vous plaît fournir plus d'informations sur exactement quel est le problème. –

+0

Eh bien, pour commencer, vous ne pouvez pas utiliser de noms de variables dans les guillemets, car cela affichera le nom littéral, pas la valeur. Vous devez utiliser l'opérateur de chaîne concat pour créer une chaîne contenant des variables. Ex: '" (réponse (ident headers.get ("+ i +") (texte patientData.get ("+ j +"). Get ("+ i +")) "' –

+0

Désolé, je n'ai pas ajouté le problème, Le tout phrase dans la commande sera traitée comme une chaîne, tandis que le headers.get() est une variable en Java.utiliser la concat ne semble pas fonctionner –

Répondre

0

Si answer est un deftemplate avec des fentes ident et text, l'extrait suivant ressemble à la construction d'un fait:

(answer(ident headers.get(i)(text patientData.get(j).get(i)) 
  • Un simple fait ne représente pas un Commande Jess qui peut être exécutée via Rete.executeCommand.
  • Vous ne devez pas utiliser la méthode obsolète executeCommand; utiliser eval.
  • Vos parenthèses ne sont pas équilibrées correctement, 6 parenthèses ouvrantes contre 4 fermantes.
  • En supposant que les en-têtes est un List<String> dans votre application Java, vous ne pouvez pas simplement lancer un appel de méthode Java à Jess, qui ne comprend pas la syntaxe Java en premier lieu et (vraisemblablement) ne connaît pas le pojo header . Il en va de même pour le pojo patientData.
  • Alors que vous pourriez passer objets depuis votre programme Java vers le moteur Jess, ceci est absolument impossible pour les variables simples comme i et j.

Considérant tout cela (dont la plupart est facile à apprendre de l'excellent manuel Jess), en utilisant

r.eval("(assert (answer (ident \"" + 
     headers.get(i) + 
     "\")(text \"" + 
     patientData.get(j).get(i) + 
     "\")))"); 

pourrait avoir une chance de réussir et même insérer un fait nouveau dans la mémoire de travail.

+0

Merci pour la réponse Laune, j'ai inséré les faits maintenant Règles font feu dans mon fichier .clp, mais je ne peux pas affirmer deftemplates dans le fichier .clp Y at-il quelque chose que je dois faire en plus pour chaque règle et affirmer que je veux faire? Merci beaucoup Ali –

+0

L'appel de la fonction assert comme il est construit dans l'appel d'eval dans ma réponse peut également être utilisé dans un fichier CLP: '(assert (answer (ident" 123 ") (texte" some data "))' devrait vous donner un fait – laune

+0

Une seule règle dans le Le fichier .clp sera renvoyé même si les faits doivent déclencher plus de règles. Je dois ajouter quelque chose pour faire feu toutes les règles? Merci –