(1)Resource Description Framework(资源描述框架 RDF)是W3C推荐的标准,与XML、SOAP等web标准并排,是一个用于表达关于万维网上的资源的信息的语言。
RDF使用URI来标识任何事物,并通过属性和属性值来描述资源。资源、属性和属性值的组合可以形成一个陈述句,其中资源是陈述句的主体,属性时陈述句的谓语,属性值是陈述句的客体。主语、谓语、客体称为RDF的三元组。
例:《XXX》的作者是XX:在这个陈述句中,《XXX》是主体,作者是谓语,XX是客体。
RDF就是这些一个个的陈述语句构成的,RDF模型可以转换成图结构,其中主体和客体代表图的节点,谓语代表边。
下图所示:
用陈述句表示就是:《XXX》的作者是XX,出版时间是1900年
关于RDF我找到的比较全面的参考资料有:
RDF入门推荐标准(中文版)http://zh.transwiki.org/cn/rdfprimer.htm W3CSchool的RDF教程:http://www.w3school.com.cn/rdf/index.asp
(2)Jena是Apache的一个开源项目,用于构建语义Web程序,它提供了一组工具和Java库来帮助你开发语义web,链接数据应用等。
我也是刚刚开始接触Jena和RDF,所以本文的应用实例都是通过阅读Jena官网上的文档学习而来。代码通过注释说明:
参考资料:http://jena.apache.org/tutorials/rdf_api.html。其中还有很多example,分别讲了构建RDF模型,读取RDF文件,生成RDF文件等。
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.Statement;
import com.hp.hpl.jena.rdf.model.StmtIterator;
import com.hp.hpl.jena.vocabulary.VCARD;
public class JenaRDF
{
public static void main(String args[])
{
String personURI = "http://somewhere/JohnSmith";
String fullName = "John Smith";
String givenName = "John";
String familyName = "Smith";
//要创建RDF模型,首先要通过模型工厂创建一个Model
Model model = ModelFactory.createDefaultModel();
//创建一个名为personURI的资源,资源是模型中的节点
Resource johnSmith = model.createResource(personURI);
//addProperty方法是给资源添加谓语和客体,所以有两个参数。另外,因为方法的返回值是资源本身,所以可以级联的给资源添加属性。
//这里的谓语使用的是VCARD规范,也可以自定义谓语
//Parameters:
// p - The property to be added.
// o - The value of the property to be added.
johnSmith.addProperty(VCARD.FN, fullName).addProperty(VCARD.N, model.createResource().addProperty(VCARD.Given, givenName).addProperty(null,familyName));//表示电子名片的命名空\
//显示RDF模型中的三元组
//列出Model中的statements
StmtIterator iter = model.listStatements();
while(iter.hasNext())
{
Statement stmt = iter.nextStatement();
Resource subject = stmt.getSubject();
Property predicate = stmt.getPredicate();
RDFNode object = stmt.getObject();
System.out.print(subject.toString());
System.out.print(" "+predicate.toString()+" ");
if(object instanceof Resource)
{
System.out.print(object.toString());
}
else
System.out.print(" \""+object.toString()+"\"");
System.out.println(" .");
}
model.write(System.out,"RDF/XML-ABBREV");
model.write(System.out,"N-TRIPLE");
}
}