现在的位置: 首页 > 综合 > 正文

研究本体逻辑NoSQL方案

2012年04月07日 ⁄ 综合 ⁄ 共 2699字 ⁄ 字号 评论关闭

研究本体逻辑NoSQL方案

一.研究说明

1. 本体

本体论是一个概念化的规范(a specification of a conceptualization),在计算机科学领域,其核心意思是指一种模型,用于描述由一套对象类型(概念或者说)、属性以及关系类型所构成的世界。尽管不同的本体对于这些构成成分的确切称谓有所不同,但它们却都是一部本体不可或缺的基本要素。一般来说,人们所普遍期望的一点就是,本体之中模型的那些特征应当非常类似于相应的现实世界。

2. mongoDB数据库

MongoDB是一个基于分布式文件存储的数据库,旨在为WEB应用提供可护展的高性能数据存储解决方案。

它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:
*面向集合存储,易存储对象类型的数据。 
*模式自由。
*支持动态查询。 
*支持完全索引,包含内部对象。 
*支持查询。 
*支持复制和故障恢复。 
*使用高效的二进制数据存储,包括大型对象(如视频等)。
*自动处理碎片,以支持云计算层次的扩展性
*支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
*文件存储格式为BSON(一种JSON的扩展)
*可通过网络访问

根据本体的结构特点,设计了一种基于mongoDB的存储方法。mongoDB是一个面向文档的数据库,没有模式的概念,可以很方便的存储结构对象的信息,可以很方便的将本体转换成文档结构的BSON(一种类似JSON的格式,但是是二进制序列化的)结构存储在mongoDB中。

3.Jena工具

一、介绍Jena 
Jena由 HP Labs(http://www.hpl.hp.com)开发的Java开发工具包, 用于Semantic Web(语义网)中的应用程序开发;Jana是开源的,在下载的文档中有Jena的完整代码。Jena框架主要包括: 
a)以RDF/XML、三元组形式读写RDF 
    资源描述框架是(RDF)是描述资源的一项标准(在技术上是W3C的推荐标准),Jena文档中有一部分呢详细介绍了RDF和Jena RDF API,其内容包括对Jena RDF包的介绍、RDF模型的创建、读写、查询等操作,以及RDF容器等的讨论。 

b)RDFS,OWL,DAML+OIL等本体的操作 
    Jena框架包含一个本体子系统(Ontology Subsystem),它提供的API允许处理基于RDF的本体数据,也就是说,它支持OWL,DAML+OIL和RDFS。本体API与推理子系统结合可以从特定本体中提取信息,Jena 2还提供文档管理器(OntDocumentManager)以支持对导入本体的文档管理。 

c)利用数据库保存数据 
     Jena 2允许将数据存储到硬盘中,或者是OWL文件,或者是关系数据库中。本文处理的本体就是OWL文件读入的。 

二.研究思路

方案一    Jena读取本体OWL文件解析存储到mongoDB

   通过Jena的API可以将描述本体的OWL文件解析每一个statement的Subject,predicate,Object。解析后的形式:如下

[url]  http://dbpedia.org/ontology/VolleyballLeague

[subClassOf]        http://dbpedia.org/ontology/SportsLeague

[label]     ligue de volleyball@fr      volleyball league@en

[type]      http://www.w3.org/2002/07/owl#Class

[comment] A group ofsports teams that compete against each other in
volleyball.@en

存储后的文档格式:如下

{ "_id" : {"$oid" : "507a71093b731926baa997a6"} ,

 "name" :"http://dbpedia.org/ontology/GrandPrix/distance" ,

 "domain": "[http://dbpedia.org/ontology/GrandPrix]" ,

"label" : "[distance (km)@en]" ,

 "type" :"[http://www.w3.org/2002/07/owl#DatatypeProperty]"

}

解析出来的每一个标签组(每一个statement)视作一个document,以key-value的形式存储在同一个collection中。这种方式解析完之后,mongoDB中只有一个collection,存储的文档根据type来区分是类(class),还是类的实例(objectproperty),还是属性(dataproperty)。

 

 

方案二 分集合存储

采取解析OWL的另一种方式,以类型(type)分类,建立三个collection,分别为类的描述(classRes),类实例的描述(instanceRes),属性的描述(propertyRes).此时每个collection中的文档的key包含了name,label,comment,subclass,range,domain等等。

存储后文档的格式

{ "_id" : { "$oid" :"507a72013b738a6e3026a944"} ,

 "ClassName" :"http://dbpedia.org/ontology/Athlete" ,

 "subClassOf" :

 {   "ClassName" :"http://dbpedia.org/ontology/Person" , "equivalentClass" :"http://xmlns.com/foaf/0.1/Person" , "label" : ["person" , "Person" , "pessoa" ,"personne"] , "_id" : { "$oid" :"507a72013b738a6e3026a943"}

} ,

 "label" : [ "athlete" ,"athlète"]

 

 

三.Q&A

Q1:Jena解析有的本体没有类型(type)输出(徐恩所说),至于其他的没有type输出的本体有待研究。若存在没有type的本体,该怎样判别它的类型(不建议用手工的形式去判别后存储)

Q2:OWL标签中的所有owl,rdf等子标签的xmlns均用一个collection存储,在这种情况下,存储稳定的时候,可以在value上只需存储本地化名字(localhost),在后续的事物逻辑上会不会有不方便之处?

 

抱歉!评论已关闭.