① 语义信息的存储
无论是知识库还是服务的语义描述都需要具有良好的组织和存储,以支持高效推理和服务检索发现。目前对于本体的存储方法基本有三种(李勇等,2008):
(1)纯文本,如 OWL 文件。由于 XML 的信息组织和存储方式结构复杂,而且存在冗余等,基于其上的查询检索效率通常会比较低。纯文本的方式适合本体比较小的时候,不适合本体大规模应用的情况。
(2)数据库: 是一种比较好的持久化存储方式,最大好处是便于查找,可存放大本体,查询效率高,特别在 I/O 效率上。但是数据库方式存在本体查询语言到 sql 的转换问题,需要借助于第三方中间件或自定义实现。
(3)专门的管理工具: 比如说 OMM(Ontology Middleware Mole)支持对 RDF、OWL 的存储管理,还提供各种接口,可以使用查询语言对 RDF 或者 OWL 进行查询。综合对比这三种本体存储方式,由于关系数据库存储几十年的技术积累,以及它的海量存储特点而成为了许多研究者的首选。
5.4.3.1 本体的关系数据库存储模式
由于本体模型和关系模型的差异,目前存在多种在关系模型中存储本体的方法,其主要可以分为以下四类(陶皖等,2007; 陈光仪,2009)。
5.4.3.1.1 水平模式
该模式只在数据库中保留一张通用表,表中列为本体中的属性。整个本体库中定义了多少个属性,这张表就有多少个列,具体如图 5.28 所示。本体中的每个实例对应该表中的一条记录。这种存储模式结构简单,执行查询操作比较方便。但是该通用表包含了大量的列,而现有的数据库系统对一张表中列的个数都是有限制的,所以该模式无法存储规模较大的本体。而且表中的数据过于稀疏。由于每个实例对应关系表中的一行,如果其在某些属性列上没有值,那么必须将对应的属性值设置为空,这将导致大量空字段的出现,不仅浪费存储空间,而且增加了索引维护的代价。另外该通用表中一个实例的属性和属性值只能是一对一,而实际情况往往是一对多,因此无法存储具有这种特征的本体。随着应用中本体的进化,还需要时常更新通用表中的列,重新组织表结构,这将耗费极大的系统代价。
图 5.28 水平存储模式
5.4.3.1.2 垂直模式
垂直模式包含一张三元组表,表中的每条记录都对应一个 RDF 三元组(主语,谓词,宾语),具体如图 5.29 所示。因此这种模式下,需要将本体中的所有信息都以 RDF 三元组的形式表示出来。Protege(2002)中便是使用了这种存储模式将本体存储于数据库中。这种模式设计简单,并且结构稳定。如果本体进行了更新,只需修改表中相应的元组即可。另外,该模式通用性好,因为现有的本体模型都可以转换为 RDF 模型表示。但是这种模式的可读性较差,若对本体信息进行查询,那么设计对应的 SQL 语句比较麻烦。除此之外,由于所有信息都存放在三元组表中,导致任何一个本体信息查询都必须遍历整个数据表,特别是那些需要进行表连接的查询,使得查询效率非常低,这是这种模式最大的不足之处。
图 5.29 垂直存储模式
5.4.3.1.3 分解模式
该模式与水平模式和垂直模式的一个显着的区别是它使用了若干张表,其基本思想是将数据库进行模式分解。根据分解的对象不同,现有的采用分解模式的方法有两种。①基于类的分解模式,即为本体中的每个类都创建一张单独的表,表名为类名,表的列为类的属性,具体如图 5.30 所示。这种模式结构清晰,但是很难适应本体动态变化的情况,因为随着本体中类或者属性的变化,表结构都要随着变化。②基于属性的分解模式,即为本体中的每个属性创建一张单独的表,表名为属性名,每个表都包含两个列,分别代表RDF 三元组中的主语和宾语,具体如图 5.31 所示。在该模式中对类的隐含实例的查询代价很大,而且在现有的这两种分解模式的方法中,随着本体的变化都要不断的创建和删除表,而在数据库系统中创建和删除表的效率很低。
图 5.30 按类分解模式
图 5.31 按属性分解模式
5.4.3.1.4 混合模式
该模式通常将上述几种模式进行混合使用。例如,Pan 等(2003)提出这样一种将基于类的分解模式与基于属性的分解模式混合的存储模式,即在本体中定义一个类就为该类创建一个表(创建方法类似于基于类的分解模式),在本体中定义一个属性就为该属性创建一个表(创建方法类似于基于属性的分解模式)。然而,与基于类的分解模式不同的是,该混合模式在类对应的表中不记录相应实例的所有信息,而只记录实例的 ID。实例在各个属性上的取值则分别记录在各属性对应的表中,所以和基于属性的分解模式类似,该模式在属性对应的表中仍然需要两列: 主语和宾语。对于本体类数目不多的情况下,这种模式在简单检索的情况下,运行得很好。但是,如果本体的类比较多,这种方式就会存在一些问题,例如: 数据库无法容纳这么多表,或者效率低下。
针对上述四种模式,陈光仪(2009)从四个方面对适用场合、查询和更新效率、结构清晰以及易理解性、可扩展性四个方面对他们进行了综合对比(表 5.4):
表 5.4 不同存储模式的综合对比
(修改自陈光仪,2009)
通过上述对本体存储模式的阐述及之间的综合对比发现,本体存储模式除了应该具有尽量高的规范化程度(例如满足第三范式或 BCNF 范围等),还应该满足以下三个原则。
(1)模式结构易于理解。该原则是为了便于本体查询的实现。如果模式结构不直观,会给查询语句的设计带来困难。例如,垂直模式不满足该要求,它将所有的信息都采用三元组的形式存储在一张表中,不容易理解表中元组的含义,加重了本体查询设计的负担。
(2)模式结构稳定。即本体的变化不会引起数据库表结构的变化。因为本体是不断进化的,如果设计的模式结构会随着本体的变化而变化,数据库系统对其维护代价太大。现有的水平模式、分解模式和混合模式都不满足该要求。
(3)查询效率高。该原则是评价各种存储模式的一个重要指标。因为本体中不仅包含大量的数据,而且查询中还经常需要进行表连接。例如在现有的垂直模式和基于属性的分解模式中,那些涉及表连接的查询效率非常低。
目前在基于数据库的本体存储的实践上,一些学者开展了相关的研究工作:
燕云鹏(2007)和陈光仪(2009)提出了类似的针对于针对 OWL 的本体数据库的混合本体存储模式(图 5.32,5.33)。可以看出这种模式是以基于属性的分解模式与垂直模式的混合体,具有较好的扩展性。但是存在的问题是效率不够高,所有的类存储在一个表中,所有的实例也存储在一个表中,这种方式的检索效率比较低。另外存储实例的表(Instance,Proterty,Value)中字段 Value 必须存储许多种不同类型的数值,比如有的是文本型,而有的却是数值型,使得数据不够清晰。此外,在针对几何体这种复杂的地理对象,这种字段就比较难以存储。
图 5.32 本体的数据库混合存储模式(据燕云鹏,2007)
ebRIM(ebXML Registry Information Model)是一个主流的信息注册模型,已成为事实上的标准,得到了 OGC 等支持。OGC 已经实现了基于 ebRIM 的目录服务,并推荐其作为目录服务的实现规范。但是目前基于 ebRIM 的目录服务只支持普通的基于关键字的检索。为此,一些学者已经开始研究如何扩展 ebRIM 实现对语义信息特别是 OWL 的注册。Dogac 等(2004)提出了如图 5.34 所示的一种通过将 XML 形式存储的 OWL 文件转换为以数据库形式存储,使得查询检索更加快速,管理维护也更加方便。为了能在 ebRIM 存储复杂的地理空间信息对象,一些学者开展了基于 ebRIM 的地理扩展方面的研究工作。乐鹏(2007)在其论文中提出了两种扩展方式: ① 从类 “ExtrinsicObject” 派生了“CSWExtrinsicObject”来描述那些不是 ebRIM 自身定义的元数据对象。比如类 “Dataset”继承了 “CSWExtrinsicObject”来描述空间数据集。②对 ebRIM 已有的类别增加 “Slot”。每一个从 “RegistryObject”继承下来的类均允许添加 “Slot”。ebRIM 中的 “Service”类可以用来描述空间服务,但是已有的属性不足以描述空间网络服务。因此,通过添加“Slot”到 “Service”类中以定义从 ISO 19119 派生的属性。如图 5.35 所示为经扩展后的ebRIM 高层模型图,其中 灰 色 填 充 的 矩 形 框表示 扩 展 的对 象 类。该 模 式 与 前 面 燕 云 鹏(2007)和陈光仪(2009)提出的模式相比,本质上差别不大,也是以基于属性的分解模式与垂直模式的混合体,只不过是基于标准的 ebRIM 注册模型,并且将其中的分类系统相关的类单独以两张表存储。该模式也具有很好的扩展性,也存在同样的一些问题。
图 5.33 本体的数据库混合存储模式(据陈光仪,2009)
海洋信息网格技术与应用
续表
5.34 OWL 元素到 ebRIM 元素的映射(Dogac et al.,2004)
5.4.3.2 基于多分解策略的混合存储模式实现
对知识库以及服务语义注册信息的存储的实现上,本书在现有的研究成果的基础上,结合本体组织构成及特点等实际需求,提出了一种基于多分解策略的混合关系数据库存储模式。
该方法的指导思想是: 先按类对其中的数据专题、数据模式、处理模型等进行类的分解,然后结合属性的特性进行基于属性的分解。其中基于类的分解中,可能粒度的大小不一,可能是一个类或者具有相关或相似的一些类划分为一张表存储; 而基于属性的剖分,也并不是所有具有该属性的类以一个表存储,而可能是只针对一个类也单独组织为一张表,其具体思路如下:
图 5.35 经扩展的 ebRIM 高层模型图(据乐鹏,2007)
(1)类的分解: 因为本研究的存储模型不是为了实现一个通用的本体存储模型,而是为了实现一个服务于海洋信息服务领域的本体存储模型。海洋信息服务领域必然会牵涉到一些对象,比如对服务、模型、参数等对象,并且对这些对象的认识也基本上确定(也就是说这些对象类所具有的属性及之间的关系基本明确),所以没必要像上面几种实现方案那样因为不能预知都有哪些类,各类都有哪些属性而将所有的实例的组织按垂直方式进行存储,也没有必要有一些表(比如独立的属性表,属性的作用域和值域表等); 而有必要针对海洋信息服务领域内的这些类的信息内容独立出一些表: 对于海洋专题,地理名实体、处理模型、数据模式等海洋信息检索发现中常用的对象,则有必要进行分开存储,否则必然使得结构不清晰,且检索查询效率低。
(2)对于专题、空间形态以及模型功效等只是简单的分类系统,所具有的属性少,而且今后存在派生新的种类的可能,因此必须具备一定的扩展性。针对这类数据。它们的存储方式是(ClassID,ParentClassID,ClassType),其中 ClassType 标注本体类是属于专题(比如 “海流”)或者其他。
(3)对于取值不唯一的属性,且大部分类或实例都具有的属性,则采用基于属性的分解模式。比如对于别名属性(hasAliasName),有可能一个类实例具有多个别名,这种情况下,则采取基于属性的组织方式。该表的形式是:(OntologyID,AliasName),其中OntologyID 可以是本体类的 ID,也可以是本体实例的 ID,还可以是本体属性的 ID,因为类、实例和属性都可以有别名。
(4)对于复杂的属性,采取大二进制存储的方式。比如对于地名实例的空间覆盖范围,则不考虑其实际内部是包含多少个组成部分,统一按一个 shape 存储在数据库中。当然这里借助了 ArcGIS 的 GDB 的 FeatureClass 矢量数据模型,并对于不同空间形态的则采用了多张表(点状地名类、线状地名类、面状地名类),其组织方式是(GeoNameObjec-tID,shape)。同样,对于模型本体中的内部流程本体,也采用了大二进制方式存储,将整个流程 XML 描述文件,作为一个整体存放于字段中,其大体组织方式为(ModelID,FlowXML)。
(5)本研究采用 ArcGIS 的 GeoDatabase 作为存储模型。本体类(ontClass)的存储结构如图 5.36 所示,数据库的总体组织结构如图 5.37 所示。
图 5.36 本体类(onClass)的存储结构
② 数据库技术知识数据结构的算法
数据库技术知识数据结构的算法
对于将要参加计算机等级考试的考生来说,计算机等级考试的知识点辅导是非常重要的复习资料。以下是我收集的数据库技术知识数据结构的算法,希望大家认真阅读!
1、数据:数据的基本单位是数据元素。数据元素可由一个或多个数据项组成。数据项是数据的不可分割的最小单位
2、数据结构:数据的逻辑结构、数据的存储结构、数据的运算
3、主要的数据存储方式:顺序存储结构(逻辑和物理相邻,存储密度大)和链式存储结构
顺序存储结构:
顺序存储计算公式 Li=L0+(i-1)×K 顺序结构可以进行随机存取;插人、删除运算会引起相应节点的大量移动
链式存储结构:a、指针域可以有多个,可以指向空,比比顺序存储结构的存储密度小
b、逻辑上相邻的节点物理上不一定相邻。 c、插人、删除等不需要大量移动节点
4、顺序表:一般情况下,若长度为n的顺序表,在任何位置插入或删除的概率相等,元素移动的平均次数为n/2(插入)和(n-1)/2(删除)。
5、链表:线性链表(单链表和双向链表等等)和非线性链表
线性链表也称为单链表,其每个一节点中只包含一个指针域,双链表中,每个节点中设置有两个指针域。(注意结点的插入和删除操作)
6、栈:“后进先出”(LIFO)表。栈的应用:表达式求解、二叉树对称序周游、快速排序算法、递归过程的实现等
7、队列:“先进先出”线性表。应用:树的层次遍历
8、串:由零个或多个字符组成的有限序列。
9、多维数组的顺序存储:
10、稀疏矩阵的存储:下三角矩阵顺序存储
其他常见的存储方法还有三元组法和十字链表法
11、广义表:由零个或多个单元素或子表所组成的有限序列。广义表的元素可以是子表,而子表的元素还可以是子表
12、树型结构:非线性结构。常用的树型结构有树和二叉树。
二叉树与树的区别:二叉树不是树的特殊情况,树和二叉树之间最主要的区别是:二叉树的节点的子树要区分左子树和右子树,即使在节点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树。
13、树(森林)与二叉树之间的转换(要会转换)
14、二叉树和树的周游(遍历)
二叉树的周游主要有以下3种方式:前序法(NLR)、对称序法(LNR)、后序法(LRN)
周游树和树林:深度优先和按广度优先两种方式进行。深度优先方式又可分为按先根次序和按后根次序周游
树与二叉树周游之间的对应关系:按先根次序周游树正好与按前序法周游树对应的二叉树等同,后根次序周游树正好与按对称序法周游对应的`二叉树等同
按广度优先方式就是层次次序周游
15、二叉树的存储和线索
二叉树的存储结构:二叉树的llink一rlink法存储表示
线索二叉树:在有n个节点的二叉树的且llink - rlink法存储表示中,必定有n+1个空指针域
16、哈夫曼树:一类带权路径长度最短的树。树的带权路径长度为树中所有叶子节点的带权路径长度之和WPL。
17、查找:
(1)顺序查找:平均查找长度为(n +1 )/2次,时间复杂度为O(n)
(2)二分法查找:线性表节点必须按关键码值排序,且线性表是以顺序存储方式存储的。查找成功比较次数log2n,查找失败比较次数log2n+1
(3)分块查找:先是块间查找,然后块内查找。
(4)散列表(哈希表Hash)的存储和查找:处理冲突的方法:开地址法(线性探测法)、拉链法等
负载因子(装填因子)=表实际存储的结点个数/表的最大能存储结点个数(即表长)
二叉排序树:每个结点左子树的所有关键码值都小于该结点关键码值,右子树所有结点关键码值都大于该结点关键码值。对称周游二叉排序树,得到一个有序序列,时间复杂度O(log2n)
B树和B+树:M阶树,每个结点至多有M-1个关键码,至少有M/2(取上界)-1个关键码。B树适合随机查找,不适合顺序查找。B+树适合顺序查找。
18、排序
直接插人排序、希尔排序、直接选择排序、堆排序、起泡排序、快速排序等排序算法要了解。
直接选择排序、希尔排序、快速排序和堆排序是不稳定排序,其他排序为稳定排序
;③ 知识图谱可以用python构建吗
知识图谱可以用python构建吗?
答案当然是可以的!!!
那么如何使用python构建
什么是知识图谱
从Google搜索,到聊天机器人、金融风控、物联网场景、智能医疗、自适应教育、推荐系统,无一不跟知识图谱相关。它在技术领域的热度也在逐年上升。
互联网的终极形态是万物的互联,而搜索的终极目标是对万物的直接搜索。传统搜索引擎依靠网页之间的超链接实现网页的搜索,而语义搜索是直接对事物进行搜索,如人物、机构、地点等。这些事物可能来自文本、图片、视频、音频、IoT设备等各种信息资源。而知识图谱和语义技术提供了关于这些事物的分类、属性和关系的描述,使得搜索引擎可以直接对事物进行索引和搜索。
知识图谱是由Google公司在2012年提出来的一个新的概念。从学术的角度,我们可以对知识图谱给一个这样的定义:“知识图谱本质上是语义网络(Semantic Network)的知识库”。但这有点抽象,所以换个角度,从实际应用的角度出发其实可以简单地把知识图谱理解成多关系图(Multi-relational Graph)。
那什么叫多关系图呢? 学过数据结构的都应该知道什么是图(Graph)。图是由节点(Vertex)和边(Edge)来构成,但这些图通常只包含一种类型的节点和边。但相反,多关系图一般包含多种类型的节点和多种类型的边。
本项目利用pandas将excel中数据抽取,以三元组形式加载到neo4j数据库中构建相关知识图谱。
运行环境
基于Neo4j能够很容易构建知识图谱,除了用neo4j自带的cypher,也支持Python包py2neo创建节点和关系从而构建知识图谱。本项目是基于发票信息,将发票数据中结构化数据抽象成三元组,分别创建节点和关系从而构建成知识图谱。
具体包依赖可以参考文件requirements.txt
neo4j-driver==1.6.2numpy==1.15.3pandas==0.23.4parso==0.3.1pickleshare==0.7.5pluggy==0.8.0prompt-toolkit==1.0.15py==1.7.0py2neo==3Pygments==2.2.0pytest==3.9.3python-dateutil==2.7.5wcwidth==0.1.7wincertstore==0.2xlrd==1.1.0
将所需依赖安装到pyton中:pip install -r requirements.txt
Pandas抽取excel数据
python中pandas非常适用于数据分析与处理,可以将excel文件转换成dataframe格式,这种格式类似于Spark中的Dataframe结构,可以用类sql的形式对数据进行处理。
Excel数据结构如下
通过函数data_extraction和函数relation_extrantion分别抽取构建知识图谱所需要的节点数据以及联系数据,构建三元组。
数据提取主要采用pandas将excel数据转换成dataframe类型
invoice_neo4j.py
建立知识图谱所需节点和关系数据
DataToNeo4jClass.py
具体代码请移步到GitHub上下载
详细内容请到github下载,项目名neo4j-python-pandas-py2neo-v3
更多Python知识,请关注:Python自学网!!