Reputation: 23
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
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