图数据库实战
上QQ阅读APP看书,第一时间看更新

关于本书

本书是为所有使用图数据库来构建应用程序的人编写的,旨在让你对图和图数据库拥有基本的理解,以及为使用常见图数据库模式来构建应用程序提供框架。为了讲授这个框架,本书遵照软件开发生命周期来开发一个虚构的应用程序,名为“友聚”(DiningByFriends)。在整本书中,我们将通过这个应用程序来具体地展现图原理以及所讲授概念和内容的例子。本书将在多处比较构建图应用程序和使用传统关系数据库模型之间的差异。最终,你不仅将拥有构建图应用程序所需的技能,还将构建自己的第一个应用程序“友聚”。

本书面向想使用图数据库作为其应用程序后端数据存储的程序开发人员、数据工程师和数据库开发人员。本书并不期望你具备任何使用图数据库的经验,但是你应该熟悉数据建模概念,特别是关系数据库的开发,因为这些概念将在整本书中被作为常见参考标准而大量使用。尽管所有应用程序代码都是用Java编写的,但任何具有面向对象应用程序开发经验的开发人员应该都能够理解这些概念和内容。

本书分为三个部分,共11章。第一部分“图数据库入门”将为“友聚”应用程序建立基础。

● 第1章首先介绍图及相关术语;然后讨论图数据库与关系数据库的区别,以及如何使用图数据库来解决高度关联数据问题;最后将讨论什么样的问题适合使用图数据库来解决。

● 第2章通过为“友聚”应用程序建立初始数据模型来着手实践。最终,你会熟悉一套框架,它能把业务需求和概念数据模型转换成使用图数据库元素顶点、边和属性的初始数据模型。

● 第3章开始介绍图遍历,主要学习图数据库的查询过程(遍历)。你将了解如何用图数据库检索和筛选数据;然后学习如何导航图数据库结构,以及使用图数据库与关系数据库的区别;最后会看到如何轻松地递归遍历一个图,以检索复杂、互联的数据。

● 第4章继续图遍历的旅程,涵盖数据变化用例;然后展示如何遍历图来找到连接两者的实体和关系,即路径;最后研究如何借助关系上的属性来筛选遍历和提升性能。

● 第5章结束对图遍历的初步关注,讨论如何将遍历结果格式化为所需的输出。另外,你将学习如何执行常见操作,例如排序、筛选和限制返回的结果。

● 第6章开始构建“友聚”应用程序,把第3~5章开发的遍历合并到“友聚”Java应用程序中。然后,这一章会通过处理结果来结束第一部分。

第二部分“使用图数据库构建应用程序”扩展了第一部分介绍的概念。

● 第7章使用第2章中的数据建模技术以及你所学的关于遍历图的知识来扩展数据模型,用于更复杂的用例,例如推荐引擎和个性化。

● 第8章借助推荐引擎的用例,演示使用强大的熟路模式来创建稳健的推荐应用程序模式。

● 第9章使用我们的个性化用例来演示如何在图应用程序中使用子图访问模式。

第三部分“进阶”将跨越“友聚”应用程序,讨论开发过程的后续步骤。

● 第10章讨论如何调试和排除常见的遍历性能问题,然后研究超级节点到底是什么以及它为什么会在图应用程序中产生问题。你还会了解这些常见的应用程序及遍历陷阱和反模式带来的性能问题,以及如何识别和避免这些问题。

● 第11章从前瞻性的角度出发,讨论你可能希望用在图应用程序中的更多知识;还会讨论一些最常见的图分析算法,以及如何应用这些算法来解决特定的问题;最后将概述如何在机器学习中应用图。

本书包含大量代码示例,既有带编号的代码清单,又有在正文中出现的代码。在这两种情况下,代码都采用等宽字体,以便与普通文本区分开来。

在很多情况下,本书会对原始代码重新进行格式化,比如添加换行符和重排缩进,以适应页面大小。在极少数情况下,还会在代码清单中使用行延续标记(➥)。除此之外,代码清单中还会有许多代码注释,以突出强调重要的概念。

本书中的示例代码可以从图灵社区本书主页下载。

本书的目标是帮助你掌握构建图应用程序所需的概念知识。为了提供这些概念的实际示例,我们必须选择用于演示的具体技术和产品。

第一个选择是数据库的具体类型。我们决定使用带标注的属性图数据库(labeled property graph database),而不是RDF存储或Triple Store数据库。这是因为带标注的属性图数据库是具体产品中最常见的类型,而且似乎是发展势头较好的图数据库。另外,带标注的属性图数据库的相关概念最接近我们熟悉的关系数据库,因此用于做对比会有很好的效果。

这也引出了我们面临的下一个选择:要使用的遍历语言是openCypher还是Gremlin?

虽然使用openCypher的理由很充分,但本书的目标是尽可能保持与具体产品无关。这样一来,当你开始构建应用程序时,就可以很容易地将所学概念和技术应用于许多流行的数据库。这一点很重要。最后,我们决定使用Apache TinkerPop 3.4.x框架,因为它兼容绝大多数图数据库产品。

在本书的立项和评审过程中,我们多次被问到为什么选择TinkerPop/Gremlin技术栈,而不是Neo4j/Cypher技术栈。鉴于Neo4j生态系统的普及程度,提出这个问题很合理,值得全面解释。我们选择TinkerPop的Gremlin作为本书演示所用的技术,有三个理由:

● Gremlin更适合用来教授遍历工作原理;

● Gremlin是企业级应用程序的常用语言;

● Gremlin在不同属性图数据库产品之间的可移植性最高。

关于第一个理由,我们认为与Cypher/openCypher的声明式方法相比,Gremlin的命令式设计为学习图查询工作原理提供了更好的教学工具。Gremlin的语法需要我们去思考如何在图中移动查询光标,以确定查询光标下一步要移动到哪里。虽然我们确实欣赏Cypher/openCypher的简单性,但它也可能会在解决关键技术问题时令人混淆,特别是在处理性能或规模问题时。因此,虽然Cypher/openCypher是学习如何处理关联数据的一个良好起点,但我们认为Gremlin更适合构建高性能、可伸缩的数据应用程序。

出于第二个理由,许多应用程序使用的图数据库支持TinkerPop。这意味着Gremlin是首选的查询语言。虽然一些企业同时拥有使用Cypher/openCypher和Gremlin的应用程序,但根据我们的经验,更大、更复杂的企业级项目似乎都选择了支持TinkerPop的图数据库或云服务。

至于第三个理由,就目前来讲,Gremlin是跨图数据库引擎最广泛可用的查询语言。几乎所有主要云供应商(AWS、Microsoft Azure、IBM、华为云等)都提供兼容Gremlin的图数据库或服务。唯一的例外是Google云平台,它提供的是Neo4j服务。

我们的目标并不是倡导使用具体的某一种图数据库或语言。我们只是希望提供一个坚实的基础,让你知道如何在构建具有高度关联数据的应用程序时使用图数据库,并展示图数据库是如何工作的。我们认为,Gremlin是实现这一目标的最佳途径。

在决定使用TinkerPop的Gremlin之后,我们不得不选择一个支持TinkerPop的特定数据库。本着与具体产品无关的精神,我们决定在示例中使用TinkerGraph。TinkerGraph是Gremlin Server和Gremlin Console使用的图实现,而Gremlin Server和Gremlin Console都在Apache软件基金会TinkerPop项目的参考软件之列。

最后,必须选择一种编程语言来构建示例应用程序“友聚”。由于Java是图数据库最常用的语言,因此我们选择它作为应用程序的开发语言。应该注意的是,用其他语言(如C#、JavaScript和Python)也可以构建相同的应用程序。这不仅是可能的,我们自己也做到了。但是本书中提供的所有遍历都是使用Gremlin编写的,所有应用程序代码都是使用Java编写的。

虽然本书介绍的几乎所有概念都不是支持TinkerPop的数据库所特有的,但还是有极少数例外。在这种情况下,我们会标注在何处使用了TinkerPop特有的功能,以便你知道某个特定功能可能在你所选择的图数据库中不可用。如果没有给出这样的标注,就可以默认所讨论的概念也适用于其他带标注的属性图数据库。

购买本书的读者可以免费访问由Manning管理的私有在线论坛。你可以在该论坛上发表与本书有关的评价,提出技术问题,接受来自作者及其他用户的帮助。你可以通过https://livebook.manning.com/#!/book/graph-databases-in-action/discussion来访问该论坛,还可以在https://livebook.manning.com/#!/discussion上了解更多有关Manning论坛及行为准则的信息。

关于该论坛,Manning的承诺是提供一个读者之间以及读者和作者之间可以进行有意义对话的场所。这并不意味着作者将会全身心投入该论坛,作者对于该论坛的贡献仍然是自愿而且无偿的。所以我们建议你问一些具有挑战性的问题来激发作者的兴趣!只要本书还在销售,都可以登录该论坛,查阅以前的帖子。

扫描下方二维码,即可获取电子书相关信息及读者群通道入口。