图数据库
图形数据库(Neo4j)
图形:图形数据库旨在轻松构建和运行与高度连接的数据集一起使用的应用程序。图形数据库的典型使用案例包括社交网络、推荐引擎、欺诈检测和知识图形。热门图形数据库包括 Neo4j 和 Giraph。图形数据库专门用于存储和导航关系。关系是图形数据库中的一等公民,图形数据库的大部分价值都源自于这些关系。图形数据库使用节点来存储数据实体,并使用边缘来存储实体之间的关系。边缘始终有一个开始节点、结束节点、类型和方向,并且边缘可以描述父子关系、操作、所有权等。一个节点可以拥有的关系的数量和类型没有限制。
图形数据库中的图形可依据具体的边缘类型进行遍历,或者也可对整个图形进行遍历。在图形数据库中,遍历联结或关系非常快,因为节点之间的关系不是在查询时计算的,而是留存在数据库中。在社交网络、推荐引擎和欺诈检测等使用案例中,您需要在数 据之间创建关系并快速查询这些关系,此时,图形数据库更具优势。
图数据库如何表达数据?或者其建模方式
图数据库使用图模型来操作数据。目前使用的图模型有 3 种,分别是属性图(Property Graph)、资源描述框架(RDF)三元组和超图(HyperGraph)。现在较为知名的图数据库主要是基于属性图,更确切得说是带标签的属性图(Labeled-Property Graph),当然标签不是必须的。
属性图由顶点(圆圈)、边(箭头)、属性(key:value)和标签组成,顶点和边可以有标签,比如顶点的标签是 User,边的标签是 FOLLOWS。图中标签为 User 的顶点有 name 属性,属性值为 Johan 或 Peter 或 Emil。边表示了他们的关注关系。图中标签为 FOLLOWS 的边是单向边,如果是相互关注了,那么需要 2 条边表示。
为什么需要图数据库,相比关系型数据库等有什么优势?
因为关系型数据库不擅长处理数据之间的关系。我们举最经典的社交网络中查询的性能作为对比。
一个社交网络,图中包括了朋友、同事、夫妻和恋人等多种关系。有人曾做过一 个测试:在一个包含 100w 人,每人约有 50 个朋友的社交网络中找到最大深度为 5 的朋友的朋友。
测试结果如下:
深度为 2 时(即朋友的朋友),两种数据库性能相差不是很明显;
深度为 3 时,很明显,关系型数据库的响应时间 30s,已经变得不可接受了;
深度到 4 时,关系数据库需要近半个小时才能返回结果,已经妄称在线数据处理系统了;
深度到 5 时,关系型数据库已经掉入深渊。而对于图数据库 Neo4J,深度从 3 到 5,其响应时间均在 3 秒以内。
可以看出,对于图数据库来说,数据量越大,越复杂的关联查询,约有利于体现其优势。从深度为 4/5 的查询结果我们可以看出,图数据库返回了整个社交网络一半以上的人数。
除了性能好,图数据库还有其他优势吗?
除了很显而易见的性能优势外,灵活性和敏捷性也是图数据库相比关系型数据库的重要优势。图天生就是灵活可扩展的,可以对已存在的图结构增加新的边、节点、标签和子图,但却不会破坏现有的查询和应用程序的功能。这就使我们无需在项目之初,对数据的真实模样和复杂度缺乏了解的情况下被迫设计成最终而完整的数据模型,往往这样的模型并不是最终和完整的。
另一方面,有些业务本身就是灵活多变的,或者说敏捷的。使用图数据库(或其他 NoSQL 数据库,比如 MongoDB)可以快速跟上业务的变化而不需要进行 Schema 变更等代价不菲的管理操作。
图数据库怎么使用,用 SQL 做增删改查吗?
图数据库不使用最传统的 SQL 作为 CRUD 语言,原因是 SQL 作为关系型数据库的查询语言,其也不擅长表达 Join 等关系查询和操作,在需要做多层的关系 Join 查询时,SQL 往往冗长而难以直观得理解。这是为什么不采用大家最为熟知的 SQL 却要引入新的图查询语言的主要原因。举个对比的例子:
在英文中“I love my younger sister as well as my grandmother on my father’s side”,与中文的“我爱我的妹妹和奶奶” 是一样的意思,但是在简洁程度上中文远远好于英文。(6 个词,9 个字) vs (14 个词, 70 个字)
也就是说,在图数据库中使用专门的图查询语言比使用 SQL 更加高效。目前主流的图查询语言是 Cypher 和 Gremlin。
目前有哪些比较知名的图数据库?
Neo4J 最主流的图数据库,相比其他数据库更加成熟,Neo4J 使用 Java 开发,支持 ACID,最新版本是 3.3.5。每个版本均有社区版和企业版,其中社区版是免费版,基于 GPLv3 协议开源,但局限于单机部署,功能受限。企业版包括了 Neo4J 所有功能,包括主从复制用于高可用和读写分离,可视化管理工具等,但增加了商业协议,需付费使用。Neo4J 不是分布 式数据库,扩展性不是其优势。但它是一种原生的图数据库,同时也具备了图分析引擎的能力。应该说 Neo4J 是目前使用最为广泛的图数据库,大量介绍图数据库的书籍都是以 Neo4J 为基础来介绍的。
Neo4J 使用 Cypher 作为图数据库查询语言,由于 Neo4J 的成功,Cypher 目前被大多数图数据库所支持。Cypher 语言例子如下(找出所有 Johan 所关注的人所关注的人,该人也是 Johan 关注的人):
MATCH (a:Person {name:'Johan'})-[:FOLLOWS]->(b)-[:FOLLOWS]->(c), (a)-[:FOLLOWS]->(c) RETURN b, c