2011-08-10 58 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,如理查德建议),那么我们需要看到更多的代码来找到根本原因。