1.图论1.1.起源于莱昂哈德·欧拉在1736年发表的一篇关于“哥尼斯堡七桥问题”的论文1.2.要解决这个问题,该图需要零个或两个具有奇数连接的节点1.3.任何满足这一条件的图都被称为欧拉图1.4.如果路径只访问每条边一次,则该图具有欧拉路径1.5.如果路径起点和终点相同,则该图具有欧拉回路,或称为欧拉环2.图2.1.顶点和边的集合2.2.示例2.2.1.路线图2.2.2.组织结构图2.3.当要思考的数据集含有大量高度相互关联的项时,也可以将该数据集描述为一个由相关事物组成的网络,这也是图的另一种说法3.顶点3.1.图中零条、一条或多条边经过的点3.2.节点或实体4.边4.1.图中两个顶点之间的关系4.2.关系、链接或连接5.图数据库5.1.一种数据存储引擎5.1.1.将包含顶点和边的基本图结构与持久化技术和遍历(查询)语言相结合5.1.2.以创建针对高度关联数据的存储和快速检索进行优化的数据库5.2.实体之间的关系与数据中的实体同等重要,甚至比后者更加重要5.2.1.用开发人员的话来说,边和顶点一样,都是“一等公民”5.3.可以用于更准确、更容易地表示和推理现实世界中的关系5.4.将数据存储为顶点(节点、组件)和边(关系)5.5.Neo4j、Apache TinkerPop的Gremlin Server、JanusGraph和TigerGraph5.6.默认情况下,只有关系数据库和图数据库才具有将数据中的实体关联起来的功能5.7.优势5.7.1.递归查询5.7.1.1.组织中员工的汇报层次结构或者组织结构图5.7.1.2.会连续执行多次,反复调用自己,直到满足某种终止条件5.7.1.3.关系数据库不能很好地处理递归操作5.7.1.4.图数据库能够利用其表示丰富关系的能力,干净、高效地处理无边界递归查询5.7.1.5.嵌套查询和递归查询(如前面的层次结构示例所示)是图数据库擅长解答的疑问类型5.7.2.复合结果类型5.7.2.1.订单和产品报告示例5.7.2.2.能够返回包含不同数据类型的结果集5.7.2.3.关系数据库指定联合返回的结果集必须包含一致的列5.7.2.3.1.在稀疏数据的情况下,这不仅增加了返回的数据量,还降低了数据结构的描述性5.7.3.路径5.7.3.1.过河问题5.7.3.2.一组顶点和边的序列,描述遍历如何在图中移动5.8.请把注意力集中在图数据库如何优雅地处理关系数据库里的UNION操作上5.9.可以把图数据库设计得能够容忍不断发展变化的数据5.10.使用5.10.1.并不一定全部使用图数据库,也并不一定全部不使用图数据库5.10.2.不要害怕尝试用图数据库来解决问题的一部分5.10.3.使用图数据库的多模型方法(即混合使用关系数据库和图数据库)很常见6.比较6.1.键值数据库6.1.1.所有数据都由唯一标识符(键)和关联的数据对象(值)表示6.1.2.Berkeley DB、RocksDB、Redis和Memcached6.2.列存储数据库6.2.1.面向列、宽列式数据库6.2.2.数据按列来存储6.2.2.1.可能每行有大量的列6.2.2.2.可能每行的列数不一样6.2.3.Apache HBase、Azure Table Storage、Apache Cassandra和Google Cloud Bigtable6.3.文档数据库6.3.1.面向文档数据库6.3.2.将数据存储到带有唯一键的文档中6.3.3.该文档可以具有不同的模式,也可以包含嵌套数据6.3.4.MongoDB和Apache CouchDB6.4.关系数据库6.4.1.将数据存储在包含具有严格模式行结构的表中,允许在表之间连接行来建立关系6.4.2.关系数据库中的查找表或链接表使用的不是查询时的指针结构,而是存储了有关关系属性的结构,类似于图数据库中的边结构6.4.3.PostgreSQL、Oracle Database和Microsoft SQL Server6.5.数据复杂性

7.Apache TinkerPop7.1.TinkerPop是Apache软件基金会的顶级项目7.2.提供了一个与厂商无关的开源图计算框架7.3.具有事务(OLTP)能力和分析(OLAP)能力7.4.有广泛的第三方库可供使用8.TinkerGraph8.1.一个内存图引擎8.2.支持OLTP负载和OLAP负载8.3.TinkerPop Gremlin Server和Gremlin Console的一部分8.4.TinkerPop的全功能开源实现8.4.1.被作为TinkerPop API的参考实现构建出来的8.5.并非一个你能下载的软件8.5.1.可下载软件(如Gremlin Server 和Gremlin Console)里的核心引擎9.Gremlin9.1.Gremlin遍历语言是TinkerPop项目的图查询语言9.2.支持命令式语法和声明式语法9.2.1.首选方式是命令式语法9.3.Gremlin Console9.3.1.用于TinkerPop支持图数据库的交互终端应用程序9.3.2.允许用户连接到本地或远程的数据库,将数据加载到图中,并交互式地在图上进行遍历9.3.3.能作为自带内存图数据的独立应用程序使用9.3.4.能作为图数据库服务器的客户端使用9.4.Gremlin Server9.4.1.允许非JVM客户端与基于JVM的图数据库进行通信9.4.2.提供能让部署在不同服务器上的数据库相互通信的机制9.5.Gremlin语言变体9.5.1.允许开发人员既使用Gremlin作为查询语言,又能通过他们选择的开发语言方言来实现9.5.2.主张以应用程序编程语言的风格来编写Gremlin遍历9.5.2.1.Java开发人员使用Java语法9.5.2.2..NET开发人员使用.NET语法10.用例/场景10.1.从社交网络分析、推荐引擎、依赖性分析、欺诈检测和主数据管理,到搜索问题和互联网上的研究,你很快就能列出一个适合使用图数据库的用例列表10.2.判断一个用例是好还是坏的最重要因素是对要解答的疑问有深入的了解10.3.选择/搜索10.3.1.侧重于寻找一组具有共同属性(如姓名、位置或雇主)的实体10.3.2.不需要数据中丰富的关系10.3.3.建议使用诸如PostgreSQL之类的本地数据库或诸如Apache Solr和Elasticsearch之类的搜索技术10.3.4.使用RDBMS或搜索技术10.4.获取数据相关性或递归数据10.4.1.图数据库比任何其他类型数据引擎都能更好地利用这些信息10.4.2.图数据库查询语言更适用于推断数据内部的关系10.4.3.使用图数据库10.5.聚合10.5.1.数据聚合查询是关系数据库的一个优秀用例10.5.2.关系数据库经过优化,能以最小的开销快速执行复杂的聚合查询10.5.3.可以在图数据库中执行,但是图遍历的本质要求接触更多的数据。这会导致更高的查询延迟和更多的资源消耗10.5.4.使用RDBMS10.6.模式匹配10.6.1.基于实体关联方式的模式匹配是充分利用图数据库功能的一个主要例子10.6.2.推荐引擎、欺诈检测和入侵检测10.6.3.使用图数据库10.7.中心性、聚集性和影响力10.7.1.一个实体相对于另一个实体的影响力或重要性是图数据库的典型用例10.7.2.识别基础设施的关键部分,或者定位数据中的实体组10.7.3.要考虑实体、实体之间的关系、事件关系和邻近关系10.7.4.使用图数据库10.8.数据结构的灵活性不能作为选择图数据库的充分理由,但与其他功能相结合,很可能足以使你转而使用图数据库10.9.即使业务领域模型天生适合使用图数据库,但是如果你的具体技术问题并不依赖于图中的关系来求解,那么也应该考虑其他选择11.SQL11.1.SQL查询中包含大量join可能表明图数据库是一个很好的选择,但并不能确定11.2.SQL查询中的大量join通常是数据模型规范化的良好标志11.3.当这些join并非用于检索引用数据(如关系数据库中的第三个范式所做的那样),而是用于将记录项链接在一起(就像父子关系那样)时,就可能需要考虑使用图数据库了11.4.当我们不知道要执行的join数量时,使用图数据库的递归查询模式更好11.5.命令查询责任分离(CQRS)模式