Introduction
资源描述框架(RDF)是描述资源的标准(W3C)。资源是我们能够想到的任何事物。在本文中,将使用 RDF representation of VCARDS, 一个简单的vcard表现为RDF的形式可如图1所示,
图1. A simple vcard in RDF
图中的椭圆中的John Smith,是以Uniform Resource Identifier (URI)标识的资源。
资源是有是有属性的,在图1中,只有一个属性(John Smith's 全名)。 属性在图中用弧表示,property作为该弧的标签。
Statements
Statement就是RDF三元组(主语 谓语 宾语)
Jena框架的Model接口定义了listStatement()方法,该方法会返回Model中所有Statements的StmtIterator(java Iterator的子类型)。StmtIterator的nextStatement()方法返回当前statement的下一个statement。
列出指定Model的所有statements
//list the statements in the model StmtIterator iter = model.listStatements(); while(iter.hasNext()) { Statement stmt = iter.nextStatement(); //get the subject, predicate, object of this statement. Resource subject = stmt.getSubject(); Property predicate = stmt.getPredicate(); RDFNode object = stmt.getObject(); // RDFNode是Resource和Literal的父类。 }
Writing RDF
Jena提供了以XML格式读写RDF的方法。
model.write(System.out); model.write(System.out, "RDF/XML-ABBREV"); model.write(System.out, "N-TRIPLE");
Reading RDF
Model model = ModelFactory.createDefaultModel(); 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);
Controlling Prefixes
前缀定义包括两种方式:
①显式前缀定义
②隐式前缀定义
Jena RDF Packages
com.hp.hpl.jena.rdf.model是关键的RDF包,这个包囊括了RDF领域的概念:models, resources, properties, literals, statements等等,同时还包括了创建models的ModelFactory.
com.hp.hpl.jena.tutorial
com.hp.hpl.jena...impl是实现类包
Navigating a Model
前面赘述的都是关于对RDF Model的创建、读和写。这章主要介绍如何访问Model中的信息。
我们能够根绝给出的Resource URI 从model中检索出我们想要的Resource对象,
//Model.getResource(String uri);
如果这个对象存在,则返回该对象,反之,则创建该对象。// retrieve the John Smith vcard resource from the model Resource vcard = model.getResource(johnSmithURI);
Resrouce接口定义了一系列用来访问Resource Properties的方法。
一般地,一个statement的object可以是一个Resource或者一个Literal。因此,应用程序需要知道Resource的类型,才能准确的声明Object返回的类型。为了解决这个问题,Jena提供了不需要在编译阶段声明和类型检查的方法。因此上述代码可以简述为://Resource.getProperty(Property p); //retrieve the value of the N property Resrouce name = (Resrouce) vcard.getProperty(VCARD.N).getObject();
// retrieve the value of the FN property Resource name = vcard.getProperty(VCARD.N).getResource();
如果object是literal类型的,则使用代码:
上述的实例中,vcard resource只有一个vcard:FN 和一个vcard:N 属性。RDF允许Resource的属性有多个值。例如,Adam可以有两个昵称。// retrieve the given name property String fullName = vcard.getProperty(VCARD.FN).getString();
Jena的RDF Model是由一系列的statements组成的,因此向model中添加已经存在的<subject,predicate,object>的statement是无效的。在property可能出现多次的情况下,Jena的Resource.listProperties(Property p)方法能够穷举出当前Model中所持有的Property的value。// add two nickname properties to vcard vcard.addProperty(VCARD.NICKNAME, "Smithy").addProperty(VCARD.NICKNAME, "Adman");
// set up the output System.out.println("The nicknames of \"" + fullName + "\" are:"); // list the nicknames StmtIterator iter = vcard.listProperties(VCARD.NICKNAME); while (iter.hasNext()) { System.out.println(" " + iter.nextStatement() .getObject() .toString()); }
Querying a Model
Querying a Model顾名思义就是搜索一个Model。Jena Core提供的API只提供了有限的查询方法。(更全面的查询可查看 RDQL查询语言)
Jena中查询Model的关键接口为selector,当前Jean版本下,com.hp.hpl.jena.rdf.model包中的类SimpleSelector实现了该接口。 SimpleSelector有三个参数:
上述代码将会返回所有subject,predicate,object与给定参数都匹配的所有statements.Selector selector = new SimpleSelector(subject, predicate, object)
上述代码将会返回model中所有的statements。Selector selector = new SimpleSelector(null, null, null);
上述代码将会返回Predicate为VCARD.FN的statements.Selector selector = new SimpleSelector(null, VCARD.FN, null);
listStatement (S, P, O) is equivalent to listStatements(new SimpleSelector(S, P, O))