工作数据
这里有一些我们可以实际使用的数据。它基于您的数据,rdf
定义了前缀,以及一些用于制作ctag:SocialTag
和csys:InstanceInfo
工作的附加前缀。这些是可选的,但需要前缀定义c
,因为它已在您的数据中使用。我只是http://example.org/c#
为了方便起见,但您可能已经定义了其他内容。
<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>
一旦你在某个地方获得了这些数据,有两种简单的方法可以使用 Jena 将其取出。第一种是使用 Jena 的 Model API,它提供了检索语句的方法。第二种是使用 SPARQL 查询。您可以使用 Jena 的命令行工具运行 SPARQL 查询,也可以从 Java 程序运行。
使用模型 API
下面的 Java 代码创建了一个results
模型来存储所需的输出,从 中检索 SocialTag 和定义其名称和重要性input
的语句,并将语句复制到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;
}
使用 SPARQL
以下 SPARQLconstruct
查询还检索 SocialTags,然后构造所需的图。
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 .
}
input
这是在模型上执行该查询的 Java 代码。
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();
}
现在都在一起了
上面的清单只是定义input
和读取数据的工作示例的片段。这是整个清单:
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();
}
}
这是输出:
== 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>