Jena OntModelとbnodeの同期

java jena ontology serialization

この質問は rcreswickのhttps://stackoverflow.com/questions/375605/serializing-jena-ontmodel-changes[シリアル化Jena OntModelの変更点]に関する質問に関連しています。 私はソケットを介して同期を維持する必要がある2つ(またはそれ以上)のマシンでJenaモデルを持っています。 私が取り組む必要がある主な問題は、モデルが匿名ノード(bnode)を含んでいる可能性があるということです。

質問:私はここで正しい方向に進んでいるのか、それとも検討に失敗しているより優れた、より堅牢なアプローチがあるのか​​?

この問題に対する3つのアプローチが考えられます。

  1. 完全なモデルのシリアル化:これは小さな更新を同期するためには非常に費用がかかります。 また、どちらのマシンでも変更が発生する可能性があるため、マシンBのモデルをマシンAの直列化モデルに置き換えることはできません。 それらをマージする必要があります。

  2. 部分モデルのシリアル化:ソケット経由で送信する必要がある変更のみを含むシリアル化専用のモデルを使用します。 このアプローチでは、モデルから削除されたステートメントを表すための特別な語彙が必要です。 おそらく、モデルをマシンAからマシンBにシリアル化すると、匿名ノードIDはマシンAに固有のものになりますが、マシンB上に作成された匿名ノードのIDと重複する可能性があります。 したがって、将来の変更を正しく処理するために、匿名ノードの名前を変更し、マシンAのanon IDからマシンBのIDへのマッピングを保持する必要があります。

  3. 個々のステートメントをシリアル化する:このアプローチは特別な語彙を必要としませんが、それほど頑強ではないかもしれません。 まだ遭遇していない匿名ノード以外の問題はありますか?

  4. グローバルに一意なBノードIDを生成する(NEW):IDの前に一意のマシンIDを付けることで、匿名ノードに対してグローバルに一意のIDを生成できます。 残念ながら、私は Jenaに自分のIDジェネレータを使用するように指示するを考え出していません。 これにより、BノードIDを再マップせずに個々のステートメントをシリアル化できます。

これをもう少し詳しく説明する例を次に示します。 次のように表されるマシンAのリストがあるとします。

_:rdf:最初のmyns:tom _:a rdf:rest rdf:nil

このモデルをマシンAからマシンBに直列化します。 さて、マシンBはid ‘a’を持つ(無関係な)匿名ノードをすでに持っているかもしれないので、私はid ‘a’を新しいid ‘b’に再マップします。

_:b rdf:最初のmyns:tom _:b rdf:残りrdf:nil

これでマシンAのリストが変わります。

_:a rdf:最初のmyns:tom _:a rdf:rest _:b _:b rdf:最初のmyns:dick _:b rdf:rest

マシンBはこれまでにマシンAのID「b」に遭遇したことがないので、マシンAのID「b」から新しいID「c」への新しいマッピングを追加します。

_:b rdf:最初のmyns:トム_:b rdf:rest _:c _:c rdf:最初のmyns:dick _:c rdf:rest rdf:nil

この問題は2台以上の機械ではさらに複雑になります。 たとえば、3台目のマシンCがある場合、マシンAの匿名ノード ‘a’とは異なる独自の匿名ノード ‘a’が存在する可能性があります。 したがって、マシンBは実際にはリモートIDからローカルIDへだけではなく、他の各マシンの匿名ノードIDからそのローカルIDへのマップを保持する必要があります。 着信変更を処理するときは、IDを正しくマップするために、変更がどこから来たのかを考慮する必要があります。

  1  0


ベストアンサー

モデルに独自のトリプルを追加することは許可されていますか? もしそうなら、私はすべてのBノードのためのステートメントを紹介し、それぞれにURNの形で代替のパブリックIDを与えます。 これで、2つのモデル間のBノードのマッチングを開始できます。

ノードが空白かどうかは関係ありませんが、双方向同期ではこれまでしか得られません。 両方のモデルで同等の同時変更を検出しようとしている場合、このような戦略ではこれまでのところ得られます。

これが一例です。 あなたが新しい芝生の手入れ会社を始めているとしましょう。 いくつかのビジネスを盛り上げるために、あなたとあなたのパートナーは地元の野外イベントに行き、そしていくつかの割引試験の予定を予約しようとします。 あなたのうちの2人は、それぞれラップトップで武装していて、興味を持った人なら誰でも参加して録音できます。 レコードは以下のとおりです。

住所と郵便番号予約の日時

各レコードがモデルのリソースとして格納されているとしましょう。 あなたが夫に会い、あなたのパートナーが同じ世帯の妻に会うことは可能です。 あなたが偶然同じ予定dateTimeを予約するかどうかにかかわらず、システムはエントリを重複排除するのが難しいでしょう。 各レコードにBノードを使用する場合でも、UUIDベースのURIを使用する場合でも、重複排除は行われません。 唯一の希望はあなたがレコードのための決定論的なURIを合成するためにある標準的な形式で電話番号を言うことを使うならばです。

1


タイトルとURLをコピーしました