
图数据库是NoSQL类数据库的又一大典型代表,在国内图数据库属于新兴事物,其优异的复杂关系解决方案引起了国内众多大型互联网公司及IT开发者的关注,而Neo4j是目前图形化数据库中最为出色、最为成熟的产品。本书的第一版书名是《Neo4j**指南》,发行量超过13000册,本书在第一版的基础上补充完善了Neo4j的新特性、新功能。
本书基于Neo4j 4.4版本编写,共分10章,涵盖基本概念、基础入门、查询语言、程序开发技术、管理运维、集群技术、应用案例、高级应用、配置设置、内建过程、GDS、Fabric等内容。
本书内容涉及Neo4j的大部分知识,既可以作为Neo4j初学者的入门教材,也可以作为相关行业Neo4j技术专家的参考手册。
前 言
本书是继《Neo4j权威指南》之后第二本由中国人原创的图数据库专业书籍。
图数据库的发展日新月异,短短三年时间,国内外涌现出多款图数据库系统,然而在DBEngine排名中,Neo4j依然稳居第一。本书将陪伴你漫步“图”的世界,领略“图”的风采,玩转大数据时代新的利器——图数据库Neo4j。
“图数据库”即便对业内人士而言,也是一个陌生的词汇。单这个“图”字,便会使人联想到图形、图片或图像。正如,最近一位朋友得知我在玩图数据库,就邀我去做一个用语音控制图像的产品。我解释了半天,才让他明白:此“图”非彼“图”。误解就在这个“图”字上。
那么,图数据库究竟是什么?优势在哪儿?可以用它来干什么?
图数据库定义、优势与应用领域
图数据库是一个新型的数据库系统。大家以前可能听到过MySQL、Oracle等数据库,但随着社交、金融、零售等行业的发展,亟需一种新型的数据库来支撑这些新的业务。现实社会织起了一个庞大而复杂的关系网,比如天天有人给你打电话要你买房子,他们是通过什么技术来找到你的呢?就是通过一些关系运算。如果使用传统的数据库会很难处理,而采用图数据库来处理它,会更高效、更方便。在科技领域里有一个六度空间理论,简单地说,就是世界上任何两个人最多只需通过6个关系就一定能够找到对方。用图数据库就可以把这个理论变成现实。所以,称它为一种新型的数据库完全不为过,它能支持海量、复杂、多变数据的关系运算,而且运算性能非常高。
和传统数据库比起来,图数据库的优势在哪儿呢?
首先,图数据库可以说是应专门处理这种复杂关系网的“运”而生的。虽然传统的数据库也能处理,但其效率极其低下,功能扩展也很困难,要花的时间将很长,而用图数据库就能方便、高效地解决这个问题;更重要的是,就连非技术人员都能看得懂。如果用传统数据库来构建,其模型非常复杂、烦琐,相比而言,用图数据库,就非常直观、浅显、简单。
图数据库的应用领域非常广,在社交、零售、金融等领域都有广泛的应用案例。比如说社交,一个最典型的应用就是领英。领英在国际上的知名度和应用的广度相当于我们中国的微信。领英一个最重要的功能就是能够把你朋友的朋友的朋友推荐给你,这是进行了关系运算的结果。另外一个就是零售商品的实时推荐,比如沃尔玛,你在它的网站上点击了几个商品后,它就能揣测出你可能对哪些商品感兴趣,就会立马把你感兴趣的商品推荐给你。用图数据库来计算这种推荐会更快捷。现在国外用得很多,但是在我们国内才刚刚开始。随着图数据库的应用,不久的将来我们就可以享受到更为实时、准确、方便的推荐。
总之,图数据库能高效地处理各种复杂的关系网络,在许多领域有着广泛的应用。它是基于图论而实现的新型数据库系统,擅长处理大量的、复杂的、互联的、多变的网状数据,其效率远远高于传统的关系数据库。
本书背景
世界上很多著名的公司都在使用图数据库。比如,领英用它来管理社交关系,实现朋友推荐,构建了一个非常强大的人脉网络;沃尔玛用它连接“商品关联”和“买家习惯”两个子网,实现了零售商品的实时推荐,给买家带来更好的购物体验;思科用它做主数据管理,将企业内部的组织架构、产品订购、社交网络、IT网络等有效地管理起来;惠普用它管理复杂的IT网络;全美排名前三的金融公司,都在用图数据库进行风控业务管理。此外,物流、交通、电信、制造业、广告、打印、文化传媒和医疗等领域的公司也在使用图数据库。
反观我国的情况又如何呢?我是从2015年开始研究图数据库的,当时国内知道图数据库的人还寥寥无几。令人意想不到的是,才短短一年多时间,国内竟然有很多领域都用上了图数据库,涉及的领域包括金融、社交、商务、知识管理等。毋庸置疑,其发展速度将远超我们的想象。
然而遗憾的是,目前市面上有关图数据库的中文书籍屈指可数,即便有也是直接从英文原版翻译而成。随着图数据库在中国的推广和普及,大家都渴求有一本国人原创的权威指南,能系统、全面地涵盖图数据库的原理和使用方法等方方面面内容。因此,我们决定集中组织国内对图数据库有深入研究的专家,共同编写一套原创的中文版图数据库技术丛书。
本书内容
本书基于Neo4j 4.4版本编写,共分10章,涵盖基本概念、基础入门、查询语言、开发技术、管理运维、集群技术、应用案例、高级应用、中文扩展、配置设置、内建过程、GDS、Fabric等内容。各章简要介绍如下:
第1章 Neo4j图数据库基础。介绍图数据库概念以及Neo4j的体系结构。本章可以作为初学者的入门部分。有经验者可以略过,直接阅读后续章节。
第2章 Neo4j基础入门。引导读者初步使用Neo4j,包括Neo4j的安装部署、操控平台的使用、引导实例。
第3章 Neo4j之Cypher。详细介绍Cypher语法,它是Neo4j引擎的接口语言,掌握好它是用好 Neo4j 的关键,也是使用中常备的参考资料。
第4章 Neo4j程序开发。详细讨论如何将Neo4j与开发平台、编程语言之间进行集成,并提供相应的开发实例。
第5章 Neo4j数据库管理。介绍Neo4j数据库管理相关的内容,主要包括:部署、监控、安全管理、运维与优化、备份与恢复、数据库管理相关工具等基本知识和基本操作。
第6章 存储过程库APOC。主要介绍Neo4j存储过程基本原理以及多个常用存储过程的使用方法。
第7章 图数据科学库GDS。主要介绍Neo4j图形数据科学库中的主要概念。该库的目标是:“为Neo4j提供高效实现的并行通用图形算法版本,以Cypher过程的形式公开”。
第8章 集群技术与Fabric。对Neo4j集群的概念进行讲解以及如何去搭建各种类型的集群,还有Fabric新特性的讲解。
第9章 Neo4j应用案例。介绍Neo4j在多个业务场景中的应用实例,包括每个实例的业务分析、图建模、查询分析,并提供了实例源码。
第10章 Neo4j高级应用。介绍高级索引、Docker环境部署、与大数据平台的数据交互、消息总线应用、区块链应用、Neo4j与自然语言处理等高级话题。
本书源码下载与技术支持
本书配套的源码,需要用微信扫描下面二维码获取,可按扫描出来的页面提示,填入你的邮箱,把链接转发到邮箱中下载。如果有问题或建议,请联系booksaga@163.com,邮件主题务必写“精通Neo4j”。
创作团队与致谢
《精通Neo4j》是继《Neo4j权威指南》之后又一本倾注了编委团队大量心血的好书。本书的编写历经了一些波折,但最终还是在编委团队的齐心协力下定稿。在此,除了要感谢本书编委团队成员外,更需要感谢本书上一版本编委们打下的良好基础,他们是:张帜(张老师)、庞国明(小明)、胡佳辉(家辉)、苏亮(小亮)、杨志(大志)、于松林(松林)。
然而,Neo4j实在发展太快了,我们的书怎么也跟不上它的新版本。在你看到本书时候,相信Neo4j又有了不少新的版本。好在Neo4j已经比较成熟,书中介绍的语法及例子绝大部分不会过时,在Neo4j新版本下大部分情况下本书介绍的语法和示例都能使用。
希望本书能对你有所帮助。
张 帜
2022年9月
目 录
第1章 Neo4j图数据库基础 1
1.1 图数据库背景知识 2
1.1.1 图数据库历史 2
1.1.2 图数据库应用领域 6
1.1.3 主流图数据库介绍 7
1.2 图数据库基础概念 11
1.2.1 图数据模型 11
1.2.2 图计算引擎 12
1.3 图数据库与关系数据库的对比 13
1.3.1 关系数据库的弊端 13
1.3.2 图数据模型的优势 13
1.4 图数据库与其他NoSQL数据库的对比 15
1.4.1 其他NoSQL数据库的弊端 15
1.4.2 将键值对存储与图数据库相关联 15
1.4.3 将文档存储与图数据库相关联 16
1.5 Neo4j概述 16
1.6 Neo4j版本升级与变化 18
1.7 Neo4j的体系结构 22
1.7.1 免索引邻接 22
1.7.2 Neo4j底层存储结构 24
1.7.3 Neo4j的遍历方式 27
1.7.4 Neo4j的存储优化 29
1.8 Neo4j版本全貌 29
1.8.1 Neo4j AuraDB 29
1.8.2 Neo4j Desktop 29
1.8.3 Neo4j Sandbox 30
1.8.4 Neo4j社区版 30
1.8.5 Neo4j企业版 31
第2章 Neo4j基础入门 32
2.1 Neo4j的安装部署 32
2.1.1 Neo4j安装包的下载 33
2.1.2 在各个操作系统上的安装 35
2.1.3 Neo4j的启动 40
2.2 Neo4j管理平台的使用 43
2.2.1 Neo4j Desktop桌面管理平台的使用 43
2.2.2 Web管理平台的使用 45
2.2.3 cypher-shell命令的使用 48
2.3 Neo4j图数据中基本元素与概念 51
2.3.1 节点 51
2.3.2 关系 52
2.3.3 属性 53
2.3.4 路径 53
2.3.5 遍历 54
2.4 官方入门实例介绍 54
2.4.1 创建图数据 55
2.4.2 检索节点 56
2.4.3 查询关系 58
2.4.4 思考与练习 61
2.4.5 清空数据库 62
2.5 批量导入工具的使用 63
2.5.1 ETL导入工具的使用 63
2.5.2 获取CSV文件 75
2.5.3 使用Load CSV指令导入到Neo4j 78
2.5.4 使用neo4j-import工具导入到Neo4j 80
第3章 Neo4j之Cypher 82
3.1 Cypher概述 82
3.1.1 Cypher是什么 82
3.1.2 模式(Patterns) 84
3.1.3 查询和更新图 86
3.1.4 事务 86
3.1.5 唯一性 87
3.1.6 兼容性 88
3.2 基本语法 89
3.2.1 类型 89
3.2.2 表达式 89
3.2.3 变量 92
3.2.4 参数 92
3.2.5 运算符 95
3.2.6 注释 96
3.2.7 模式 96
3.2.8 列表 99
3.2.9 空值 105
3.3 语句 106
3.3.1 MATCH语句 106
3.3.2 OPTIONAL MATCH语句 116
3.3.3 WHERE语句 117
3.3.4 START语句 128
3.3.5 Aggregation语句 129
3.3.6 LOAD CSV语句 135
3.3.7 CREATE语句 139
3.3.8 MERGE语句 143
3.3.9 SET语句 152
3.3.10 DELETE语句 156
3.3.11 REMOVE语句 157
3.3.12 FOREACH语句 158
3.3.13 CREATE UNIQUE语句 159
3.3.14 RETURN语句 162
3.3.15 ORDER BY语句 166
3.3.16 LIMIT语句 168
3.3.17 SKIP语句 169
3.3.18 WITH语句 171
3.3.19 UNWIND语句 173
3.3.20 UNION语句 174
3.3.21 CALL语句 176
3.4 函数 180
3.4.1 断言函数 180
3.4.2 标量函数 183
3.4.3 列表函数 190
3.4.4 数学函数 195
3.4.5 字符串函数 203
3.4.6 自定义函数 208
3.5 索引 209
3.5.1 简介 209
3.5.2 创建索引 211
3.5.3 列出索引 212
3.5.4 删除索引 213
3.5.5 未来的索引 213
3.6 全文索引 213
3.6.1 创建全文索引 214
3.6.2 基于全文索引的查询 215
3.6.3 删除全文索引 216
3.7 约束 216
3.7.1 简介 216
3.7.2 创建约束 217
3.7.3 删除约束 218
3.7.4 列出约束 218
3.8 数据库管理 219
3.8.1 列出数据库 219
3.8.2 创建数据库(仅企业版) 220
3.8.3 更改数据库 221
3.8.4 停止数据库 221
3.8.5 启动数据库 221
3.8.6 删除数据库 221
3.8.7 WAIT选项(仅企业版) 222
3.8.8 创建数据库别名(仅企业版) 222
3.8.9 更改数据库别名(仅企业版) 223
3.8.10 删除数据库别名 223
3.9 查询调优 223
3.9.1 Cypher查询选项 223
3.9.2 查询性能分析 227
3.9.3 索引使用 227
3.9.4 基础查询调优举例 244
3.9.5 高级查询调优举例 248
3.9.6 USING语句 256
3.10 执行计划 270
3.10.1 执行计划运算符详细介绍 271
3.10.2 Expand 运算符 279
3.10.3 组合运算符 284
3.10.4 行运算符 299
3.10.5 更新运算符 310
3.10.6 最短路径规划 313
第4章 Neo4j程序开发 318
4.1 Neo4j开发入门 318
4.1.1 Java嵌入式开发模式 318
4.1.2 各语言驱动包开发模式 318
4.2 Java API嵌入式开发模式 319
4.2.1 Java开发前的准备工作 320
4.2.2 创建Neo4j图实例 324
4.2.3 图数据遍历功能 329
4.2.4 数据索引 336
4.2.5 用户自定义过程 343
4.2.6 用户自定义函数 350
4.2.7 用户自定义聚合函数 350
4.2.8 事务管理 352
4.2.9 使用Java在线备份Neo4j 358
4.2.10 使用JMX监控Neo4j 358
4.3 各语言驱动包开发模式 360
4.3.1 驱动开发入门 360
4.3.2 客户端应用 367
4.3.3 Cypher语句工作流 381
4.3.4 数据类型 386
4.3.5 异常和错误处理 389
4.4 Neo4j HTTP API 389
4.4.1 简介 389
4.4.2 认证和授权 390
4.4.3 发现API 391
4.4.4 Cypher事务API 391
4.5 其他开发技术介绍 407
4.5.1 Spring-Data-Neo4j 407
4.5.2 Spring-Data-Neo4在项目中的部署 407
4.5.3 使用Neo4j-OGM的对象图映射 408
4.5.4 使用JDBC连接Neo4j 409
4.5.5 JCypher 409
4.5.6 Groovy&Grails:Neo4j Grails插件 410
4.5.7 Clojure:Neocons 410
4.5.8 Scala:AnormCypher 410
4.5.9 JPA:Hibernate OGM 411
第5章 Neo4j数据库管理 412
5.1 部署与配置 412
5.1.1 系统需求 412
5.1.2 neo4j.conf文件 414
5.1.3 文件位置 415
5.1.4 重要端口 417
5.1.5 设置初始密码 417
5.1.6 密码和用户的恢复 418
5.1.7 等待Neo4j启动 421
5.1.8 使用数据收集器 421
5.1.9 配置Neo4j连接器 422
5.1.10 动态设置 424
5.1.11 事务日志 426
5.1.12 安装证书 428
5.2 备份与恢复 428
5.2.1 备份简介 428
5.2.2 执行备份 430
5.2.3 恢复备份 433
5.3 认证和授权 434
5.3.1 简介 434
5.3.2 内置角色 435
5.3.3 细粒度访问控制 436
5.3.4 与LDAP集成 451
5.3.5 管理过程权限 456
5.3.6 相关术语 457
5.4 安全管理 458
5.4.1 安全扩展 458
5.4.2 SSL框架 458
5.4.3 术语 460
5.4.4 浏览器凭证处理 461
5.4.5 安全清单 461
5.5 监控管理 462
5.5.1 指标 462
5.5.2 日志 468
5.5.3 查询管理 471
5.5.4 事务管理 474
5.5.5 连接管理 475
5.5.6 监控因果集群 477
5.5.7 监控单个数据库状态 482
5.6 性能管理 485
5.6.1 内存配置 485
5.6.2 索引配置 489
5.6.3 调整垃圾收集器 492
5.6.4 Bolt线程池配置 493
5.6.5 Linux文件系统调优 494
5.6.6 磁盘、内存及其他提示 494
5.6.7 统计和执行计划 495
5.6.8 压缩存储 497
5.7 数据库管理相关工具 498
5.7.1 导入工具 498
5.7.2 Cypher Shell 501
5.7.3 转存和加载数据库 504
5.7.4 解绑核心服务器 505
5.7.5 一致性检查工具 505
第6章 存储过程库APOC 507
6.1 安装 507
6.1.1 APOC核心库的安装 507
6.1.2 APOC完整库的安装 507
6.1.3 配置选项 508
6.1.4 安装验证 509
6.2 用法 509
6.2.1 语法 509
6.2.2 帮助手册 509
6.2.3 运行注意事项 509
6.3 过程和函数 510
6.3.1 Neo4j运维类 510
6.3.2 APOC运维类 510
6.3.3 数据操作类 511
6.3.4 数据库集成类 512
6.3.5 图操作类 512
第7章 图数据科学库GDS 515
7.1 简介 515
7.2 安装 516
7.2.1 支持的Neo4j版本 516
7.2.2 Neo4j Desktop 516
7.2.3 Neo4j服务器版 517
7.2.4 Neo4j企业版 517
7.2.5 Neo4j Docker 517
7.2.6 Neo4j因果集群 517
7.2.7 其他配置项 517
7.2.8 系统需求 518
7.3 常见用法 519
7.3.1 内存估计 519
7.3.2 创建图 521
7.3.3 运行算法 522
7.3.4 日志记录 523
7.3.5 系统监控 524
7.4 图管理 525
7.4.1 图 525
7.4.2 节点属性 532
7.4.3 实用函数 533
7.4.4 GDS库上的Cypher 533
7.4.5 匿名图 533
7.4.6 管理图(企业版) 534
7.5 主要算法 534
7.5.1 中心性算法 534
7.5.2 社区检测算法 534
7.5.3 相似度算法 535
7.5.4 路径搜索算法 535
7.5.5 拓扑链路预测算法 536
7.5.6 节点嵌入算法 536
7.6 机器学习 536
7.6.1 节点分类管道 536
7.6.2 链路预测管道 542
7.6.3 管道 543
7.6.4 模型 543
7.7 Python客户端 545
7.7.1 安装 545
7.7.2 Python客户端的使用 546
7.7.3 与Cypher API之间的映射关系 547
7.7.4 图对象 547
7.7.5 算法执行 549
第8章 集群技术与Fabric 550
8.1 因果集群 550
8.1.1 初识因果集群 551
8.1.2 操作视图 551
8.1.3 因果一致性 553
8.2 因果集群部署 554
8.2.1 配置含有单个实例和多副本实例的集群 554
8.2.2 配置含有核心实例的集群 555
8.2.3 现有集群添加核心服务节点 557
8.2.4 现有集群添加辅助服务节点 558
8.2.5 现有集群剥离辅助服务节点 558
8.2.6 连接辅助服务节点 559
8.3 因果集群迁入初始化数据 559
8.3.1 数据迁入介绍 559
8.3.2 通过数据库转存进行集群数据迁入(离线) 560
8.3.3 通过数据库备份进行数据迁入(在线) 560
8.3.4 使用导入工具进行数据迁入 563
8.4 因果集群内部成员发现 563
8.4.1 概述 563
8.4.2 使用服务器地址列表进行发现 563
8.4.3 使用具有多个记录的DNS进行发现 564
8.4.4 在Kubernetes中发现 564
8.5 因果集群内部加密 564
8.5.1 概述 565
8.5.2 部署示例 565
8.6 因果集群内部结构 566
8.6.1 选举与领导 566
8.6.2 领导权均衡 567
8.6.3 多数据库与调节器 567
8.6.4 服务器端路由 567
8.6.5 存储副本 569
8.6.6 磁盘状态 569
8.7 Fabric 570
8.7.1 Fabric概述 570
8.7.2 Fabric部署示例 570
8.8 Fabric配置 572
8.8.1 Fabric数据库安装 572
8.8.2 认证与授权 575
8.8.3 重要设置 576
8.9 Fabric查询 577
8.10 使用复制命令分片数据 579
第9章 Neo4j应用案例 582
9.1 应用案例概述 582
9.2 欺诈检测 585
9.2.1 第一方银行欺诈 586
9.2.2 保险欺诈 592
9.2.3 电子商务欺诈 596
9.2.4 小结 597
9.3 科研导图 597
9.4 电子邮件监测 605
9.5 工商企业图谱 610
9.6 社交网络 616
9.7 Neo4j在汽车生产和零件制造业中的作用 623
9.7.1 汽车企业数据概览 624
9.7.2 供应链管理 625
9.7.3 保修分析 626
9.7.4 客户360 628
9.7.5 知识图谱 629
9.7.6 真实的案例 630
第10章 Neo4j高级应用 632
10.1 Bloom可视化工具 633
10.1.1 功能介绍 633
10.1.2 安装方法 634
10.1.3 界面及展示效果 636
10.1.4 灵活的定制化查询 636
10.2 ETL工具 637
10.2.1 功能介绍 637
10.2.2 ETL工具的安装 637
10.2.3 使用ETL工具从关系数据库导入 640
10.2.4 压缩包版命令行ETL工具的导入 646
10.3 高级索引 648
10.3.1 空间索引(Neo4j Spatial) 648
10.3.2 自定义中文全文索引 656
10.4 在Docker环境下部署Neo4j 662
10.4.1 Docker概述 663
10.4.2 Docker安装Neo4j的优点 663
10.4.3 Docker安装Neo4j 663
10.5 在Kuberenetes环境下部署Neo4j 665
10.5.1 关于Neo4j Helm 665
10.5.2 Neo4j Helm的使用 665
10.5.3 配置Neo4j Helm 665
10.5.4 部署 666
10.6 Neo4j与图计算 670
10.6.1 Neo4j-Spark-Connector 671
10.6.2 Neo4j-Spark-Connector提供的API 674
10.7 Neo4j与自然语言处理 675
10.7.1 计算聚合相关性 675
10.7.2 将文本数据建模为邻接图 676
10.7.3 加载数据 677
10.7.4 挖掘单词之间的关系 678
10.8 Neo4j 中运行本体推理 681
10.8.1 安装Neosemantics (n10s)组件 681
10.8.2 本体模型与数据模型 683
10.8.3 使用Tushare获取数据 684
10.8.4 对数据进行预处理 687
10.8.5 将CSV数据导入Neo4j 689
10.8.6 运行推理查询 691
10.9 Neo4j与区块链 694
10.9.1 比特币区块链 694
10.9.2 区块链数据格式 697
10.9.3 图数据建模 699
10.9.4 数据写入Cypher语句 700
10.9.5 查询区块链数据 703
10.10 Kafka与Neo4j数据同步 705
10.10.1 Kafka简介 705
10.10.2 Kafka安装运行 706
10.10.3 Neo4j Streams插件安装部署 707
10.10.4 从Kafka同步数据到Neo4j 708
一种大数据时代的新利器
一种高性能原生的数据库
一种擅长关系分析的数据库
一种新型的NoSQL数据库
一种巨头们都在用的数据库
庞国明,是Neo4j中文社区创始人,高级信息系统项目管理师,系统架构师。