Je reçois un effet étrange dans Jena 2.5.5 (sur Linux) où je joue avec l'API d'inférence. Le code suivant est une version simplifiée. Je crée un modèle initialement vide et un raisonneur de règle générique. J'ajoute une règle de réflexivité pour une certaine déclaration. J'attache le raisonneur au modèle pour obtenir un InfModel. Ensuite, je crée l'instruction correspondante et l'ajoute au modèle. Résultat: InfModel contient à la fois l'instruction et son inverse. Jusqu'ici tout va bien, c'est ce qu'il est censé faire. Maintenant, quand je System.out.println()
l'InfModel avant d'ajouter l'instruction correspondante à Model, le résultat est complètement différent: la règle semble ne pas se déclencher et ainsi, InfModel finira par ne pas contenir l'inverse de l'instruction originale. Comment l'écriture du modèle sur la console modifie-t-elle la fonctionnalité du code? Ce comportement est-il documenté?L'impression InfModel plus tôt modifie la représentation imprimée plus tard?
import java.util.*;
import com.hp.hpl.jena.rdf.model.*;
import com.hp.hpl.jena.reasoner.rulesys.*;
/**
* Describe class <code>RuleTest</code> here.
*/
public class RuleTest {
public static void main(String[] args) throws Exception {
/* create model */
Model model = ModelFactory.createDefaultModel();
/* output model */
System.out.println("original model : " + model);
System.out.println("-----");
/* collect rules */
List<Rule> rules = new ArrayList<Rule>();
Rule rule = Rule.parseRule("[ (subject predicate object) -> (object predicate subject) ].");
rules.add(rule);
/* create rule reasoner */
GenericRuleReasoner reasoner = new GenericRuleReasoner(rules);
/* attach reasoner to model */
InfModel infModel = ModelFactory.createInfModel(reasoner, model);
/* output model */
//-----------------------------------------------//
// commenting the following line in/out changes //
// the output of (*) below in Jena 2.5.5 ?!?!?! //
//-----------------------------------------------//
//System.out.println("inference model: " + infModel);
System.out.println("=====");
/* add facts to original model */
Resource s = model.createResource("subject");
Property p = model.createProperty("predicate");
RDFNode o = model.createResource("object");
Statement stmt = model.createStatement(s, p, o);
model.add(stmt);
/* output models */
System.out.println("original model : " + model);
System.out.println("-----");
System.out.println("inference model: " + infModel); // (*)
}
}
Merci pour la réponse - Je pense que ce n'est pas seulement "probable" mais aussi complètement évident que toString() doit avoir des effets secondaires. Ce qui est certainement inattendu, mais peut-être que mon expérience avec Jena est trop peu pour savoir ce qui se passe. En tout cas, je n'ai trouvé aucune documentation de ce comportement. –