存档

文章标签 ‘JENA入门’

用jena api来理解RDF——资源概念

2009年12月26日

RDF作为资源描述框架,有2件事情是它的本职工作,第一,描述资源的唯一性,只有统一了,各种应用才能达成共识,好比秦始皇那会儿一样。第二,要把资源表述得有条有理。下面,拿出代码来解释。

  1. Model model = ModelFactory.createDefaultModel();
  2.  
  3. Resource crab = model.createResource("http://www.crabobe.com/crab");
  4.      
  5. model.write(System.out);

上面,我们用jena建立了crab这样一个资源,当然,crab只是java内存中的一个变量名而已,它真是的标识符号是http://www.crabobe.com/crab,也即,在这个世界上,这个资源是唯一存在的。

我们继续添加一个资源

  1. Model model = ModelFactory.createDefaultModel();
  2.  
  3. Resource crab = model.createResource("http://www.crabobe.com/crab");
  4. Property numerOfLeg = model.createProperty("http://www.crabobe.com/crab#numerOfLeg");
  5.      
  6. model.write(System.out);

这里我们添加了一个资源numerOfLeg,有人问,它是一个属性(Property)吧?没错,但在RDF中,属性也是一种资源,在JENA中,Property是Resource的子接口。既然它是一种资源,那必定得有唯一的标识符,这个标识符就是http://www.crabobe.com/crab#numerOfLeg

接着我们用numerOfLeg这个属性来描述crab

  1. Model model = ModelFactory.createDefaultModel();
  2.  
  3. Resource crab = model.createResource("http://www.crabobe.com/crab");
  4. Property numerOfLeg = model.createProperty("http://www.crabobe.com/crab#numerOfLeg");
  5. crab.addProperty(numerOfLeg, "8");
  6.      
  7. model.write(System.out);

运行的结果:

  1. <rdf:RDF
  2.     xmlns:j.0="http://www.crabobe.com/crab#"
  3.     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" > 
  4.   <rdf:Description rdf:about="http://www.crabobe.com/crab">
  5.     <j.0:numerOfLeg>8</j.0:numerOfLeg>
  6.   </rdf:Description>
  7. </rdf:RDF>

关于这个结果,虽然很简单,但是里面有个细节需要我们去关注!!同样是资源描述符,资源的描述符和属性的描述符是不一样的。区别就体现在,资源的描述符仅仅是作为rdf:Description标签的一个属性,而属性的描述符却要被用来作为XML标签。在这点上来看,属性的资源描述符一定要带有相对路径,假如我们这样写:
model.createProperty(“http://www.crabobe.com”);
那么这个属性标签的命名空间就没有了,如果命名空间标示为http://www.crabobe.com,那它自己的名称呢?所以,jena会报错。
所以,我们的写法可以是这样:

http://www.crabobe.com/crab

那么http://www.crabobe.com/就是命名空间,crab就是标签名称
也可以像例子都那样写:

http://www.crabobe.com/crab#numerOfLeg

那么命名空间就是http://www.crabobe.com/crab#,被jena简写成j.0,名称就是numerOfLeg。

现在,我们来验证资源的唯一性:

  1. Model model = ModelFactory.createDefaultModel();
  2.  
  3. Resource crab = model.createResource("http://www.crabobe.com");
  4. Resource crab1 = model.createResource("http://www.crabobe.com");
  5. Property numerOfLeg = model.createProperty("http://www.crabobe.com/crab#numerOfLeg");
  6. Property numerOfLeg1 = model.createProperty("http://www.crabobe.com/crab#numerOfLeg");
  7. crab.addProperty(numerOfLeg, "8");
  8. crab1.addProperty(numerOfLeg1, "8");
  9.      
  10. model.write(System.out);

这里,我们人为写出2个对象,但是资源描述符写成一样,这2个对象分别有各自属性,按照唯一性,那么内存中即使对象再是多,在RDF规范中,只会认资源描述符,只要资源描述符是一样的,那么就视为一个资源。运行的结果,符合我们的推理。

如果我们改一改:

  1. Model model = ModelFactory.createDefaultModel();
  2.  
  3. Resource crab = model.createResource("http://www.crabobe.com");
  4. Resource crab1 = model.createResource("http://www.crabobe.com");
  5. Property numerOfLeg = model.createProperty("http://www.crabobe.com/crab#numerOfLeg");
  6. Property numerOfLeg1 = model.createProperty("http://www.crabobe.com/crab#numerOfLeg");
  7. crab.addProperty(numerOfLeg, "8");
  8. crab1.addProperty(numerOfLeg1, "10");
  9.      
  10. model.write(System.out);

运行结果是什么?可以思考下,再运行结果,留待大家思考吧~

JENA ,