跳转到主要内容
Chinese, Simplified

让我们探索多种可用的数据库,并使用PostgreSQL和ApacheAGE进行图形模型实验

数据库环境

当谈到数据库时,对大多数人来说,第一个想到的是经典的关系数据库,或者他们经常提到的SQL数据库。在这些数据库中,数据存储在表中的行和列中,这些行和列可以通过外键相关联,外键是一个或多个链接回另一个表中行的主键(也称为ID)的列。

近五十年来,关系数据库一直是常态,但近年来,出现了其他类型的数据库来处理关系模型可能显示其局限性(主要是性能和可扩展性)的特定用例。

在过去的十五年里,已经创建了许多不同类型的数据库,如列数据库(例如AWS Dynamo DB或Apache Cassandra)、文档数据库(MongoDB或CouchDB)和图形数据库(Neo4J)。

创建这些新形式的数据库中的每一种都是为了更好地满足特定应用程序领域的需求,并提高传统关系系统的性能和可扩展性。

为什么要使用图形数据库

如果我们谈论存储数据并能够查询数据,那么关系数据库几乎可以很好地对每个应用程序领域进行建模。但在某些情况下,关系模型在性能或复杂性方面并不是最佳选择。在这些上下文中,关系与实体本身具有相同甚至更大的含义。

让我们借用《图形数据库》第二版一书中关于数据中心域上下文的一个例子(您可以从Neo4J网站上获取该书的副本)。

A Datacenter ER example model

A Datacenter ER example model

这仍然是一个非常简单的域上下文,但它有足够数量的实体和关系,可以开始使传统数据库上的查询变得又大又慢。

以下是先前ER模型上的密钥和关系的可能建模

The tables an relationships for the datacenter model

现在,让我们试着想象一个查询,它查找受基础结构的某个组件(服务器、负载均衡器、数据库等)故障影响的用户。您可能会得到一个带有许多JOIN的怪物查询,或者有很多小查询,每个查询都指向模型中的特定资产。当然,我们将能够得到问题的答案,但性能可能会成为一个问题,尤其是当资产数量开始增长时。

现在,让我们尝试将上一个域建模为具有资产和它们之间关系的Graph。

Example graph model for the Datacenter context

Example graph model for the Datacenter context

首先你可以注意到,现在关系已经成为模型中的“头等公民”,这意味着现在每个箭头都有一个特定的含义,比如HOSTED_BY、RUNS_ON、USES、USER_OF等等。在关系模型中,您只知道一个表链接到另一个表,但这种关系的含义可能很难理解。

例如,如果现在前一张图片的用户3报告了一个问题,我们可以通过发出以下查询来查询该图,以查找任何可能涉及的资产:

MATCH (user:User)-[*1..5]-(asset:Asset)
WHERE user.name = 'User 3' AND asset.status = 'down'
RETURN DISTINCT asset

等待这是什么样的疑问?!?这是一种名为Cypher的查询语言,由Neo4J引入,旨在以一种简单的方式查询图。它被定义为“在图表中导航的某种ASCIIart”。

前面的查询用通俗英语翻译如下:查找任何名为“用户3”的用户,该用户与状态为“向下”的资产有一到五个关系,然后返回找到的不同资产列表。

如果你在SQL中也这么想。。。这可能吗?可能是的,但不是以如此简短和富有表现力的方式。现在,您应该开始了解图形模型的要点了。

NEO4J

我们之前讨论过Neo4J作为一个图形数据库,有充分的理由,它是市场上最广为人知的图形数据库,它已经存在了十多年,所以它非常坚固,经过了战斗测试。

但是,如果我必须在Neo4J中找到我不喜欢的东西,那就是Graph Only,所以传统的关系数据库没有“平稳过渡”,如果你已经编写了一些软件,你必须重写所有内容才能使用新的数据模型。除此之外,Neo4J是用Java编写的,即使我每天都使用Java进行应用程序开发,我也有偏见地认为用Java编写数据库可能有点内存不足。

不要误解我的意思,如果你需要使用纯图数据模型,Neo4J仍然是最好的选择,它有很多功能,如果你想要支持,开发它的公司会提供企业支持。

一种混合方法

我想在我的应用程序中介绍图数据库的强大功能,但正如一切一样,没有一刀切的方法,图数据库也不例外,它们有利于图遍历,但不是所有可能场景的最佳选择。

应用程序的需求有时可能涉及广泛,在谈论数据库时,最好是将数据模型的一部分作为图,另一部分作为一组表,也许另一部分在文档集合中。问题是,我不喜欢在同一个应用程序中使用许多不同的数据库引擎。

有解决办法吗?

PostgreSQL与Apache AGE

PostgreSQL在数据库领域是一个众所周知的名字,原因有很多。举几个例子,它是可用的最强大的开源数据库之一,同时它坚如磐石,性能卓越。有几十兆字节的PostgreSQL数据库的例子。

PostgreSQL的一个好处是,它允许使用扩展来增强数据库本身的功能,并且有许多强大的扩展允许PostgreSQL跨越许多不同的上下文。扩展示例如下:

  • TimescaleDB:处理时间序列和窗口的扩展
  • PostGIS:用于地理信息系统(GIS)的扩展,允许使用坐标和地理空间计算
  • ZomboDB:在与Elasticsearch集成的同时增强PostgreSQL全文搜索功能的扩展

Apache AGE(其中AGE代表“图形扩展”)是其中的另一个扩展,它是关系数据库、文档数据库和图形数据库世界之间的桥梁,利用PostgreSQL数据库的稳定性和稳定性,同时利用图形数据库的强大功能增强其功能。

AGE仍在Apache孵化器中,这意味着它仍处于早期开发阶段(当前版本i 0.7),但它是基于BitNine的AgentsGraph所做的工作,即使采用了不同的方法。AgentsGraph是一个基于PostgreSQL 10分支构建的商业图形数据库,而Apache AGE是作为标准PostgreSQL的扩展构建的(在撰写本文时,它支持版本11,但预计2022年会支持新版本),因此它可以用作标准功能的“升级”,而不会失去其余功能。

这种方法的好处在于,您可以将关系模型的特性与图数据库的特性混合在一起,这意味着您可以将表上的SQL查询与图上的OpenCyhpher查询混合在一起。

如果您认为PostgreSQL还支持JSON和JSONB数据类型,这样您就可以拥有文档数据库的部分功能,那么您就可以理解为什么这种混合解决方案是一个不错的选择。

让我们看看如何使用Docker开始使用ApacheAGE,然后在下一篇文章中,我们将看到OpenCyhper的一些功能以及与标准关系世界的集成。

使用Docker开始使用Apache AGE

开始使用Apache AGE的最快方法是在预构建的Docker容器中运行它,您可以使用以下命令来完成:

docker run -it -e POSTGRES_PASSWORD={MyPassword} -p {HostPort}:5432 sorrell/apache-age

这是Docker的“官方”镜像,但在撰写本文时,它已经有三个月的历史了,所以它没有最近添加的所有功能和错误修复。为了测试所有功能,让我们使用GitHub repo的最新来源构建一个新的映像。

使用Docker从源代码构建最新版本

您可以认为从源代码构建Docker映像可能是一个复杂的过程,但实际上这很容易,只需使用以下命令在您的机器上克隆存储库即可:

git clone https://github.com/apache/incubator-age.git
cd incubator-age

并告诉Docker构建镜像:

docker build -t apache/age .

几分钟后(取决于网络连接的速度和计算机的电源),该过程应该完成。

使用Docker启动AGE实例

要使用PostgreSQL 11和AGE扩展启动新建映像的实例,可以运行以下命令:

docker run -it -e POSTGRES_PASSWORD=mypassword -p 5432:5432 apache/age

一旦容器启动,您就可以连接到数据库并开始使用SQL和OpenCypher。

如果您更喜欢查询输出的图形表示,还可以试用AGE Viewer,这是一个node.js应用程序(处于早期开发阶段),允许您直接在浏览器内以图形或表格的方式查询和导航结果。

正在连接到数据库

使用ApacheAGE的另一个好处是,您正在使用标准的PostgreSQL数据库进行数据处理,因此要连接到它,您可以使用标准的psql命令行客户端

psql -h 0.0.0.0 -p 5432 -U postgres

 

or your preferred SQL client, like DBeaver.

如果在启动时未自动加载AGE扩展,则可以通过发出以下SQL命令来启用AGE扩展:

CREATE EXTENSION IF NOT EXISTS age;
LOAD 'age';
SET search_path = ag_catalog, "$user", public;

 

现在您已经准备好开始使用新的图形数据库了。

创建图形

开始玩grap模型需要做的第一件事是…创建一个图形。您可以使用create_graph('graph_NAME')函数执行此操作:

SELECT create_graph('my_graph_name');

创建图形后,您可以使用Cypher('graph_NAME',QUERY)函数执行Cypher命令,如下所示:

SELECT * from cypher('my_graph_name', $$
  CypherQuery
$$) as (a agtype);

 

例如,要创建节点(或图形语言中的“顶点”),可以运行:

SELECT * from cypher('my_graph_name', $$
  CREATE (a:User { firstName: 'Fabio', lastName: 'Marini'})
  RETURN a
$$) as (a agtype);

 

这将创建一个带有标签User以及firstName和lastName属性的顶点。图形数据库的另一个好方面是,“顶点”和“边”都可以包含可以动态添加和查询的属性。

我们刚刚触及了图形数据库的表面,您可以查看AGE的文档来了解OpenCypher查询语言的功能和语法

原文地址
https://www.fabiomarini.net/going-multi-model-with-postgresql-and-apache-age-experimenting-with-graph-databases/
本文地址

Tags

Article

微信

知识星球

微信公众号

视频号