Reputation: 831
I am using Jena to read an RDF file, but I want to get the information just specific statements. Below is my sample code to read sample.rdf
.
sample.rdf
:
<rdf:Description rdf:about="http://d.opencalais.com/dochash-1/6ee25504-ff98-34e4-af60-dde69f5ddf73/Instance/143">
<c:length>4</c:length>
<c:offset>6588</c:offset>
<c:suffix> network, specific mechanisms for implementing</c:suffix>
<c:exact>VoIP</c:exact>
<c:prefix>applications. Topics include imple-menting a
</c:prefix>
<c:detection>[applications. Topics include imple-
menting a ]VoIP[ network, specific mechanisms for implementing]</c:detection>
<c:subject rdf:resource="http://d.opencalais.com/genericHasher-1/1bc26b65-5ef5-306d-9203-fd0f8aa3ba18"/>
<c:docId rdf:resource="http://d.opencalais.com/dochash-1/6ee25504-ff98-34e4-af60-dde69f5ddf73"/>
<rdf:type rdf:resource="http://s.opencalais.com/1/type/sys/InstanceInfo"/>
</rdf:Description>
<rdf:Description rdf:about="http://d.opencalais.com/dochash-1/6ee25504-ff98-34e4-af60-dde69f5ddf73/SocialTag/10">
<c:originalValue>Cisco IOS</c:originalValue>
<c:importance>2</c:importance>
<c:name>Cisco IOS</c:name>
<c:socialtag rdf:resource="http://d.opencalais.com/genericHasher-1/8ed51994-de69-3307-acf7-be18cc0d06e2"/>
<c:docId rdf:resource="http://d.opencalais.com/dochash-1/6ee25504-ff98-34e4-af60-dde69f5ddf73"/>
<rdf:type rdf:resource="http://s.opencalais.com/1/type/tag/SocialTag"/>
</rdf:Description>
Java code that loads sample.rdf
into a Jena Model:
public class FirstRDFReader extends Object {
public static void main (String args[]) {
String inputFile="C://Sample.rdf";
Model model = ModelFactory.createDefaultModel();
try{
InputStream in =new FileInputStream(inputFile);
if (in == null) {
System.out.println("File not found");
}
model.read(in," ");
model.write(System.out);
}catch(Exception e){}
}
}
Desired output:
<rdf:Description rdf:about="http://d.opencalais.com/dochash-1/6ee25504-ff98-34e4-af60-dde69f5ddf73/SocialTag/10">
<c:importance>2</c:importance>
<c:name>Cisco IOS</c:name>
</rdf:Description>
thanks
Upvotes: 0
Views: 1233
Reputation: 85853
Here's some data that we can actually work with. It's based on your data, with the rdf
prefix defined, and some additional prefixes for making ctag:SocialTag
and csys:InstanceInfo
work. Those are optional, but a prefix definition for c
was required, since it was used in your data. I just used http://example.org/c#
for convenience, but you've probably got something else defined.
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:c="http://example.org/c#"
xmlns:ctag="http://s.opencalais.com/1/type/tag/"
xmlns:csys="http://s.opencalais.com/1/type/sys/">
<ctag:SocialTag rdf:about="http://d.opencalais.com/dochash-1/6ee25504-ff98-34e4-af60-dde69f5ddf73/SocialTag/10">
<c:originalValue>Cisco IOS</c:originalValue>
<c:importance>2</c:importance>
<c:name>Cisco IOS</c:name>
<c:socialtag rdf:resource="http://d.opencalais.com/genericHasher-1/8ed51994-de69-3307-acf7-be18cc0d06e2"/>
<c:docId rdf:resource="http://d.opencalais.com/dochash-1/6ee25504-ff98-34e4-af60-dde69f5ddf73"/>
</ctag:SocialTag>
<csys:InstanceInfo rdf:about="http://d.opencalais.com/dochash-1/6ee25504-ff98-34e4-af60-dde69f5ddf73/Instance/143">
<c:length>4</c:length>
<c:offset>6588</c:offset>
<c:suffix> network, specific mechanisms for implementing</c:suffix>
<c:exact>VoIP</c:exact>
<c:prefix>applications. Topics include imple-menting a
</c:prefix>
<c:detection>[applications. Topics include imple-
menting a ]VoIP[ network, specific mechanisms for implementing]</c:detection>
<c:subject rdf:resource="http://d.opencalais.com/genericHasher-1/1bc26b65-5ef5-306d-9203-fd0f8aa3ba18"/>
<c:docId rdf:resource="http://d.opencalais.com/dochash-1/6ee25504-ff98-34e4-af60-dde69f5ddf73"/>
</csys:InstanceInfo>
</rdf:RDF>
Once you've got that data somewhere, there are two easy ways to get it out using the Jena. The first is to use Jena's Model API which provides methods for retrieving statements. The second is to use a SPARQL query. You can run the SPARQL query using Jena's command line tools, but also from a Java program.
Here's Java code that creates a results
model to store the desired output, retrieves SocialTags and the statements defining their name and importance from input
, and copies the statement into results
.
public static Model queryWithAPI() {
// Create a model for the output, and add the prefix mappings
// from the input model. This step isn't necessary, but it
// makes the output easier to read.
final Model results = ModelFactory.createDefaultModel();
results.setNsPrefixes( input );
// Iterate through the SocialTags in the data, and for each SocialTag s, retrieve
// the statements [s, name, ?name] and [s, importance, ?importance] from the input
// model, and add them to the results.
for ( final ResIterator it = input.listResourcesWithProperty( RDF.type, SocialTag ); it.hasNext(); ) {
final Resource socialTag = it.next();
results.add( socialTag.getProperty( importance ));
results.add( socialTag.getProperty( name ));
}
return results;
}
The following SPARQL construct
query also retrieve SocialTags and then constructs the desired graph.
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix ctag: <http://s.opencalais.com/1/type/tag/>
prefix c: <http://example.org/c#>
construct {
?tag c:name ?name ;
c:importance ?importance .
}
where {
?tag a ctag:SocialTag ;
c:name ?name ;
c:importance ?importance .
}
Here's Java code that executes that query on the input
model.
public static Model queryWithSPARQL() {
// A SPARQL query that retrieves each SocialTag and its name
// and importance, and constructs a model containing just the
// name and importance statements.
final String query = "" +
"prefix rdf: <"+RDF.getURI()+">\n" +
"prefix ctag: <"+CTAG+">\n" +
"prefix c: <"+C+">\n" +
"construct {\n" +
" ?tag c:name ?name ;\n" +
" c:importance ?importance .\n" +
"}\n" +
"where {\n" +
" ?tag a ctag:SocialTag ;\n" +
" c:name ?name ;\n" +
" c:importance ?importance .\n" +
"}";
// Create and execute the query on the input model.
return QueryExecutionFactory.create( query, input ).execConstruct();
}
The listings above are just snippets from a working example that defines input
and reads in the data. Here's the entire listing:
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.rdf.model.ResIterator;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.ResourceFactory;
import com.hp.hpl.jena.vocabulary.RDF;
public class CalaisExample {
static final String C = "http://example.org/c#";
static final String CTAG = "http://s.opencalais.com/1/type/tag/";
static final Resource SocialTag = ResourceFactory.createResource( CTAG+"SocialTag" );
static final Property importance = ResourceFactory.createProperty( C+"importance" );
static final Property name = ResourceFactory.createProperty( C+"name" );
// Create a model for the input and read in the data.
static final Model input = ModelFactory.createDefaultModel()
.read( "file:///home/taylorj/tmp/jena-calais/calais.rdf" );
public static void main(String[] args) {
System.out.println( "== Using API ==" );
queryWithAPI().write( System.out );
System.out.println();
System.out.println( "== Using SPARQL ==" );
queryWithSPARQL().write( System.out );
}
public static Model queryWithAPI() {
// Create a model for the output, and add the prefix mappings
// from the input model. This step isn't necessary, but it
// makes the output easier to read.
final Model results = ModelFactory.createDefaultModel();
results.setNsPrefixes( input );
// Iterate through the SocialTags in the data, and for each SocialTag s, retrieve
// the statements [s, name, ?name] and [s, importance, ?importance] from the input
// model, and add them to the results.
for ( final ResIterator it = input.listResourcesWithProperty( RDF.type, SocialTag ); it.hasNext(); ) {
final Resource socialTag = it.next();
results.add( socialTag.getProperty( importance ));
results.add( socialTag.getProperty( name ));
}
return results;
}
public static Model queryWithSPARQL() {
// A SPARQL query that retrieves each SocialTag and its name
// and importance, and constructs a model containing just the
// name and importance statements.
final String query = "" +
"prefix rdf: <"+RDF.getURI()+">\n" +
"prefix ctag: <"+CTAG+">\n" +
"prefix c: <"+C+">" +
"construct {\n" +
" ?tag c:name ?name ;\n" +
" c:importance ?importance .\n" +
"}\n" +
"where {\n" +
" ?tag a ctag:SocialTag ;\n" +
" c:name ?name ;\n" +
" c:importance ?importance .\n" +
"}";
// Create and execute the query on the input model.
return QueryExecutionFactory.create( query, input ).execConstruct();
}
}
Here's the output:
== Using API ==
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:c="http://example.org/c#"
xmlns:ctag="http://s.opencalais.com/1/type/tag/"
xmlns:csys="http://s.opencalais.com/1/type/sys/" >
<rdf:Description rdf:about="http://d.opencalais.com/dochash-1/6ee25504-ff98-34e4-af60-dde69f5ddf73/SocialTag/10">
<c:name>Cisco IOS</c:name>
<c:importance>2</c:importance>
</rdf:Description>
</rdf:RDF>
== Using SPARQL ==
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:c="http://example.org/c#"
xmlns:ctag="http://s.opencalais.com/1/type/tag/"
xmlns:csys="http://s.opencalais.com/1/type/sys/" >
<rdf:Description rdf:about="http://d.opencalais.com/dochash-1/6ee25504-ff98-34e4-af60-dde69f5ddf73/SocialTag/10">
<c:importance>2</c:importance>
<c:name>Cisco IOS</c:name>
</rdf:Description>
</rdf:RDF>
Upvotes: 3