2

推論 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); // (*)
    }
}
4

3 に答える 3

1

関連するソースをざっと見てみると、次の 2 つのオプションがあるようです。

  • 基本モデルに変更を加え、それらが infModel に確実に反映されるようにする場合は、変更を行った後、 infModelに何かを「問い合わせる」前にinfModel.rebind()を呼び出す必要があります。

  • infModelを ( modelの代わりに) 直接使用して、ステートメントの要素とステートメント自体を作成および追加できます。

これがあなたの質問に直接答えないことは知っていますが、問題を解決する可能性があります(これは、ModelCom - InfModelの親クラスであるtoString()メソッドによって引き起こされる具体化によって引き起こされるようです)。

于 2008-12-11T21:00:06.320 に答える
0

model.toString() には副作用がある可能性があります。JENAのソースを見ていないので、確かではありませんが。

于 2008-12-08T21:07:42.470 に答える