Jena对RDF相关操作

RDF(资源描述框架)是一个标准的资源描述语言。什么是资源?我们暂且将任何能够识别的东西作为一个资源。比如说你,你的主页,数字1,或者一头大白鲸,都是资源。
主要内容:
1.Statements描述
2.编写一个RDF
3.读取RDF
4.控制prifix
5.管理模型Model
6.对Models的操作
7.更多关于常量的操作
1.Statements
每个RDF模型中的arc(我理解为一组关系,因为RDF语言本身就是一组Triple)可以看做是一个statement。它对资源进行维护,包含以下三个部分:
Subject:就是arc定义的地方,可以理解为Resource
Predicate:表示arc的属性
Object:表示arc指向的对象(或者常量)。
一个RDF模型其实是以一系列的Statement表示的,每个addProperty语句都会同时向模型中添加一个statement。Jena中model的listStatements方法返回一个StmtIterator。它是一个Statement序列,继承自Iterator。Statement中包含getSubject,getPredictate,getObject方法,可以获取到三元组。由于getObject得到的类型有可能是Resource或者Literal,所以在使用的时候要进行判断。
2.编写一个RDF
编写一个RDF主要有三个步骤:
(1)使用ModelFactory的createDefaultModel()方法构造一个空的model。
(2)使用model的createResource方法,通过URI构建资源。
(3)向Resource中添加属性,使用addProperty方法。
3.读写RDF
Jena支持从文件中读写RDF模型
读取:用read方法读入输入流
      或者用FileManager.get().readModel(model,文件路径)
写入:用write方法
4.控制prefix
在rdf中,定义的url会自动给予一个变量名,如果要改变这个名字,使用自定义的名字,就要用setNsPrefix(设置的变量名,要设置的uri)方法。
例如,使用前输出结果如下
<rdf:RDF
   xmlns:j.0="http://nowhere/else#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:j.1="http://somewhere/else#" >
   <rdf:Description rdf:about="http://somewhere/else#root">
       <j.1:P rdf:resource="http://somewhere/else#x"/>
       <j.1:P rdf:resource="http://somewhere/else#y"/>
   </rdf:Description>
   <rdf:Description rdf:about="http://somewhere/else#y">
       <j.0:Q rdf:resource="http://somewhere/else#z"/>
   </rdf:Description>
</rdf:RDF>

加入语句setNsPrefix("nsA",nsA)后,输出结果如下
<rdf:RDF
   xmlns:j.0="http://nowhere/else#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:nsA="http://somewhere/else#" >
   <rdf:Description rdf:about="http://somewhere/else#root">
       <nsA:P rdf:resource="http://somewhere/else#x"/>
       <nsA:P rdf:resource="http://somewhere/else#y"/>
   </rdf:Description> 
   <rdf:Description rdf:about="http://somewhere/else#y">
      <j.0:Q rdf:resource="http://somewhere/else#z"/>
   </rdf:Description>
</rdf:RDF>

可以看到,j.1变成了nsA

5.管理模型
(1)Model的getResource(URI)方法返回一个Resource,如果不存在则新建一个。
(2)返回Property对象:Resource中的getProperty(pname).getObject()方法,因为gerProperty返回的是一个Statement,所以可以使用Statement的方法返回object。
(3)可以向一个Resource中添加多个属性,addProperty().addProperty()。。。。而且一个属性可以有多个值。
6.更多Model上的操作
合并:model.union(model2)
做相交:model.intersection(model2)
做差集:model.difference(model2)
7.对常量的操作
Model.createLiteral()方法可以新建一个常量,并且用到Property中。
在数据类型的property中添加数据对象的时候,可以直接添加。

猜你喜欢

转载自sophieling.iteye.com/blog/821952