2011-08-10 57 views
2

我有一個函數,當我點擊添加按鈕時,在RDF文件中添加類Person的實例(及其屬性值)。我可以添加第一個實例,但是當我嘗試添加第二個實例時,它會將第一個實例替換爲第二個實例。如何增加資源?

我認爲這是因爲我沒有增加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

嗨,謝謝你的回答。我編輯了我的文章並添加了按鈕添加的代碼。謝謝 –

回答

-2

你只是重寫了四次文件。我建議你使用一些結構化編程實踐來避免將來出現這種錯誤。

+0

非常感謝您的回答。我會盡力。 –

+0

嗨CheatEx,我刪除了「For」循環。但它仍然覆蓋RDF文件中的現有實例。 –

+2

這種答案只是有用的。您不應該建議某人「使用某些結構化編程實踐」,而應該告訴錯誤的位置以及如何修復或改進代碼。這種答案只是嚇倒人們,並使他們不要在SO(-1) –

2

我假設你在使用Jena?

如果您再次使用相同的URI參數調用該方法,createResource(uri)方法將覆蓋現有資源。

所以你必須確保爲每個人分配一個不同的URI。

您可以使用某種自動遞增計數器或通過將該人員的名稱作爲URI的一部分來實現此目的(例如,using URLEncoder.encode(name, "utf-8"))。

+0

嗨cygri。感謝您的回答。是的,我正在使用耶拿。我編輯了我的帖子,並添加了我的代碼段添加按鈕。我怎樣才能使用URLEncoder?謝謝 –

1

我有點不清楚您的精確最終目標是在這裏,AR,但我可以看到兩種可能性:

  • 你想有一個系列磁盤上的文件,具有不同的文件名,各含從一個用戶的體形
  • 你想在磁盤上的一個文本文件的數據片段,但其中包含多個RDF科目,每一個代表不同用戶的體形細節

在第一種情況下,你需要改變輸出文件每一次。目前您擁有:

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

因此文件名固定爲'teste20.rdf'。您必須將其更改爲每次使用不同的文件名。有多種方法可以實現的是:一個辦法是對你的類private static int場,你每次遞增:

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

還有其他的方法,你可以從this question看到。

但是,如果你想要的第二種情況:多個RDF資源在一個文件中,那麼它是一個有點難以診斷的問題,沒有看到更多的代碼。但是,如果模型:

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

每次都是不一樣的模式(我無法從你的代碼是如何被創建的模型告訴),每個聽者運行時間,您創建一個包含模型只有來自用戶表單的新數據,然後寫出來。在這種情況下,您有兩種選擇:或者不要每次都創建一個新模型(但這意味着模型最終會變得很大,並且每次應用程序重新啓動時都會重置),或者讀取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,如理查德建議),那麼我們需要看到更多的代碼來找到根本原因。