Jena Tutorial(一)
目标:1.把RDF理解为一个图表而不是一个XML文档
2.能够使用Jena在Java中加载一个RDF/XML文件
3.使用Jena写一个RDF图表来作为一个RDF/XML文件
4.在Jena中操作一个RDF图表
Introduction
RDF是一种资源描述标准。从深度上和准确度上说这种资源依然是一些数据。
我们的例子是关于人的。他们使用一种VCARDS的RDF表述方法。RDF是是用节点和弧形图表的形式的最好想法。例如:
Figure 1
资源John Smith作为图表和用URI定义("http://.../JohnSmith”)来显示出来。
资源有属性。在这些例子中,我们对出现在John Smith商业卡中的一系列属性感兴趣。Figure 1仅仅显示出一个属性:John Smith的全名。一个属性用一条弧表示并把属性全名表于弧上。属性的名字也是一个URI,但是这个URI是很长、很繁琐的,在XML的名字表中显示。在“:”之前的叫做前缀命名空间表示一个名字空间,之后的叫做本地本地名字代表在在名字空间中的一个名字。在写成RDF/XML文件时属性常常在全名表中表示出来,这样便于在图表和文档表示时速记。但是严格地说属性是被URI定义的。nsprefix:localname表方便与名字空间的URI和本地名字连接。并不需要通过浏览器来解决一个URI属性。
每一个属性有一个值。在这个案例中这个值叫做文字(literal),一种文字特征类型。文字在矩形框中显示。
Jena是一个Java的API接口,能够用来创建和操作类似于图1的RDF图。Jena有一个课题类来表述图示,资源和文字。表述资源、属性和文字的接口在Jena中叫做资源、属性和文字。在Jena中一个RDF图被称为一个模型,用模型接口来描述。
创建一个模型或这种图很简单:
// some definitions
static String personURI = "http://somewhere/JohnSmith";
static String fullName = "John Smith";
// create an empty Model
Model model = ModelFactory.createDefaultModel();
// create the resource
Resource johnSmith = model.createResource(personURI);
// add the property
johnSmith.addProperty(VCARD.FN, fullName);
用一些常量定义开始,之后在创建一个空模型,用ModelFactory类的方法createDefaultModel()来创建一个记忆的基础模型。Jena包括其他Model接口的扩展,例如:使用关系型数据库,这种类型的模型也可以通过ModelFactory得到。
之后创建资源John Smith并添加进模型中。常量类VCARD提供这种属性,在VCARD计划中提供对所有物体的定义。Jena对其他许多著名的schemas提供常量类,例如:像RDF和RDFschema本身,Dubin Core和DAML。
像创建资源和添加属性的代码可以很简洁地用瀑布方式书写:
Resource johnSmith =
model.createResource(personURI)
.addProperty(VCARD.FN, fullName);
现在让我们为vcard增加更多详细的描述,来探索RDF和Jena的一些特性。
在第一个例子中,属性的值是一个文字。RDF也可以把其他的资源作为他的属性值。使用一个公共的RDF技术,来显示怎样表达JohnSmith名字的其他部分。
Figure 2
这儿我们增加一个新的属性vcard:N来代表John Smith的名字结构。vcard:N用其他的资源作为他的值,描述复合结构的椭圆并没有一个URI,这样的节点叫做空白节点。
表述这中结构的Jena代码也很简单,先有声明之后创建一个空白模型。
tutorial2 // some definitions
String personURI = "http://somewhere/JohnSmith";
String givenName = "John";
String familyName = "Smith";
String fullName = givenName + " " + familyName;
// create an empty Model
Model model = ModelFactory.createDefaultModel();
// create the resource
// and add the properties cascading style
Resource johnSmith
= model.createResource(personURI) //增加一个节点
.addProperty(VCARD.FN, fullName)
.addProperty(VCARD.N,
model.createResource()
.addProperty(VCARD.Given, givenName)
.addProperty(VCARD.Family, familyName));
陈述
在每一个RDF图中的弧叫做一个陈述。每一个陈述断言关于资源的一个事实。每一个陈述有三个部分:
Ø 主体是来自于弧起始点的资源
Ø 谓词是标于弧上的属性
Ø 客体是弧指向的资源或文字
一个陈述有时也叫做三元组。
每一个RDF模型代表一些陈述。相同的陈述是没有作用的。Jena模型接口定义了listStatements()
方法,以返回一个
Java
的
Iterator
字类型
StmtIterator
。
StmtIterator
有一个方法
nextStatement()
来从
iterator
中返回下一个陈述。
Statement
接口提供了得到陈述主体、谓词、客体的方法。
Tutorial3扩展了tutorial2列出所有的已创造的陈述并输出。
Tutorial3 // list the statements in the Model
StmtIterator iter = model.listStatements();
// print out the predicate, subject and object of each statement
while (iter.hasNext()) {
Statement stmt = iter.nextStatement(); // get next statement
Resource subject = stmt.getSubject(); // get the subject
Property predicate = stmt.getPredicate(); // get the predicate
RDFNode object = stmt.getObject(); // get the object
System.out.print(subject.toString());
System.out.print(" " + predicate.toString() + " ");
if (object instanceof Resource) {
System.out.print(object.toString());
} else {
// object is a literal
System.out.print(" /"" + object.toString() + "/"");
}
System.out.println(" .");
}
一个陈述的客体是资源或是文字,getObject()
方法返回客体的类型作为
RDFNode
(一种公共的资源和文字的父类),后面的客体通过
instanceof
确定类型和处理方法。
输出如下:
http://somewhere/JohnSmith http://www.w3.org/2001/vcard-rdf/3.0#N anon:14df86:ecc3dee17b:-7fff .
anon:14df86:ecc3dee17b:-7fff http://www.w3.org/2001/vcard-rdf/3.0#Family "Smith" .
anon:14df86:ecc3dee17b:-7fff http://www.w3.org/2001/vcard-rdf/3.0#Given "John" .
http://somewhere/JohnSmith http://www.w3.org/2001/vcard-rdf/3.0#FN "John Smith" .