1 什么是图数据库(graph database)
十大应用案例:https://go.neo4j.com/rs/710-RRC-335/images/Neo4j-Top-Use-Cases-ZH.pdf
“大数据”每年都在增长,但如今的企业领导者不仅需要管理更大规模的数据,还迫切需要从现有数据中得出深刻见解。企业需要摈弃仅仅收集数据点的做法,开始着手建立数据之间的关联关系。数据点之间的关系甚至比单个点本身更重要。讽刺的是,传统的关系数据库管理系统(RDBMS)并不擅长处理数据之间的关系。那些表状数据模式和呆板的结构难以添加新连接或不同类型连接。为了利用这些数据关系,需要一种能将关系信息存储为一等实体的新型数据库技术,这种技术就是图数据库。
图数据库不仅能有效存储数据点之间的关系,而且非常灵活,适合添加新的关系类型,并使数据模型适应新的业务需求。
随着社交、电商、金融、零售、物联网等行业的快速发展,现实社会织起了一张庞大而复杂的关系网,传统数据库很难处理关系运算。大数据行业需要处理的数据之间的关系随数据量呈几何级数增长,急需一种支持海量复杂数据关系运算的数据库,图数据库应运而生。
社交网络图谱:
在社交网络中,公司、员工、技能的信息,这些都是节点,它们之间的关系都是边,在这里面图数据库可以做一些非常复杂的公司之间关系的查询。比如说公司到员工、员工到其他公司,从中找类似的公司、相似的公司,都可以在这个系统内完成。
企业关系图谱:
图数据库可以对各种企业进行信息图谱的建立,包括最基本的工商信息:何时注册、谁注册、注册资本、在何处办公、经营范围、高管架构。围绕企业的经营范围,继续细化去查询企业究竟有哪些产品或服务,例如通过企业名称查询到企业的自媒体,从而给予其更多关注和了解。另外,企业的产品和服务数据的关联,查看该企业有没有令人信服的自主知识产权和相关资质来支撑业务的开展。
企业在日常经营中,与客户、合作伙伴、渠道方、投资者都会打交道,这也决定了企业对社会各个领域都广有涉猎,呈现面错综复杂,因此可以通过企业数据图谱来查询,层层挖掘信息。基于图数据的企业信息查询可以真正了解企业的方方面面,而不再是传统单一的工商信息查询。
在数据关系中,图数据库在查询速度方面非常高效,即使对于高深度和高复杂的查询也是如此。在关系型数据库和图数据库(Neo4j)之间进行了实验:在一个社交网络里找到深度为5的朋友的朋友,他们的数据集包括100万人,每人约有50个朋友:
图数据库并不是前端展示用的数据库,它不是用来画图的。相反,它是用来存储数据用的,以图的节点和边的方式来存储数据。而前端展现需要用一些前端展示工具,例如D3、ECharts等来实现。
图数据库并非指存储图片的数据库,而是以图数据结构存储和查询数据。图数据库是基于图论实现的一种NoSQL数据库,其数据存储结构和数据查询方式都是以图论为基础的,图数据库主要用于存储更多的连接数据。
图论〔Graph Theory〕是数学的一个分支。它以图为研究对象,图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有关系。
在一个图中主要包含两种数据类型:Nodes(节点)和Relationships(关系)。他们各自内部又包含key-value形式的属性,然后节点之间通过关系相连,形成了关系型的网状结构。
Neo4j是由Java实现的开源NoSql图数据库,是图数据库中较为流行的一款。它提供了完整的数据库特性,包括ACID事务的支持、集群支持、备份与故障转移等(部分功能例如集群支持只有在neo4j企业版中才有,社区版不支持)。
在我看来,图数据库最大的优势是体现在对数据关系的检索上。如果数据之间的关系很复杂,数据存在了多张表中,还有一些中间表的存在的话,传统数据库想要查询一些数据得通过各种联表操作才做得到,sql会写得很复杂,不利于维护,同时性能也不高。而图数据库仅仅通过简单的一句cypher语句便可实现查询功能(cypher语句是Neo4j的执行语句,类似于关系型数据库中的SQL),同时执行速度也会快很多(书中所说是能够实现毫秒级响应,但通过我实测其实并没有这么夸张。Neo4j是将数据存在内存中的,对硬件有一定要求。所以数据越来越多的情况下,同时也有事务的因素,查询速度也会变慢)。
图数据库也支持查询一些复杂的关系。例如某节点周围一级的关系节点有哪些,二级的关系又有哪些。拿社交网络来举例,假如我现在要实现一个查询某人可能认识的人有哪些的功能。那么这个功能翻译成cypher就是: 查询这个人A的周围一圈认识的人的集合B中,所有B周围一圈人中和A没有交集的人。 这个用cypher语句是能写出来的,同时也不会太复杂。
对比关系型数据库:
在关系型数据库中,Person和Department表之间用外键表示关系:
在图数据库中,节点和关系取代表,外键和join:
在图数据库中,无论何时运行类似JOIN的操作,数据库都会使用此列表并直接访问连接的节点,而无需进行昂贵的搜索和匹配计算。
分类 | 数据模型 | 优势 | 劣势 | 举例 |
---|---|---|---|---|
图数据库 | 节点和关系组成的图 | 利用图结构相关算 | 可能需要对整个图做计算,不利于图数据的分布存储 | Neo4J |
2 什么是neo4j
Neo4j是一个高性能的NOSQL图数据库,它将结构化数据存储在网络上(从数学角度叫做图)而不是表中。
它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。
Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的图网络结构下,而不是严格、静态的表中。但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。
Neo4j因其嵌入式、高性能、轻量级等优势,越来越受到关注。采用属性图模型(Property graph model),极大的完善和丰富图数据模型;专属查询语言 Cypher。官网: https://neo4j.com/
Neo4j的特点:
SQL就像简单的查询语言Neo4j CQL;它遵循属性图数据模型;它通过使用Apache Lucence支持索引;它支持UNIQUE约束;它包含一个用于执行CQL命令的UI:Neo4j数据浏览器;它支持完整的ACID(原子性,一致性,隔离性和持久性)规则;它采用原生图形库与本地GPE(图形处理引擎);它支持查询的数据导出到JSON和XLS格式;它提供了REST API,可以被任何编程语言(如Java,Spring,Scala等)访问;它提供了可以通过任何UI MVC框架(如Node JS)访问的Java脚本;它支持两种Java API:Cypher API和Native Java API来开发Java应用程序。
Neo4j的优点:
- 高度可扩展性:Neo4j具有高度可扩展性。它提供了一个简单,强大和灵活的数据模型,可以根据应用程序和用途进行更改。它提供:
更高的垂直缩放比例。
大规模改进了操作特性。
更高的并发性。
简化的调整。
- 无模式: Neo4j与其他NoSQL数据库—样无模式。
- 高可用性: Neo4j通过事务保证为大型企业实时应用程序提供高可用性。
- 实时数据分析: Neo4j提供基于实时数据的结果。
- 易于表示: Neo4j提供了一种非常简单的方法来表示连接【关系】的和半结构化的数据【节点】。
- 快速执行: Neo4j速度很快,因为连接的数据非常容易检索和浏览。
- 轻松检索: Neo4j不仅可以帮助您表示,而且可以比较容易地更快地检索与(遍历/导航)其他数据库中的连接数据。
- 密码查询语言;:Neo4提供了CQL(密码查询语言)一种声明性查询语言,使用ASCIi语法将图形直观地表示出来。该语言的命令非常易于学习并且易于阅读。
- 无联接:Neo4不需要复杂的联接即可检索已连接/相关的数据,因为无需联接或索引即可轻松检索其相邻节点或关系详细信息,因为它是一个图数据库并且所有节点都已连接。
3 Neo4j数据模型 图论基础
图论〔Graph Theory〕是数学的一个分支。它以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。
以属性【key,value】的形式将数据存储在节点和边中。在图中,我们可以用一个圆圈表示节点,用箭头表示节点之间的关系。简单的可能图是单个节点:
我们可以使用节点表示社交网络中的个人资料,向节点中添加一些属性:
在两个节点之间创建关系:
此处在两个配置文件之间创建关系名称“跟随”。 这意味着 Profile-I 遵循 Profile-II。
图的顶点表示相同类型的事物(分别是人、网页或交叉路口)。然而,图不局限于这样的同构数据,图更为强大的用途在于提供了单个数据存储区中保存完全不同类型对象的一致性方式。如Facebook维护一个含许多不同类型的顶点与边的大图:
- 顶点包括人、地点、事件、签到和用户的评论
- 边表示哪些人是彼此的朋友,签到发生在哪些位置, 谁评论了哪个帖子, 谁参与了哪个事件
它可能来自社交网络或某族谱数据库。 案例是两个人,分别来自爱达荷州的Lucy和来自法国波恩的Alain,它们结婚了,目前住在伦敦。
有多种不同但相关的方法可构建和查询图中的数据。本节将讨论属性图模型和三元存储模型。
4 属性图模型
在属性图模型中,每个顶点包括:
- 唯一标识符
- 出边的集合
- 入边的集合
- 属性的集合(键-值对)
每个边包括:
- 唯一标识符
- 边开始的顶点
- 边结束的顶点
- 描述两个顶点间关系类型的标签
- 属性的集合 (键-值对)
可将图存储结构由两个关系表组成,一个用顶点, 另一个用边:
此模式使用PostgreSQL JSON存储每个顶点或边的属性。为每个边存储头部和尾部顶点,若想要顶点的入边或出边集合 ,可分别通过head_vertex 或tail_vertex来查edges表。
图模型重点:
- 任何顶点都能连接到其他任一顶点,没有模式限制哪种事物可或不可关联
- 给定某顶点,可高效得到它的所有入、出边,从而遍历图,即沿着这些顶点链条一直向前或向后(这就是为何图2-2中在tail_vertex和
head_vertex列上都建立索引的原因) - 通过对不同类型的关系使用不同标签,可在单个图中存储多种不同类型的信息,同时仍保持整洁的数据模型。
5 Neo4j的构建元素
节点(Node)是图数据库中的一个基本元素,用来表示一个实体记录,就像关系数据库中的一条记录一样。在Neo4j中节点可以包含多个属性(Property)和多个标签(Label)。
- 1、节点是主要的数据元素节点,通过关系连接到其他节点,节点可以具有一个或多个属性
- 2、节点有一个或多个标签,用于描述其在图表中的作用
属性(Property)是用于描述节点和关系的键值对。其中Key是一个字符串,值可以通过使用任何Neo4j数据类型来表示。
- 1、键是字符串,属性可以被索引和约束
- 2、可以在多个属性创建复合索引
关系(Relationship)同样是图数据库的基本元素。当数据库中已经存在节点后,需要将节点连接起来构成图。关系就是用来连接两个节点,关系也称为图论的边(Edge) ,其始端和末端都必须是节点,关系不能指向空也不能从空发起。关系和节点一样可以包含多个属性,但关系只能有一个类型(Type) 。
- 1、连接两个节点关系是有方向性的,节点可以有多个甚至递归的关系
- 2、关系可以有一个或多个属性
- 3、基于方向性,Neo4j关系被分为两种主要类型:单向关系双向关系
标签(Label)将一个公共名称【标签名】与一组节点或关系相关联, 节点或关系可以包含一个或多个标签。 我们 可以为现有节点或关系创建新标签, 我们可以从现有节点或关系中删除标签。
- 标签用于将节点分组
- 一个节点可以具有多个标签
- 对标签进行索引以加速在图中查找节点
- 本机标签索引针对速度进行了优化