Как увеличить ресурс? - PullRequest
       54

Как увеличить ресурс?

2 голосов
/ 10 августа 2011

У меня есть функция, которая добавляет экземпляры (и значения их свойств) класса Person в файл RDF, когда я нажимаю кнопку Добавить. Я могу добавить первый экземпляр, но когда я пытаюсь добавить второй, он заменяет первый экземпляр вторым.

Я думаю, это потому, что я не увеличиваю Resource P1 = model.createResource(personURI+"Name") после добавления первого экземпляра.

Как я могу увеличить Resource в Java с P1 до 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 ]

2 голосов
/ 10 августа 2011

Я предполагаю, что вы используете Jena?

Метод createResource(uri) перезапишет существующий ресурс, если вы вызовете его снова с тем же аргументом URI.

Так что вы должны убедиться, чтоназначить разные URI для каждого человека.

Этого можно добиться, используя какой-то счетчик с автоинкрементом или сделав имя человека частью URI (например, using URLEncoder.encode(name, "utf-8")).

1 голос
/ 11 августа 2011

Мне немного непонятно, какова ваша точная конечная цель, А.Р., но я вижу две возможности:

  • вам нужна серия файлов на диске с разными именами файлов, каждый из которых содержит фрагмент RDF из формы одного пользователя
  • вам нужен один файл на диске, но который содержит несколько тем RDF, каждый из которых представляет детали формы другого пользователя

В первом случае вам нужно будет каждый раз менять выходной файл. В настоящее время у вас есть:

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

поэтому имя файла установлено на «teste20.rdf». Вам придется изменить это, чтобы каждый раз использовать другое имя файла. Есть несколько способов добиться этого: один из них - это поле private static int в вашем классе, которое вы увеличиваете каждый раз:

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

Есть и другие способы, которые вы можете увидеть из этого вопроса .

Если, однако, вам нужен второй случай: несколько ресурсов 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 субъекта, как предложил Ричард), тогда мы понадобится увидеть больше кода, чтобы добраться до первопричины.

0 голосов
/ 10 августа 2011

Вы просто переписываете файл четыре раза. Я предлагаю вам использовать некоторые методы структурированного программирования, чтобы избежать подобных ошибок в будущем.

...