RDF结合Jena初步基础学习(一)

2019-08-03   90 次阅读


date: 2019-08-03 14:15:21

资源具有属性
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");
}

官方教程之一: http://jena.apache.org/tutorials/rdf_api.html
如何在Eclipse中配置Jena : http://jena.apache.org/tutorials/using_jena_with_eclipse.html

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议