技术开发 频道

你选择图数据库的原因只是因为它很火吗?

  【IT168 技术】导语:根据DB-Engines的统计,过去三年来,图数据库已成为数据库增长最快的类别。而亚马逊进入图数据库市场将使这种增长加速。更重要的是,这为企业增加了更多的选择机会,与所有市场一样,更多的竞争和选择将带来更大的市场和更好的产品,最终,受益的是用户。

你选择图数据库的原因只是因为它很火吗?

  现在所有主要的数据库玩家都已经加入图形数据库的行列,市场发展的下一阶段将趋于成熟。虽然一些图形数据库已经存在十年以上(如:Neo4j),但是今天的大部分图数据库产品依然可以说都是全新的。图数据库是否引起了你关注?图数据库又是否适合你的应用程序?

  什么是图数据库?

  在研究图数据库之前,我们先定义一些术语。什么是图数据库?图数据库用图来存储数据,是最接近高性能的一种用于存储数据的数据结构方式之一。

你选择图数据库的原因只是因为它很火吗?

  构成一张图的基本元素是节点(点)和关系(线)。节点和关系都可以设置自己的属性。节点经常被用于表示一些实体,但依赖关系也一样可以表示实体。节点之间的关系是图数据库很重要的一部分。通过关系可以找到很多关联的数据,比如节点集合,关系集合以及他们的属性集合。

  相对于关系数据库中的各种关联表,图形数据库中的关系可以通过关系能够包含属性这一功能来提供更为丰富的关系展现方式。

  灵活性是推动图数据库流行度激增的关键因素。在过去10年的时间里,对可用性和大规模的相同需求推动了各种NoSQL产品的开发和采用,从图数据库近期的趋势中看,这种走势将继续走强。

  何时需要图数据库?

  与任何流行的技术一样,有人可能会将图数据库应用于任何类型的问题上。但了解图数据库擅长的应用领域依然是非常重要的。例如,图数据库通常应用于问题域有:

  * 社交网络;

  * 推荐和个性化;

  * 客户360,包括实体解析(关联多个来源的用户数据);

  * 欺诈识别;

  * 资产管理;

  以上的各个应用领域或许与你的应用程序并不匹配,你也可以从以下因素中确定图数据库是否适合你的应用程序:

  * 多对多的关系。Martin Kleppmann在《设计数据密集型应用程序》(O'Reilly)一书中提到,如果问题中频繁的出现多对多关系,建议使用图表,因为关系数据库往往难以有效地处理这些关系。

  * 高价值的关系。经常听到的另一个观点:如果数据元素之间的关系与元素本身一样重要,甚至比元素本身更重要时,则应考虑使用图表。

  * 大规模的低延迟。在应用程序中添加另一个数据库也会增加应用程序的复杂性,图数据库能够比其他类型的数据库更快地处理大型数据集所表示的关系。尤其是在复杂的关系连接查询不再执行,并且没有对查询或关系结构进行额外优化的情况下。

  使用Gremlin定义图表模式和查询

  让我们从一个真实的例子来开始了解图数据库。KillrVideo是一个参考应用程序,用于共享和观看为帮助开发人员学习使用DataStax Enterprise而制作的视频,其中包括DataStax Enterprise Graph —— 基于高度可扩展的数据技术(包括Apache Cassandra和Apache Spark)的图数据库。

  使用Gremlin语言在DataStax Enterprise Graph中描述和交互图表,也是Apache TinkerPop项目的一部分。由于Gremlin的灵活性、可扩展性以及对声明式和命令式查询的支持,被称为描述图遍历的首选语言。Gremlin是基于Groovy语言的。最重要的是,Gremlin得到了DataStax Enterprise Grap等大多数流行图数据库的支持,包括DataStax Enterprise Graph、Neo4j、AWS Neptune和Azure Cosmos DB在内。

  我们设计了一个推荐算法来识别作为需要输入的数据。该方法类似于给特定户推荐喜爱的视频。我们的目标是在用户与KillrVideo应用程序交互时(即作为OLTP交互)实时生成推荐。

  为了定义模式,我们确定了由KillrVideo管理的数据的一个子集,这是图所需要的。包括用户、视频、评分和标签,以及可能在算法中引用的这些项目的属性,或者在推荐结果中提供的属性。然后我们在Gremlin中创建了一个如下所示的图表模式:

你选择图数据库的原因只是因为它很火吗?

  选择将用户、视频和标签建模为顶点,并使用线来确定哪些用户上传了哪些视频,用户给视频的评分以及与每个视频关联的标签。我们将属性分配给在查询中引用或包含在结果中的顶点和线上。DataStax Studio是一种用于在CQL和Gremlin中开发和执行查询的笔记本式开发工具。

  基于这个模式,我们定义了将数据填充到图中的查询,以及从图中检索数据的查询。以下是生成推荐的图表查询基本流程:确定特定的用户、识别与特定用户喜欢同一类视频的类似用户、选择类似用户喜欢的视频、排除特定用户已经观看过的视频、按照受欢迎程度对这些视频进行排序,并生成结果。

你选择图数据库的原因只是因为它很火吗?

  到目前为止,在这个遍历中我们已经确定了类似用户。遍历的第二部分采用了类似的用户抓取他们喜欢的一定量的视频,去除特定用户已经观看过的视频,并生成按受欢迎程度排序的结果集。

你选择图数据库的原因只是因为它很火吗?

  虽然这个遍历看起来很复杂,但这是推荐算法的整个业务逻辑,在这里我们就不详细的介绍这个遍历过程中的每一步了。

  我们建议使用DataStax Studio或Apache TinkerPop的Gremlin控制台等工具,在代表性数据集上交互式地开发遍历。这使你可以快速迭代并优化遍历。DataStax Studio是一个基于Web的环境,提供了多种方法来将遍历结果可视化为节点和边的网络,如下图所示。

你选择图数据库的原因只是因为它很火吗?

  将图数据库合并到架构中

  一旦你设计了图表模式和查询,就可以将图表集成到你的应用程序中。以下是我们将DataStax Enterprise Graph集成到KillrVideo中的方法。 KillrVideo的多层架构由一个Web应用程序组成,该应用程序位于一组管理用户、视频(包括标签)和评级的微服务之上。这些服务利用DataStax Enterprise Graph数据库(基于Apache Cassandra)进行数据存储,并使用CQL访问数据。

  我们将推荐引擎作为推荐视频服务的一部分实施,如下所示。此服务将生成一个特定用户标识的建议列表。为了实现推荐引擎,我们将上述的Gremlin遍历翻转换为Java代码。

你选择图数据库的原因只是因为它很火吗?

  这种架构突出了微服务体系结构中的一个常见挑战 —— 需要与多个服务拥有的数据进行交互。如上所示,用于生成推荐的图表依赖于用户管理、视频目录和评分服务的数据。

  我们通过使用异步消息来保存现有服务的数据所有权。用户管理、视频目录和评分服务在数据更改上发布事件。推荐的视频服务订阅这些事件,并对这些图表进行相应的更新。

  在Java中实现Gremlin遍历

  DataStax Java驱动程序提供了一个友好又流畅的API来实现Gremlin与DataStax Enterprise Graph的遍历。API能轻易使在DataStax Studio中创建的基于Groovy的查询转换为Java代码。

  然后,我们可以通过使用名为DSLs的Gremlin特性(即域名特定语言)来使Java代码更具可读性和可维护性。DSL是Gremlin进入特定领域的延伸。对于KillrVideo,我们创建了一个DSL来扩展与视频域相关的术语的Gremlin遍历实现。KillrVideoTraversalDsl类定义查询操作,例如user()(它使用提供的UUID定位图中的顶点)和recommendByUserRating(),它根据参数(例如最低等级和请求推荐量)为用户生成推荐。

  使用DSL将推荐视频服务的实现简化为如下的示例,它创建了一个GraphStatement,然后我们使用DataStax Java Driver执行:

你选择图数据库的原因只是因为它很火吗?

  使用DSL,可以在可重用函数中隐藏图表交互的一些复杂性,然后根据需要将它们组合起来形成更复杂的遍历。这将允许我们额外的推荐引擎,从user()方法提供的特定用户顶点开始,允许应用程序在不同的实现之间进行交换。

  希望通过这篇文章你能了解一些关于图数据库对你的应用程序的意义,以及如何使用Gremlin和DataStax Enterprise Graph。

0
相关文章