我在使用推理 API 的 Jena 2.5.5(在 Linux 上)中得到了一种奇怪的效果。以下代码是精简版。我正在创建一个最初为空的模型和一个通用规则推理器。我为某个陈述添加了反身性规则。我将推理器附加到模型以获得 InfModel。然后我创建匹配语句并将其添加到模型中。
结果:InfModel 包含语句及其反向语句。到目前为止一切顺利,这就是它应该做的。
现在,当我System.out.println()
在将匹配语句添加到 Model 之前的 InfModel 时,结果完全不同:规则似乎没有触发,因此,InfModel 最终将不包含原始语句的反向。
将模型写入控制台会如何改变代码的功能?这种行为是否记录在案?
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); // (*)
}
}