简介

众多不同的数据模型里,关系数据模型自80年代就处于统治地位,而且有不少实现,如OracleMySQLMSSQL,它们也被称为关系数据库管理系统(RDBMS)。然而,最近随着关系数据库使用案例的不断增加,一些问题也暴露了出来,这主要是因为两个原因:数据建模中的一些缺陷和问题,以及在大数据量和多服务器之上进行水平伸缩的限制。两个趋势让这些问题引起了全球软件社区的重视:

  1. 用户、系统和传感器产生的数据量呈指数增长,其增长速度因大部分数据量集中在象Amazon、Google和其他云服务这样的分布式系统上而进一步加快。
  2. 数据内部依赖和复杂度的增加,这一问题因互联网、Web2.0、社交网络,以及对大量不同系统的数据源开放和标准化的访问而加剧。

在应对这些趋势时,关系数据库产生了更多的问题。这导致大量解决这些问题某些特定方面的不同技术的出现,它们可以与现有RDBMS相互配合或代替它们 - 亦被称为混合持久化(Polyglot Persistence)。数据库替代品并不是新鲜事物,它们已经以对象数据库(OODBMS)、层次数据库(如LDAP)等形式存在很长时间了。但是,过去几年间,出现了大量新项目,它们被统称为NOSQL数据库(NOSQL-databases)

本文旨在介绍图形数据库(Graph Database)在NOSQL运动里的地位,第二部分则是对Neo4j(一种基于Java的图形数据库)的简介。

 

NOSQL环境

NOSQL(Not Only SQL,不限于SQL)是一类范围非常广泛的持久化解决方案,它们不遵循关系数据库模型,也不使用SQL作为查询语言。

简单地讲,NOSQL数据库可以按照它们的数据模型分成4类:

  1. 键-值存储库(Key-Value-stores)
  2. BigTable实现(BigTable-implementations)
  3. 文档库(Document-stores)
  4. 图形数据库(Graph Database)

VoldemortTokyo Cabinet这类键/值系统而言,最小的建模单元是键-值对。对BigTable的克隆品来讲,最小建模单元则是包含不同个数属性的元组,至于象CouchDBMongoDB这样的文档库,最小单元是文档。图形数据库则干脆把整个数据集建模成一个大型稠密的网络结构。

 

在此,让我们深入检阅NOSQL数据库的两个有意思的方面:伸缩性和复杂度。

1. 伸缩性

CAP: ACID vs. BASE

为了保证数据完整性,大多数经典数据库系统都是以事务为基础的。这全方位保证了数据管理中数据的一致性。这些事务特性也被称为ACID(A代表原子性、C表示一致性、I是隔离性、D则为持久性)。然而,ACID兼容系统的向外扩展已经表现为一个问题。在分布式系统中,高可用性不同方面之间产生的冲突没有完全得到解决 - 亦称CAP法则:

  • 强一致性(C):所有客户端看到的数据是同一个版本,即使是数据集发生了更新 - 如利用两阶段提交协议(XA事务),和ACID,
  • 高可用性(A):所有客户端总能找到所请求数据的至少一个版本,即使集群中某些机器已经宕机,
  • 分区容忍性(P):整个系统保持自己的特征,即使是被部署到不同服务器上的时候,这对客户端来讲是透明的。

CAP法则假定向外扩展的3个不同方面中只有两个可以同时完全实现。

为了能处理大型分布式系统,让我们深入了解所采用的不同CAP特征。

很多NOSQL数据库首先已经放宽了对于一致性(C)的要求,以期得到更好的可用性(A)和分区容忍性(P)。这产生了被称为BASE(基本(B)可用性(A)、软状态(S)、最终一致性(E))的系统。它们没有经典意义上的事务,并且在数据模型上引入了约束,以支持更好的分区模式(如Dynamo系统等)。关于CAP、ACID和BASE的更深入讨论可以在这篇介绍里找到。

2. 复杂度

蛋白质同源网络(Protein Homology Network),感谢Alex Adai:细胞和分子生物学院 - 德州大学

数据和系统的互联性增加产生了一种无法用简单明了或领域无关(domain-independent)方式进行伸缩和自动分区的稠密数据集,甚至连Todd Hoff也提到了这一问题。关于大型复杂数据集的可视化内容可以访问可视化复杂度(Visual Complexity)

关系模型

在把关系数据模型扔进故纸堆之前,我们不应该忘记关系数据库系统成功的一个原因是遵照E.F. Codd的想法,关系数据模型通过规范化的手段原则上能够建模任何数据结构且没有信息冗余和丢失。建模完成之后,就可以使用SQL以一种非常强大的方式插入、修改和查询数据。甚至有些数据库,为了插入速度或针对不同使用情况(如OLTP、OLAP、Web应用或报表)的多维查询(星形模式),对模式实现了优化。

这只是理论。然而在实践中,RDBM遇到了前面提到的CAP问题的限制,以及由高性能查询实现而产生的问题:联结大量表、深度嵌套的SQL查询。其他问题包括伸缩性、随时间的模式演变,树形结构的建模,半结构化数据,层级和网络等。

关系模型也很难适应当前软件开发的方法,如面向对象和动态语言,这被称为对象-关系阻抗失配。由此,象Java的Hibernate这样的ORM层被开发了出来,而且被应用到这种混合环境里。它们固然简化了把对象模型映射到关系数据模型的任务,但是没有优化查询的性能。尤其是半结构化数据往往被建模成具有许多列的大型表,其中很多行的许多列是空的(稀疏表),这导致了拙劣的性能。甚至作为替代方法,把这些结构建模成大量的联结表,也有问题。因为RDBMS中的联结是一种非常昂贵的集合操作。

图形是关系规范化的一种替代技术

看看领域模型在数据结构上的方案,有两个主流学派 - RDBMS采用的关系方法和图 - 即网络结构,如语义网用到的。

尽管图结构在理论上甚至可以用RDBMS规范化,但由于关系数据库的实现特点,对于象文件树这样的递归结构和象社交图这样的网络结构有严重的查询性能影响。网络关系上的每次操作都会导致RDBMS上的一次"联结"操作,以两个表的主键集合间的集合操作来实现 ,这种操作不仅缓慢并且无法随着这些表中元组数量的增加而伸缩。

属性图形(Property Graph)的基本术语

在图的领域,并没有一套被广泛接受的术语,存在着很多不同类型的图模型。但是,有人致力于创建一种属性图形模型(Property Graph Model),以期统一大多数不同的图实现。按照该模型,属性图里信息的建模使用3种构造单元:

  • 节点(即顶点)
  • 关系(即边) - 具有方向和类型(标记和标向)
  • 节点和关系上面的属性(即特性)

更特殊的是,这个模型是一个被标记和标向的属性多重图(multigraph)。被标记的图每条边都有一个标签,它被用来作为那条边的类型。有向图允许边有一个固定的方向,从末或源节点到首或目标节点。属性图允许每个节点和边有一组可变的属性列表,其中的属性是关联某个名字的值,简化了图形结构。多重图允许两个节点之间存在多条边。这意味着两个节点可以由不同边连接多次,即使两条边有相同的尾、头和标记。

下图显示了一个被标记的小型属性图。

TinkerPop有关的小型人员图

图论的巨大用途被得到了认可,它跟不同领域的很多问题都有关联。最常用的图论算法包括各种类型的最短路径计算测地线(Geodesic Path)、集中度测量(如PageRank、特征向量集中度、亲密度、关系度、HITS等)。然而,在很多情况下,这些算法的应用仅限制于研究,因为实际中没有任何可用于产品环境下的高性能图形数据库实现。幸运的是,近些年情况有所改观。有几个项目已经被开发出来,而且目标直指24/7的产品环境:

下图展示了在复杂度和伸缩性方面背景下的主要NOSQL分类的位置。

关于“规模扩展和复杂度扩展的比较”的更多内容,请阅读Emil Eifrem的博文

Neo4j - 基于Java的图形数据库

Neo4j是一个用Java实现、完全兼容ACID的图形数据库。数据以一种针对图形网络进行过优化的格式保存在磁盘上。Neo4j的内核是一种极快的图形引擎,具有数据库产品期望的所有特性,如恢复、两阶段提交、符合XA等。自2003年起,Neo4j就已经被作为24/7的产品使用。该项目刚刚发布了1.0版 - 关于伸缩性和社区测试的一个主要里程碑。通过联机备份实现的高可用性和主从复制目前处于测试阶段,预计在下一版本中发布。Neo4j既可作为无需任何管理开销的内嵌数据库使用;也可以作为单独的服务器使用,在这种使用场景下,它提供了广泛使用的REST接口,能够方便地集成到基于PHP、.NET和JavaScript的环境里。但本文的重点主要在于讨论Neo4j的直接使用。

开发者可以通过Java-API直接与图形模型交互,这个API暴露了非常灵活的数据结构。至于象JRuby/RubyScalaPythonClojure等其他语言,社区也贡献了优秀的绑定库。Neo4j的典型数据特征:

甚至“传统”RDBMS应用往往也会包含一些具有挑战性、非常适合用图来处理的数据集,如文件夹结构、产品配置、产品组装和分类、媒体元数据、金融领域的语义交易和欺诈检测等。

围绕内核,Neo4j提供了一组可选的组件。其中有支持通过元模型构造图形结构、SAIL - 一种SparQL兼容的RDF TripleStore实现或一组公共图形算法的实现。

要是你想将Neo4j作为单独的服务器运行,还可以找到REST包装器。这非常适合使用LAMP软件搭建的架构。通过memcached、e-tag和基于Apache的缓存和Web层,REST甚至简化了大规模读负荷的伸缩。

高性能?

要给出确切的性能基准数据很难,因为它们跟底层的硬件、使用的数据集和其他因素关联很大。自适应规模的Neo4j无需任何额外的工作便可以处理包含数十亿节点、关系和属性的图。它的读性能可以很轻松地实现每毫秒(大约每秒1-2百万遍历步骤)遍历2000关系,这完全是事务性的,每个线程都有热缓存。使用最短路径计算,Neo4j在处理包含数千个节点的小型图时,甚至比MySQL快1000倍,随着图规模的增加,差距也越来越大。

这其中的原因在于,在Neo4j里,图遍历执行的速度是常数,跟图的规模大小无关。不象在RDBMS里常见的联结操作那样,这里不涉及降低性能的集合操作。Neo4j以一种延迟风格遍历图 - 节点和关系只有在结果迭代器需要访问它们的时候才会被遍历并返回,对于大规模深度遍历而言,这极大地提高了性能。

写速度跟文件系统的查找时间和硬件有很大关系。Ext3文件系统和SSD磁盘是不错的组合,这会导致每秒大约100,000写事务操作。

示例 - 黑客帝国

前面已经说过,社交网络只是代表了图形数据库应用的冰山一角,但用它们来作为例子可以让人很容易理解。为了阐述Neo4j的基本功能,下面这个小型图来自黑客帝国这部电影。该图是用Neo4j的Neoclipse产生的,该插件基于Eclipse RCP

图形数据库、NOSQL和Neo4j的更多相关文章

  1. 为什么选择图形数据库,为什么选择Neo4j?

    最近在抓取一些社交网站的数据,抓下来的数据用MySql存储.问我为什么用MySql,那自然是入门简单,并且我当时只熟悉MySql.可是,随着数据量越来越大,有一个问题始终困扰着我,那就是社交关系的存储 ...

  2. 图形数据库Neo4J简介

    最近我在用图形数据库来完成对一个初创项目的支持.在使用过程中觉得这种图形数据库实际上挺有意思的.因此在这里给大家做一个简单的介绍. NoSQL数据库相信大家都听说过.它们常常可以用来处理传统的关系型数 ...

  3. 开源软件:NoSql数据库 - 图数据库 Neo4j

    转载自原文地址:http://www.cnblogs.com/loveis715/p/5277051.html 最近我在用图形数据库来完成对一个初创项目的支持.在使用过程中觉得这种图形数据库实际上挺有 ...

  4. Neo4j 第二篇:图形数据库

    在深入学习图形数据库之前,首先理解属性图的基本概念.一个属性图是由顶点(Vertex),边(Edge),标签(Lable),关系类型和属性(Property)组成的有向图.顶点也称作节点(Node), ...

  5. 图形数据库Neo4j基本了解

    在深入学习图形数据库之前,首先理解属性图的基本概念.一个属性图是由顶点(Vertex),边(Edge),标签(Lable),关系类型和属性(Property)组成的有向图.顶点也称作节点(Node), ...

  6. NoSQL数据库

    NoSQL数据库 1.NoSQL简介 最初表示"反SQL"运动,用新型的非关系型数据库取代关系数据库:现在表示"Not only SQL"关系和非关系型数据库各 ...

  7. 在Django中使用Neo4j

    重要的先说在前面吧,最后的选型结构是安装了最新的neo4j版本3.0.3,使用了neo4j-rest-client客户端库.主要原因是更适用于django的neomodel库目前只支持neo4j2.2 ...

  8. Neo4j 第一篇:在Windows环境中安装Neo4j

    图形数据库(Graph Database)是NoSQL数据库家族中特殊的存在,用于存储丰富的关系数据,Neo4j 是目前最流行的图形数据库,支持完整的事务,在属性图中,图是由顶点(Vertex),边( ...

  9. 在Windows环境中安装Neo4j

    图形数据库(Graph Database)是NoSQL数据库家族中特殊的存在,用于存储丰富的关系数据,Neo4j 是目前最流行的图形数据库,支持完整的事务,在属性图中,图是由顶点(Vertex),边( ...

随机推荐

  1. java笔记之类和对象

    现在编程的思想分成了两大阵营,面向过程和面向对象.现在谈谈啥是面向对象. 作为一只单身狗,谈“对象”还是很伤心很伤心的(:′⌒`)...... 先看看百度怎么说? 好吧,百度说的太抽象,我换个简单的说 ...

  2. sublime package

    Sublime text 2/3 中 Package Control 的安装与使用方法 2014/05/23前端工具, 工具, 教程, 软件4条评论 Package Control 插件是一个方便 S ...

  3. VMware vSphere HyperVisor安装过程记录

      作者:sdjnzqr 出处:http://www.cnblogs.com/sdjnzqr/ 版权:本文版权归作者和博客园共有 转载:欢迎转载,但未经作者同意,必须保留此段声明:必须在文章中给出原文 ...

  4. struts2 ,web.xml中配置为/*.action,运行报错Invalid <url-pattern> /*.action in filter mapp

    首先,修改成: <filter-mapping>  <filter-name>struts2</filter-name>  <url-pattern>/ ...

  5. (ASP.NET)C#连接Oracle数据库示例(中文乱码问题解决)

    接手了一个遗留的ASP.NET系统,数据库用的是Oracle,以前没搞过.NET和Oracle数据库,数据库搞了半天才解决乱码问题,在此做个笔记备忘. 1.下载安装ODAC 1)请去Oracle官网下 ...

  6. Introduction To Monte Carlo Methods

    Introduction To Monte Carlo Methods I’m going to keep this tutorial light on math, because the goal ...

  7. UVA 291 The House Of Santa Claus (DFS求一笔画)

    题意:从左下方1开始,一笔画出圣诞老人的屋子(不过话说,圣诞老人的屋子是这样的吗?这算是个屋子么),输出所有可以的路径. 思路:贴代码. #include <iostream> #incl ...

  8. struts2-2.3.4.1的struts-default.xml源码

    <?xml version="1.0" encoding="UTF-8" ?> <!-- /* * $Id: struts-default.x ...

  9. POJ2151Check the difficulty of problems

    题意 : 举办一次比赛不容易,为了不让题目太难,举办方往往希望能够讲出的题目满足两点,1是所有的队伍都至少能够解出一个题目,2是冠军队至少能解出确定数量的题目,最后让你求的是每个队伍至少解出一道题并且 ...

  10. DJANGO变动库的一次真实手动经历

    在变更库时,由于对字段规划和约束性没考虑完全,需要手工操作数据库,以便可以重复执行. 有以下三点要注意. 1,先迎合错误输出,增删对应的表或字段. 2,必要时,修改migrations文件,以去除唯一 ...