2011-08-10 24 views
2

私はAddボタンをクリックすると、クラスPersonのインスタンス(およびそのプロパティ値)をRDFファイルに追加する関数を持っています。最初のインスタンスを追加できますが、2番目のインスタンスを追加しようとすると、最初のインスタンスが2番目のインスタンスに置き換えられます。リソースを増やす方法は?

最初のインスタンスを追加した後に、Resource P1 = model.createResource(personURI+"Name")を増やさないためだと思います。

java内のResourceP1からP2P3などに増やすにはどうすればよいですか?

public class ActionAjoutPersonne implements ActionListener 
{ 

    public void actionPerformed(ActionEvent evt) 
    { 

     Onto f = new Onto(); 

     Resource p1 = f.model.createResource(f.uriBase+tabTF[0].getText()); 


     p1.addProperty(f.aPourPrenom, tabTF[0].getText());   
     p1.addProperty(f.aPourNom, tabTF[1].getText());   
     p1.addProperty(f.aDateNaiss, tabTF[2].getText()); 

     if (tabTF[3].getText().equals("F")) 
     { 
      p1.addProperty(f.aGenre, tabTF[3].getText()); 
      p1.addProperty(RDF.type, f.femme); 
     } 
     else if (tabTF[3].getText().equals("H")) 
     { 
      p1.addProperty(f.aGenre, tabTF[3].getText());  
      p1.addProperty(RDF.type, f.homme); 
     } 

     StringWriter sw = new StringWriter(); 
     f.model.write(sw, "RDF/XML-ABBREV"); 
     String owlCode = sw.toString(); 
     File file = new File("d:/teste20.rdf"); 
     try{ 
      FileWriter fw = new FileWriter(file); 
      fw.write(owlCode); 
      fw.close(); 
     } catch(FileNotFoundException fnfe){ 
      fnfe.printStackTrace();} 
     catch(IOException ioe){ 
       ioe.printStackTrace(); 
     }  
    } 
} 
+0

同じURLで複数のリソースを作成しているようです。完全なコード断片を提供できますか? – CheatEx

+0

こんにちは、答えに感謝します。私は自分の投稿を編集し、Button Addのコードを追加しました。お返事ありがとうございます –

答えて

-2

ファイルを4回書き直すだけです。私はあなたに、この種の間違いを未然に防ぐためにいくつかの構造化プログラミングを使うことをお勧めします。

+0

ありがとうございます。私が試してみます。 –

+0

こんにちはCheatEx、私は "For"のループを削除しました。 RDFファイルの既存のインスタンスを上書きします。 –

+2

この種の回答は役に立ちます。誰かに「構造化されたプログラミング実践を使用する」よう提案するのではなく、エラーの場所とコードを修正する方法を教えてください。この種の答えは人々を怖がらせ、SO(-1) –

2

あなたはJenaを使用していると仮定しますか?

同じURI引数を使用して再度呼び出すと、既存のリソースが上書きされます。

したがって、それぞれの人に異なるURIを割り当てる必要があります。

これは、何らかの自動インクリメントカウンタを使用するか、その人の名前をURIの一部(たとえば、using URLEncoder.encode(name, "utf-8"))にすることで実現できます。

+0

こんにちは。ご回答有難うございます。はい、私はJenaを使用しています。私は自分の投稿を編集し、Button Addのために自分のコード片を追加しました。 URLEncoderはどのように使用できますか?ありがとう –

1

私はここにあなたの正確な最終目標は、ARであるが、私は二つの可能性見ることができるものはほとんど不明確だ:

  • あなたはそれぞれが含む、異なるファイル名でディスク上のファイルのシリーズを、希望を最初のケースで1人のユーザーのフォーム
  • からRDFフラグメント、ディスク上のファイルをしたいが、複数のRDFの科目が含まれており、それぞれが別のユーザーのフォームの詳細を表す

、出力ファイルを変更する必要があります毎回。現在、あなたは持っています:

File file = new File("d:/teste20.rdf"); 

したがって、ファイル名は 'teste20.rdf'に固定されています。そのたびに別のファイル名を使用するように変更する必要があります。それを達成するための様々な方法があります。一つの方法は、あなたがするたびにインクリメントあなたのクラスのprivate static intフィールドを持っているだろう:

File file = new File("d:/teste_" + fileCounter++ + ".rdf"); 

あなたがthis questionから見ることができる他の方法があります。

しかし、1つのファイルに複数のRDFリソースが必要な場合は、さらに多くのコードを見ることなく問題を診断するのは少し難しいです。でモデルただし、:

Resource p1 = f.model.createResource(...) 

が毎回同じモデルではないリスナーが実行されるたび、あなたは含むモデルを作成し、(私はそのモデルが作成されているどのようにあなたのコードから言うことができません)ユーザーのフォームから新しいデータのみを取り出し、それを所定の場所に書き出します。その場合は、次の2つの選択肢があります。毎回新しいモデルを作成しないでください(つまり、モデルが最終的にかなり大きくなり、アプリケーションが再起動するたびにリセットされることを意味します)。または、d:/teste20.rdf前にあなたは、モデルの内容を書き出す(テストはないが、動作するはずです):

File file = new File("d:/teste20.rdf"); 
    f.model.read(new FileReader(file)); 
    f.model.write(new FileWriter(file), "RDF/XML-ABBREV"); 

あなたが表現f.uriBase+tabTF[0].getText()はあなたにユニークなURIを与えると仮定して、毎回新しいモデルを作成していない場合リチャードが示唆しているように、問題が一意でないサブジェクトURIである場合は、根本的な原因に到達するために、より多くのコードを参照する必要があります。

関連する問題