研究本体逻辑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),在后续的事物逻辑上会不会有不方便之处?