1

いくつかのJenaモデル(具体的にはOntModels)をソケット間で同期させる必要があります。これは、一度に1つずつ変更したいと思います(さまざまな理由から、OntModelsに追加または削除された各ステートメントはまた、JESSルールベースを適応させます。)OntModelsでadd/removeイベントをリッスンし、追加/削除されたステートメントと、ステートメントが追加または削除されたことを示すChangeTypeをラップする単純なイベントインスタンスを作成できますが、ステートメントのシリアル化は問題。

残念ながら、私が見つけたJENAシリアル化のドキュメントはすべて、モデル全体をxml / rdf / n3 /などにシリアル化することに関連しています。ステートメントは(とにかく、あるレベルでは)文字列のトリプルであるため、ステートメントレベルでデータをシリアル化します。ただし、Jenaは、「正しいことを行う」プレーンな文字列を使用してステートメントを作成するためのAPIを提供していないようです。型付きリテラルで問題が発生します。例えば:

私はステートメントを作成することができます:

<http://someuri/myont#foo> <http://someuri/myont#weight> "50.7"^^www.w3.org/2001/XMLSchema#double

しかし、私が取得できる文字列バージョンは次のようになります。

"http://someuri/myont#foo" "http://someuri/myont#weight" "50.7^^www.w3.org/2001/XMLSchema#double"

(^^の前に "がないことに注意してください)

リテラルは正規表現で解析できるため、これはそれほど問題にはなりませんが、適切なリテラルを使用してステートメントを作成することはできませんでした。明らかなアプローチ(ModelCon.createStatement(Resource、Property、String))は、渡された文字列の完全な値を使用して、型指定されていない文字列リテラルを生成します。

個々のイエナステートメントを確実にシリアル化(そしてもちろん逆シリアル化)する方法を知っている人はいますか?

4

4 に答える 4

2

変更を N-TRIPLES 形式でシリアル化します。Jena には N-TRIPLES シリアライザーとパーサーが組み込まれていますが、N-TRIPLES 構文は (意図的に) 非常に単純であるため、コードで手動で生成するのは簡単です。

ただし、単純なメモリ モデルを保持して変更を保持し、イベント ハンドラーに変更をそのモデルに書き込み、同期スケジュールに従ってネットワーク経由でそのモデルをシリアル化する方が簡単な場合があります。同様に、遠端では、同期チャネルから一時的なメモリ モデルに更新を読み取り、更新をyourOntModel.add( changesModel )非常に簡単に追加する必要があります。

イアン

于 2009-01-10T00:51:20.280 に答える
1

私が詳細に調べた領域ではありませんが、Talis がいくつかの調査を行っていたことを思い出し、「Changeset」と呼ばれる関連語彙へのパンくずリストをたどることができました。

http://vocab.org/changeset/schema

JENA を使用して個々のステートメントをシリアル化する際に問題が発生したことに驚きましたが、変更セット スキーマに従ってグラフを作成し、グラフをシリアル化した場合は、もっとうまくいくでしょうか? または、ステートメントを新しいグラフに追加し、1 つのトリプルのグラフをシリアル化します。

于 2009-01-05T14:42:29.067 に答える
0

おそらく、createStatement の String パラメータを Model.createLiteral(String) で置き換えてみてください...

于 2009-01-13T16:45:04.877 に答える
0

私が最終的に得た解決策は以下のとおりです。時間の制約のため、正規表現アプローチを使用することになりました(この質問に関する他の提案はごく最近まで見ませんでした)

これはおそらく最良のアプローチではありませんが、うまく機能しているようです (そして、この時点で対処する必要があるユース ケースを実行するテスト スイートを使用して精査しました)。

メソッドはcreateStatement(...)OntUtilities ヘルパー クラスにあります。

   /**
    * Serialization output method.
    * 
    * @param out
    * @throws IOException
    */
   private void writeObject(final ObjectOutputStream out) throws IOException {
     out.defaultWriteObject();
     out.writeObject(_statement.getSubject().getURI());
     out.writeObject(_statement.getPredicate().getURI());
     out.writeObject(_statement.getObject().toString());
   }

   /**
    * deserialization method.
    * 
    * @param in
    * @throws IOException
    * @throws ClassNotFoundException
    */
   private void readObject(final ObjectInputStream in) throws IOException, 
      ClassNotFoundException {
     in.defaultReadObject();

     final String subject = (String)in.readObject();
     final String predicate = (String)in.readObject();
     final String object = (String)in.readObject();

     _statement = OntUtilities.createStatement(subject, predicate, object);
   }

   /**
    * Creates a statement from a triple of strings.  These strings may be fully
    * qualified uris, or shortened "namespace" uris (eg: shai:TST)
    * 
    * @param sub The resource uri (the subject)
    * @param pred The predicate uri (the property)
    * @param ob The object uri.
    * @return A JENA Statement.
    */
   public static Statement createStatement(final String sub, final String pred,
         final String ob) {
      final Model m = ModelFactory.createDefaultModel();

      final String s = OntUtilities.nsUriToUri(sub);
      final String p = OntUtilities.nsUriToUri(pred);
      final String o = OntUtilities.nsUriToUri(ob);

      Statement stmt = null;
      try {
         // try making a uri as a syntax-verification step.
         new URI(o);
         // it was valid, so well use o as a resource:
         final Resource obj = m.createResource(o);
         stmt = m.createStatement(m.createResource(s), m.createProperty(p), obj);
      } catch (final URISyntaxException e) { 
         // o was *not* a uri.
         if (o.contains("^^")) {
            final int idx = o.lastIndexOf("^^");

            final String value = o.substring(0, idx);
            final String uri = o.substring(idx+2);

            final Literal lit = m.createTypedLiteral(value, getDataType(uri));

            stmt = m.createStatement(m.createResource(s), m.createProperty(p), lit);
         } else {
            // just use the string as-is:
            stmt = m.createStatement(m.createResource(s), m.createProperty(p), o);
         }
      }
      return stmt; 
   }
于 2009-01-14T00:05:26.003 に答える