资源具有属性
Jena是一个Java API,可用于创建和操作RDF图,Jena有对象类表示图形,资源,属性和文字
表示资源的接口: Resource
表示属性的接口: Property
表示文字的接口: Literal
在Jnea中,图形称为模型,由接口 Model 表示
Model model = ModelFactory.createDefaultModel();
使用该方法创建基于内存的模型
Resource joinSmith = model.createResource(personURI);
使用该方法创建资源
“常量”类:VCARD,该类保存表示VCARD模式中所有定义的对象
joinSmith.addProperty(VCARD.FN, fullName);
给资源添加属性
创建资源和添加属性还可以更紧凑的以级联样式编写:Resource joinSmith =
model.createResource(personURI)
.addProperty(VCARD.FN , fullName);
可定义空节点
model.createResource()
括号内不含参数即可定义一个空节点
RDF模型中一般一个语句包含三个部分
subject:箭头出发点
predicate:箭头
object: 箭头目的地
可称为主语,谓语和宾语
主语——谓语——>宾语
example:// 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(" .");
}
listStatements() 方法
该方法返回一个StmIterator, 一种可以遍历模型中所有语句的迭代器(这里的谷歌翻译真是醉了,还好切回英文读懂了,不然简直了)
nextStatement() 方法
该方法从迭代器中返回当前的下一个语句
使用
Statement 进行一个语句的初始化
Statement stmt = iter.nextStatement();
在此基础上分别通过
.getSubject()获取该语句的主语subject
.getPredicate() 获取该语句的谓语Predicate
.getObject()获取该语句的宾语Object
iter.hasNext()
个人理解: iter即当前迭代器,`hasNext()是一个布尔型函数,如果迭代器当前位置之后没有语句了,就返回false,否则返回true
.write(System.out)方法
将一个模型以RDF的形式写出来
model.write(System.out);
要写入大文件并保留空白节点,请以N-TRUPLES格式写入
model.write(System.out,"N-TRIPLES");
===从文件中读取RDF===
example:// create an empty model
Model model = ModelFactory.createDefaultModel();
// use the FileManager to find the input file
InputStream in = FileManager.get().open( inputFileName );
if (in == null) {
throw new IllegalArgumentException(
"File: " + inputFileName + " not found");
}
// read the RDF/XML file
model.read(in, null);
// write it to standard out
model.write(System.out);
使用.read()函数来对文件进行读取
model.read(in,null);
in为创建的输入流
setNsPrefix(String prefix,String URI)
声明命名空间URI可以缩写成prefix(为了方便,因为有些命名空间真的太长了,每次写非常麻烦),Jena要求prefix是一个合法的XML命名空间名称,并URI以非名称字符结尾
给定资源的URI,可以用下列方法从模型中检索资源对象
Resource name = model.getResource(johnSmithURI);
访问资源的属性如下
Resource.getProperty(Property p);
—查询模型—
Model.listStatements() 列出模型中所有语句,但是不适用于数据量大的模型
Model.listStatementWithProperty(Property p,RDFNode o)
将会返回一个迭代器,包含所有含有属性p,并且value是o的资源
选择器
Selector selector = new SimpleSelector(subject, predicate, object);
如果三个参数中任意一个为null,将相当于Sparql中的SELECT *
如果三个参数都为null,则选择模型中的所有语句
Selector selector = new SimpleSelector(null,VCARD.FN,null);
将选择
谓语是VCARD.FN的所有语句
容器Bag是无序集合
ALT是一种旨在代表替代品的无序集合
SEQ是有序集合
创建一个Bag容器
Bag smiths = model.createBag();
容器接口提供一个迭代器来列出容器的内容
NodeIterator iter2 = smiths.iterator();
可以像上述那样用迭代器遍历if (iter2.hasNext()) {
System.out.println("The bag contains:");
while (iter2.hasNext()) {
System.out.println(" " +
((Resource) iter2.next())
.getProperty(VCARD.FN)
.getString());
}
} else {
System.out.println("The bag is empty");
}