Syed
Syed

Reputation: 23

Using model.remove (statement) in Jena

I am new with Jena and do not have much experience with Java. I am trying to make a program that deletes statements from a model. (I know about the alternative method of doing it using a graph and running SPARUL queries but I want to use a model instead). I have tried using the model.remove(statement) but it seems I am not doing it properly. I have searched for an example of the above method but I could not find one. Can someone please help me where I am doing wrong? I want to start with deleting one statement. After that I want to delete multiple statements. I am including the code below. Thanks in advance for the help

     import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Calendar;
import java.util.Date;

import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.query.ResultSetFormatter;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.ResourceFactory;
import com.hp.hpl.jena.util.FileManager;
import com.hp.hpl.jena.vocabulary.VCARD;

 public class Test3 extends Object  {

 public static void main(String[] args) throws IOException {

     final String  inputFileName = "vc-db-1.rdf";
     Model model = ModelFactory.createDefaultModel();

     InputStream in = FileManager.get().open(inputFileName);
     if (in == null) {
         throw new IllegalArgumentException ( "File: " + inputFileName + " not found");
     }

      model.read(new InputStreamReader(in), "");
     in.close();

     System.out.println( "== Before removal ==" );
     model.write( System.out);

     System.out.println( "\n\n== After removal ==" );



     model.remove( model.createResource( "http://somewhere/JohnSmith" ),
             VCARD.FN, // or ResourceFactory.createProperty( "http://www.w3.org/2001/vcard-rdf/3.0#FN" );
             ResourceFactory.createTypedLiteral( "John Smith" ));
     model.write( System.out);
 }

 }

The output is as follows

   == Before removal ==
    <rdf:RDF
        xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
        xmlns:vCard="http://www.w3.org/2001/vcard-rdf/3.0#" > 

.....Other statements
      <rdf:Description rdf:about="http://somewhere/JohnSmith/">
        <vCard:N rdf:nodeID="A3"/>
        <vCard:FN>John Smith</vCard:FN>
      </rdf:Description>
      <rdf:Description rdf:nodeID="A3">
        <vCard:Given>John</vCard:Given>
        <vCard:Family>Smith</vCard:Family>
      </rdf:Description>
    </rdf:RDF>


    == After removal ==
    <rdf:RDF
        xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
        xmlns:vCard="http://www.w3.org/2001/vcard-rdf/3.0#" > 
...Other Statements
      <rdf:Description rdf:about="http://somewhere/JohnSmith/">
        <vCard:N rdf:nodeID="A3"/>
        <vCard:FN>John Smith</vCard:FN>
      </rdf:Description>
      <rdf:Description rdf:nodeID="A3">
        <vCard:Given>John</vCard:Given>
        <vCard:Family>Smith</vCard:Family>
      </rdf:Description>
    </rdf:RDF>

Do I need to somehow 'confirm/commit' changes to the model after deleting statements?

Upvotes: 2

Views: 2638

Answers (1)

Joshua Taylor
Joshua Taylor

Reputation: 85883

The data that you're showing and the resource that you're creating in the program are different. In your program, the resource being created is

http://somewhere/JohnSmith

but in the data, it's

http://somewhere/JohnSmith/

with a trailing /. Once this is addressed, you can remove the triple, as in the following code:

import java.io.ByteArrayInputStream;

import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.vocabulary.VCARD;

public class RemoveStatementExample {
    public static void main(String[] args) {
        final String n3content = "" + 
                "@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .\n" +
                "@prefix vCard:   <http://www.w3.org/2001/vcard-rdf/3.0#> .\n" +
                "<http://somewhere/JohnSmith/>\n" +
                "  vCard:FN \"John Smith\" ;\n" +
                "  vCard:N [ vCard:Family \"Smith\" ;\n" +
                "            vCard:Given \"John\"\n" +
                "          ] .\n" +
                "";
        final Model model = ModelFactory.createDefaultModel()
                            .read( new ByteArrayInputStream( n3content.getBytes()), null, "N3" );

        // before removal
        System.out.println( "== before removal ==" );
        model.write( System.out, "N3" );

        // remove the statement.  Note that in your data, "John Smith" is an 
        // *untyped* literal, so we use createLiteral( "John Smith" ) rather than
        // createTypedLiteral( "John Smith" ).
        model.remove( model.createResource( "http://somewhere/JohnSmith/" ),
                      VCARD.FN,
                      model.createLiteral( "John Smith" ));

        System.out.println( "\n\n== after removal ==" );
        model.write( System.out, "N3" );
    }
}

The output is:

== before removal ==
@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix vCard:   <http://www.w3.org/2001/vcard-rdf/3.0#> .

<http://somewhere/JohnSmith/>
      vCard:FN "John Smith" ;
      vCard:N [ vCard:Family "Smith" ;
                vCard:Given "John"
              ] .


== after removal ==
@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix vCard:   <http://www.w3.org/2001/vcard-rdf/3.0#> .

<http://somewhere/JohnSmith/>
      vCard:N [ vCard:Family "Smith" ;
                vCard:Given "John"
              ] .

Upvotes: 3

Related Questions