1

私は Jena を使用しており、新しいオントロジーを自分の tdb に更新したいと考えています。例えば。オントロジーに 100 行あります。いくつかのルールを追加して推論を実行すると、現在 105 行あります。そして、tdb でこれらの 5 つの追加行を更新する必要があります。どうすればこれを行うことができますか?

私はそれをググってみましたが、2つの方法が見つかりました。1 つは sparql を使用して を更新し、もう 1 つは tdb を切り捨てて新しいモデルを追加します。

他に良い解決策はありますか?

ありがとうございます

--

コード

void after_reasoner(Model m) {

    String yago = "http://yago-knowledge.org/resource/";

    Reasoner reasoner = new GenericRuleReasoner(
            Rule.rulesFromURL("file:./rules/act.rule"));

    InfModel inf1 = ModelFactory.createInfModel(reasoner, m);

    PrintUtil.registerPrefix("yago", "http://yago-knowledge.org/resource/");

    }

繰り返しますが、私の問題は、tdb への新しい「infmodel」をどのように処理するかです。新しい事実だけを更新したい。

これは、tdb からモデルを取得する方法です。

Model tdb_write_return() {
    String directory = "./tdb";
    Dataset dataset = TDBFactory.createDataset(directory);

    dataset.begin(ReadWrite.WRITE);
    String ns = "http://www.darrell.com.tw/ontologies/";

    Model model = dataset.getNamedModel(ns);
    dataset.commit();
    dataset.end();
    dataset.close();

    return model;
}
4

1 に答える 1

2

Datset取得するの有効期間は、取得するオブジェクトTDBFactoryよりも長くする必要があることに注意してください。Modelそのデータセットを呼び出すDataset.close()と、返されたモデルとのやり取りで突然エラーが発生する場合があります。

控除の具体化

あなたの質問に関して、推測されたトリプルを保持したい場合は、それらを基になるモデルに追加し直す必要があります。これにより、何かを置き換えるのではなく、既存のグラフを利用できます。

final String directory = "./tdb";
final String ns = "http://www.darrell.com.tw/ontologies/";

final Dataset dataset = TDBFactory.createDataset(directory);

dataset.begin(ReadWrite.WRITE);
try {
   Model model = dataset.getNamedModel(ns);

   final Reasoner reasoner = new GenericRuleReasoner(Rule.rulesFromURL("file:./rules/act.rule"));
   final InfModel infModel = ModelFactory.createInfModel(reasoner, m);
   infModel.prepare()
   model.add(infModel.getDeductionsModel()); // #1

   dataset.commit();
}
catch(final Exception e) {
   dataset.abort();
}
finally {
   dataset.end();
}

上記の例では、コメント付きの行が#1(前方) 控除の結果を取得し、それらを基になるモデルに挿入します。すべての控除を取得するには、次のようにします。

model.add(infModel);

推論者は、新しいトリプルを考慮して新しい推論を試みることができます/すべきですが、その試みられた推論の結果はノーオペレーションである必要があります。

説明

を基になるモデルに追加infModelすると、元のモデルの和集合、後方推論、前方推論をすべて元のモデルに追加しようとします。あなたはコメントでこれを呼び出しました。明確にするために、RDF のセット セマンティクスにより、既に存在するトリプルを追加しようとしても、データが変更されることはありません。RDF では、すべてのクワッド/トリプル (またはリレーショナル アナロジーを考慮した行) は一意です。

元のモデルに追加infModel.getDeductionsModel()すると、すべての順連鎖推論がグラフに挿入されます。これは一般に、を追加するよりも少なくとも少し効率的であるはずinfModelですが、後方連鎖の推論に依存している場合は適用できません。

于 2014-08-19T16:32:54.963 に答える