最近,一直在学习本体可视化的方面的知识,现在本体描述语言主要是owl和rdfs两种,本体可视化就是对owl和rdfs本体片断用解析工具(jena)进行解析,然后用prefuse或touchgraph等工具进行呈现。这些工具都是基于java实现,所以我们的开发工具是eclipse.
我们选用的例子的是 河南师范大学 计算机与信息技术学院的 王岁花,张晓丹,王越 发表在 河南师范大学学报(自然科学版)第40卷 第2期上的一篇命为“基于关系数据库的OWL本体存储及查询方法”为内容,进行可视化。
用prefuse对owl本体片断进行可视化,可分为两步进行
一.用Jena对owl本体片断进行解析,存入数据库
(此例子是由别人完成,我是只是经她同意后整理发表)
OWL提供了许多描述类、属性、个体的词汇,以及丰富的公理,不仅能准确描述知识中的类、属性、个体,还能对它们之间的关系进行精确描述,为知识的推理做了良好的准备.本文通过细致考虑OWL的构词,对其中的OWL属性特征和属性约束等关键存储问题进行了重点研究,保证了OWL本体存储到关系数据库后语义信息的完整性,从而解决了资源之间的复杂关系问题.
1.1构词和公理
① OWL类的构词有6种:简单类(class),枚举类(one of),属性约束类(values of),交集类(intersection of),并集类(union of),补集类(complement of).
② 描述类公理的构词有4种:类存在,子关系公理(subclass of),等价关系公理(equivalentclass),互斥关系公理(disjoint with)
③ 描述OWL属性的构词有2种:对象属性(op,object property)和数据类型属性(dp,data property).对象属性是将主体所属类(owl:domain,定义域)的个体和客体所属类(range,值域)的个体联系起来.数据类型属性是将主体所属类的个体和客体的数据值联系起来.
④ 描述OWL属性特征的构词有6种:等价属性(equivalent property),逆属性(inverse of),传递属性(transitive property),对称属性(symmetric property),函数型属性(functional property),反函数型属性(inversefunctional property)
⑤ 描述OWL属性值约束的构词有3种:所有值约束(allvalues from),部分值约束(somevalues),属性值(hasvalue),这些约束构词用来约束属性的值域.
⑥ 描述OWL属性基数约束的构词有3种:最小基数(mincardinality),最大基数(maxcardinality),完全基数(cardinality),这些约束构词用来约束属性取值的数量.
⑦ 描述OWL实例约束的构词有3种:sameas,different from,alldiferent.
1.2 OWL本体关系数据库的构建
从OWL本体中分离类、属性、属性特征、属性约束和实例,建立相应的关系数数据库表。
①类表 类(类URI,类名,描述类型,描述值)主键:{类URI}
②属性表 属性(属性URI,属性名,属性类型,定义域,值域) 主键:{属性URI}
属性类型字段表明该属性是对象属性(OP)还是数据类型属性(DP)。
③属性特征表 属性特征(属性URI,属性名,特征类型,特征值)主键:{属性URI}
④属性约束表 属性约束(类URI,属性URI,约束类型,约束值)
主键:{类URI,属性URI,约束类型}
此表可以作为类表和属性表间的联系表
⑤实例表 实例(实例URI,实例名,类URI,属性URI,属性值) 主键:{实例URI,属性URI}//原文此处是 主键:{实例URI}
1.3 构建owl本体片断
<?xml version="1.0"?> <!DOCTYPE rdf:RDF [ <!ENTITY owl "http://www.w3.org/2002/07/owl#" > <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" > <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" > <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" > ]> <rdf:RDF xmlns="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#" xml:base="http://www.semanticweb.org/ontologies/2012/10/logistics.owl" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:owl="http://www.w3.org/2002/07/owl#"> <owl:Ontology rdf:about="http://www.semanticweb.org/ontologies/2012/10/logistics.owl"/> <!-- /// // // Datatypes // /// --> <!-- http://www.w3.org/2001/XMLSchema#date --> <rdfs:Datatype rdf:about="&xsd;date"/> <!-- /// // // Object Properties // /// --> <!-- http://www.semanticweb.org/ontologies/2012/10/logistics.owl#下订单 --> <owl:ObjectProperty rdf:about="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#下订单"> <rdfs:range rdf:resource="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#销售商"/> <rdfs:domain rdf:resource="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#顾客"/> </owl:ObjectProperty> <!-- http://www.semanticweb.org/ontologies/2012/10/logistics.owl#发货 --> <owl:ObjectProperty rdf:about="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#发货"> <owl:inverseOf rdf:resource="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#下订单"/> <rdfs:domain rdf:resource="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#销售商"/> <rdfs:range rdf:resource="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#顾客"/> </owl:ObjectProperty> <!-- http://www.semanticweb.org/ontologies/2012/10/logistics.owl#订货人 --> <owl:ObjectProperty rdf:about="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#订货人"> <rdfs:domain rdf:resource="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#订单"/> <rdfs:range rdf:resource="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#顾客"/> </owl:ObjectProperty> <!-- /// // // Data properties // /// --> <!-- http://www.semanticweb.org/ontologies/2012/10/logistics.owl#发货日期 --> <owl:DatatypeProperty rdf:about="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#发货日期"> <rdfs:domain rdf:resource="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#销售商"/> <rdfs:range rdf:resource="&xsd;date"/> </owl:DatatypeProperty> <!-- http://www.semanticweb.org/ontologies/2012/10/logistics.owl#订货数量 --> <owl:DatatypeProperty rdf:about="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#订货数量"> <rdfs:domain rdf:resource="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#订单"/> <rdfs:range rdf:resource="&xsd;positiveInteger"/> </owl:DatatypeProperty> <!-- http://www.semanticweb.org/ontologies/2012/10/logistics.owl#订货日期 --> <owl:DatatypeProperty rdf:about="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#订货日期"> <rdfs:domain rdf:resource="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#订单"/> <rdfs:range rdf:resource="&xsd;date"/> </owl:DatatypeProperty> <!-- /// // // Classes // /// --> <!-- http://www.semanticweb.org/ontologies/2012/10/logistics.owl#一般顾客 --> <owl:Class rdf:about="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#一般顾客"> <rdfs:subClassOf rdf:resource="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#顾客"/> </owl:Class> <!-- http://www.semanticweb.org/ontologies/2012/10/logistics.owl#团体顾客 --> <owl:Class rdf:about="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#团体顾客"> <rdfs:subClassOf rdf:resource="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#顾客"/> </owl:Class> <!-- http://www.semanticweb.org/ontologies/2012/10/logistics.owl#订单 --> <owl:Class rdf:about="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#订单"> <owl:equivalentClass> <owl:Restriction> <owl:onProperty rdf:resource="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#订货数量"/> <owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality> <owl:onDataRange rdf:resource="&xsd;positiveInteger"/> </owl:Restriction> </owl:equivalentClass> <owl:equivalentClass> <owl:Restriction> <owl:onProperty rdf:resource="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#订货数量"/> <owl:maxCardinality rdf:datatype="&xsd;nonNegativeInteger">100</owl:maxCardinality> <owl:onDataRange rdf:resource="&xsd;positiveInteger"/> </owl:Restriction> </owl:equivalentClass> </owl:Class> <!-- http://www.semanticweb.org/ontologies/2012/10/logistics.owl#销售商 --> <owl:Class rdf:about="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#销售商"/> <!-- http://www.semanticweb.org/ontologies/2012/10/logistics.owl#顾客 --> <owl:Class rdf:about="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#顾客"/> <!-- /// // // Individuals // /// --> <!-- http://www.semanticweb.org/ontologies/2012/10/logistics.owl#李明 --> <owl:NamedIndividual rdf:about="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#李明"> <rdf:type rdf:resource="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#团体顾客"/> <下订单 rdf:resource="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#麦考林"/> </owl:NamedIndividual> <!-- http://www.semanticweb.org/ontologies/2012/10/logistics.owl#淘宝 --> <owl:NamedIndividual rdf:about="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#淘宝"> <rdf:type rdf:resource="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#销售商"/> <发货日期 rdf:datatype="&xsd;date">2011-04-05</发货日期> </owl:NamedIndividual> <!-- http://www.semanticweb.org/ontologies/2012/10/logistics.owl#雪地靴 --> <owl:NamedIndividual rdf:about="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#雪地靴"> <rdf:type rdf:resource="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#订单"/> <订货日期 rdf:datatype="&xsd;date">2012-11-11</订货日期> <订货数量 rdf:datatype="&xsd;positiveInteger">60</订货数量> <订货人 rdf:resource="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#李明"/> </owl:NamedIndividual> <!-- http://www.semanticweb.org/ontologies/2012/10/logistics.owl#韩梅梅 --> <owl:NamedIndividual rdf:about="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#韩梅梅"> <rdf:type rdf:resource="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#一般顾客"/> <下订单 rdf:resource="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#淘宝"/> </owl:NamedIndividual> <!-- http://www.semanticweb.org/ontologies/2012/10/logistics.owl#高跟鞋 --> <owl:NamedIndividual rdf:about="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#高跟鞋"> <rdf:type rdf:resource="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#订单"/> <订货数量 rdf:datatype="&xsd;positiveInteger">10</订货数量> <订货日期 rdf:datatype="&xsd;date">2011-04-01</订货日期> <订货人 rdf:resource="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#韩梅梅"/> </owl:NamedIndividual> <!-- http://www.semanticweb.org/ontologies/2012/10/logistics.owl#麦考林 --> <owl:NamedIndividual rdf:about="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#麦考林"> <rdf:type rdf:resource="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#销售商"/> <发货 rdf:resource="http://www.semanticweb.org/ontologies/2012/10/logistics.owl#李明"/> </owl:NamedIndividual> </rdf:RDF> <!-- Generated by the OWL API (version 3.1.0.20069) http://owlapi.sourceforge.net -->
1.3 用Jena进行解析
数据库选用的mysql,解析需要的jena架包是jena-2.6.4.zip解压后lib文件夹下所有*.jar。全部导入就可以。
由于这部分是别人做的,不方便把代码贴出来,贴最后效果吧
1.类表 ontologyclass
主键:C_Uri
2. 属性表 property
主键:Proty_URI
3.属性约束表 propertyrestriction
主键: R_Curi,R_Puri,R_Type
4.属性特征值表 propertytrait
主键 :PC_URI
5.实例表 individual
主键:Indiv_URI,Indiv_PURI
至此,就完成了owl本体片断的解析。
二.用prefuse进行可视化呈现 将在下篇文章中详细说明。
转载本文请标明出处。