推論 API をいじっている Jena 2.5.5 (Linux 上) で奇妙な効果が得られます。次のコードは、簡略化されたバージョンです。最初は空のモデルと一般的なルール推論を作成しています。特定のステートメントに再帰規則を追加します。InfModel を取得するためにモデルに推論機能を追加します。次に、一致するステートメントを作成し、それをモデルに追加します。
結果: InfModel には、ステートメントとその逆の両方が含まれます。これまでのところ、それはそれがすべきことです。
ここでSystem.out.println()
、一致するステートメントをモデルに追加する前に 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); // (*)
}
}