Je rencontre 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 Model initialement vide et un raisonneur de règles 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 la déclaration correspondante et l'ajoute au Modèle.
Résultat : InfModel contient à la fois la déclaration et son inverse. Jusque-là tout va bien, c'est ce qu'il est censé faire.
Maintenant, lorsque je System.out.println()
l'InfModel avant d'ajouter la déclaration correspondante au Modèle, le résultat est complètement différent : la règle semble ne pas se déclencher et donc, InfModel ne contiendra pas l'inverse de la déclaration originale.
Comment l'écriture du modèle dans la console change-t-elle le fonctionnement du code ? Ce comportement est-il documenté ?
import java.util.*;
import com.hp.hpl.jena.rdf.model.*;
import com.hp.hpl.jena.reasoner.rulesys.*;
/**
* Décrire la classe RuleTest ici.
*/
public class RuleTest {
public static void main(String[] args) throws Exception {
/* créer un modèle */
Model model = ModelFactory.createDefaultModel();
/* modèle de sortie */
System.out.println("modèle d'origine : " + model);
System.out.println("-----");
/* collecte de règles */
List rules = new ArrayList();
Rule rule = Rule.parseRule("[ (subject predicate object) -> (object predicate subject) ].");
rules.add(rule);
/* créer un raisonneur de règles */
GenericRuleReasoner reasoner = new GenericRuleReasoner(rules);
/* attacher le raisonneur au modèle */
InfModel infModel = ModelFactory.createInfModel(reasoner, model);
/* modèle de sortie */
//-----------------------------------------------//
// commenter la ligne suivante change //
// la sortie de (*) ci-dessous dans Jena 2.5.5 //
//-----------------------------------------------//
//System.out.println("modèle d'inférence : " + infModel);
System.out.println("=====");
/* ajouter des faits au modèle d'origine */
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);
/* modèles de sortie */
System.out.println("modèle d'origine : " + model);
System.out.println("-----");
System.out.println("modèle d'inférence : " + infModel); // (*)
}
}