how to get specific tag related information from R

2019-03-04 05:58发布

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

标签: java rdf jena
1条回答
地球回转人心会变
2楼-- · 2019-03-04 06:38

Working Data

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.

Using the Model API

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

Using SPARQL

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

All together now

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>
查看更多
登录 后发表回答