2012-12-17 55 views
-1

可能重複:
Java - Using Jena APi - Get data from RDF file從RDF文件獲取數據

我使用Java和耶拿API。

我有類Person與數據類型屬性hasFirstNamehasLastNamehasDateOfBirthhasGender

這是在我的RDF文件中如何表示一個人。

<rdf:Description rdf:about="http://www.fam.com/FAM#Bruno04/02/1980 "> 
    <j.0:FAMhasGender>H</j.0:FAMhasGender> 
    <j.0:FAMhasDateOfBirth>04/02/1980</j.0:FAMhasDateOfBirth> 
    <j.0:FAMhasLastName>DS </j.0:FAMhasLastName> 
    <j.0:FAMhasFirstName> Bruno</j.0:FAMhasFirstName> 
</rdf:Description> 

我想獲得每個人的姓名,性別,出生日期,寫在文本文件中的信息。我所遇到的問題是,它只會在rdf文件中寫入他發現的第一個女人/男人,但是不止一個女人和男人。

你能解釋一下我怎麼解決這個問題? 非常感謝。

ExtendedIterator instances = onto.person.listInstances(); 
Individual instance = null; 
Individual firstInstance = null; 
while (instances.hasNext()) { 
    instance = (Individual) instances.next(); 

    gen = instance.getPropertyValue(onto.hasGender).toString(); 
    fname = instance.getPropertyValue(onto.hasFirstName).toString(); 
    dd = instance.getPropertyValue(onto.hasDateOfBirth).toString(); 

    writeFile(fname, dd, genr);} 


// Write text file 
public void writeFile(String fn, String dbir, String gn) { 
    String fileout = "D:/file1.txt"; 
    String firstName = fn; 
    String dateB = dbir; 
    String gender = gn; 

    BufferedWriter out; 
    try { 
     out = new BufferedWriter(new FileWriter(fileout, true)); 

     if (gender.equals("F")) { 
      out.write("[label= \"" + firstName + " \"\n\n\"D.Naiss:" + dnai1 + "\", " + shape + "]"); 
     } else if (gender.equals("M")) { 
      out.write("[label= \"" + firstName + " \"\n\n\"D.Naiss:" + dnai1 + "\", " + shape2 + "]"); 
     } 

     out.newLine(); 

     // flushes and closes the stream 
     out.close(); 
    } catch (IOException e) { 
     System.out.println("There was a problem:" + e); 
    } 
} 
+1

那是什麼?!你以前的問題的確切副本,我用不同的標題回答?!請參閱:http://stackoverflow.com/questions/13915865/java-output-a-file –

回答

0

您的問題與Jena或RDF無關,但在您的編碼中相當邏輯錯誤。

您在while循環中調用writeFile(),它打開一個新文件,寫入當前條目並關閉文件。因此,您一次只需一次輸入一次就可以重複覆蓋文件,因此您只能在文件中找到一個人。

您需要重構代碼以在while循環之前打開一次文件,使writeFile()方法簡單地添加到該文件(並且不關閉它),然後在while循環之後關閉文件。

此外,@Udo Kilmaschewski在您的明顯重複中指出,genr變量未在您顯示的代碼中定義,因此您似乎沒有正確將性別從while循環傳遞到writeFile()函數。

+1

'new FileWriter(fileout,true)'附加到文件。 –

+1

糟糕,但我的錯誤,但基本原則仍然存在 - 除非循環中的計算是昂貴的(並且作爲耶拿開發人員,我可以告訴你它不是)在循環的每次迭代中關閉並重新打開文件是奇怪的 – RobV

+0

確實,這不是最佳編碼方式。 –