如何增加资源?

时间:2011-08-10 11:12:38

标签: java rdf ontology jena owl

我有一个函数,当我点击Add按钮时,它会在RDF文件中添加类Person的实例(及其属性值)。我可以添加第一个实例,但是当我尝试添加第二个实例时,它会用第二个实例替换第一个实例。

我认为这是因为在添加第一个实例后我没有增加Resource P1 = model.createResource(personURI+"Name")

如何将java中的ResourceP1增加到P2再增加到P3等?

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();
        }    
    }
}

3 个答案:

答案 0 :(得分:2)

我假设你正在使用耶拿?

如果使用相同的URI参数再次调用现有资源,createResource(uri)方法将覆盖现有资源。

因此,您必须确保为每个人分配不同的URI。

您可以使用某种自动递增计数器,或通过将此人的姓名作为URI的一部分(例如using URLEncoder.encode(name, "utf-8"))来实现此目的。

答案 1 :(得分:1)

我有点不清楚你的确切目标是什么,A.R。,但我可以看到两种可能性:

  • 您希望磁盘上有一系列文件,文件名不同,每个文件名都包含一个用户表单中的RDF片段
  • 你想要一个磁盘上的文件,但它包含多个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(...)

每次都不是同一个模型(我无法从你的代码中看出该模型是如何创建的),每次监听器运行时,你创建一个只包含用户表单中的新数据的模型,然后把它写到位。在这种情况下,您有两个选择:要么每次都不要继续创建新模型(但这意味着模型最终会变得非常大,并且每次应用程序重新启动时也会重置),或者读取{的现有内容{1}} 之前写出模型的内容(未经过测试,但应该有效):

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" ); 为每个用户提供了唯一的URI字符串(否则问题是非唯一主题URI,如Richard建议的那样),那么我们需要看到更多的代码才能找到根本原因。

答案 2 :(得分:-2)

你只是重写了四次文件。我建议你使用一些结构化的编程实践来避免将来出现这种错误。