图数据库:AgensGraph

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 非常流行的图数据库

AgensGraph简介

AgensGraph 是一个基于 PostgreSQL 的新一代多模型图数据库。它提供图形分析环境,用户可以同时编写、编辑和执行 SQL 和 Cypher 查询。AgensGraph 带有 PostgreSQL 兼容性和 PostgreSQL扩展,能够帮助PostgreSQL用户摆脱数据迁移的痛苦,轻松开发提供高级数据分析的服务。

官网及下载

AgensGraph的官方网站:http://bitnine.net/agensgraph/

Linux版本下载:http://bitnine.net/downloads/agensgraph-v-1-3-linux/

安装AgensGraph

上传并解压

[root@master opt]# tar -xvf AgensGraph_v1.3.1_linux.tar.gz -C /usr/local/

添加agens用户

因为此数据库并不能在root下运行,所以要先建好用户。这里官方并没有指明特定用户,我是自己创建的用户。选择的事agens

groupadd -g 530 agens
useradd -g 530 -u 530 -m -d /home/agens -s /bin/bash agens

创建/agdata目录,并赋权.数据目录
将应用目录和数据目录都得设为agens用户权限

配置.bashrc

将安装目录的相关信息填进去

export LD_LIBRARY_PATH=/usr/local/AgensGraph/lib:$LD_LIBRARY_PATH
export PATH=/usr/local/AgensGraph/bin:$PATH
export AGDATA=/agdata

初始化并启动

初始化数据库

使用initdb初始化此数据库

[agens@sdw3 ~]$ initdb -D /agdata/
The files belonging to this database system will be owned by user "agens".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /agdata ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.

Success. You can now start the database server using:

    ag_ctl -D /agdata/ -l logfile start

启动数据库

[agens@sdw3 ~]$ ag_ctl -D /agdata/ -l logfile start
server starting
[agens@sdw3 ~]$ AgensGraph

执行交互式终端

创建一个数据库:

createdb [ dbname ]

如果未指定dbname,则会默认创建与当前用户名称相同的数据库。这里我使用的是test02

[agens@sdw3 ~]$ agens test02
agens (AgensGraph 1.3.1, based on PostgreSQL 9.6.2)
Type "help" for help.

test02=# 

图数据库基础概念

配置服务器参数

为了获得最佳性能,根据数据和机器资源的大小正确设置服务器参数非常重要。在许多服务器参数中,以下参数对AgensGraph图形查询性能至关重要。(您可以编辑$AGDATA/postgresql.conf文件来设置这些参数(需要重新启动))。

shared_buffers:用于缓存数据对象的内存大小。生产环境应该增加此参数。当它与数据大小一样大时,它是最优的。但是,应该仔细设置此参数,以考虑为每个查询分配的并发会话和内存大小。建议的设置是物理内存大小的一半。
work_mem:根据物理内存的大小以及将仔细执行的查询属性,这个值也会增加。
random_page_cost:此参数用于查询优化。对于图形查询,建议将此值减小到1或0.005(如果图形数据完全缓存在内存中)

AgensGraph数据模型

AgensGraph是一个多模型数据库。AgensGraph同时支持属性图模型和关系模型。

属性图模型
标记属性图模型

属性图模型包含连接的实体,其可以具有任意数量的属性。在AgensGraph中,实体被称为顶点。顶点可以具有任意数量的属性,并可以用标签进行分类。标签用于对顶点进行分组以表示某些类别的顶点; 即代表一个人的角色。

边缘是两个顶点之间的直接连接。边也可以具有属性和归类标签,如顶点。在AgensGraph中,边缘总是具有起始顶点和结束顶点。如果一个查询试图删除一个顶点,它必须先删除它的所有边。AgensGraph中不存在断边。

边和顶点的属性用JSON格式表示。JSON是用于半结构化数据序列化的文本格式。JSON由六种数据类型组成:字符串,数字,布尔值,空值,对象和数组。AgensGraph对象充分利用JSON格式,将信息存储为零个或多个名称/值对的无序集合。名称是一个字符串,值可以是任何上述类型,包括嵌套的JSON类型。AgensGraph特别使用JSONB格式。由于JSONB是一种分解的二进制格式,它的处理速度比普通的JSON快得多,但代价是稍微慢一点的输入时间。

AgensGraph中的数据对象

在AgensGraph中,可以创建几个数据库,每个数据库可以包含一个或多个模式和图形。模式适用于关系表,而图形对象适用于图形数据。架构名称和图形名称不能相同。顶点和边被分组为标签。有两种标签:顶点标签和边缘标签。用户可以在数据库中创建多个图形,但一次只能使用一个图形。

label
label用于对顶点和边进行分组。用户可以为给定label下的所有顶点创建属性索引。可以使用label为不同类型的用户提供访问控制,并且可以创建label层次结构以将继承添加到label。有顶点的默认label:ag_vertex。如果创建顶点而没有指定其label,那么顶点将存储在默认label中。边缘总是有一个label。

我们将顶点标签和边缘标签分别称为VLABEL和ELABEL。

VLABEL:顶点label。分类顶点来表示他们的角色。

顶点:可以保存属性的实体。

ELABEL:边缘label。分类边缘来表示他们的角色。

边缘:连接实体的关系。

每个label都会继承一个或多个label。上图显示了边缘label的示例层次结构。label层次类似于面向对象编程中的类层次结构。每个父label都包含子label数据。例如,考虑到上述层次结构,如果查询与边缘“朋友”匹配,则结果包含“室友”label的数据。

数据定义语言

通过几个示例介绍图形对象的DDL。
快速描述
要创建图形,请使用CREATE GRAPH命令。

CREATE

CREATE GRAPH graphname;        

可以在数据库中创建多个图。为了指定要使用哪个图形,会使用会话参数graph_path。

要显示当前图形路径,请使用以下命令。

SHOW graph_path;        

当使用图创建时CREATE GRAPH,如果graph_path未设置,graph_path将被设置为创建的图。您可以使用以下命令创建多个图并将graph_path更改为另一个图:

SET graph_path = graphname;        

该graph_path是一个会话变量,所以每个客户端必须设置graph_path查询图形之前。只能为graph_path指定一个图形名称。查询多个图是不允许的。

如果使用or 语句为每个用户或数据库设置graph_path,则只要连接数据库就不需要运行语句。
ALTER ROLEDATABASESET graph_path

ALTER ROLE user1 IN DATABASE gdb SET graph_path TO graphname;     
ALTER DATABASE gdb SET graph_path TO graphname;                         

DROP

DROP GRAPH graphname CASCADE;        

图形具有顶点和边的初始标签。这些标签不能被删除。要删除图表,用户必须使用该CASCADE选项执行此操作。如果当前graph_path是已删除的图形,则graph_path将重置为null。

图形
CREATE GRAPH

CREATE GRAPH [ IF NOT EXISTS ] graph_name [AUTHORIZATION role_name];

如果不存在
如果相同的名字已经存在,什么也不做
授权role_name
将拥有新图形的用户的角色名称
ALTER GRAPH

ALTER GRAPH graph_name RENAME TO new_name;
ALTER GRAPH graph_name OWNER TO { new_owner | CURRENT_USER | SESSION_USER };

graph_name

  现有图形的名称。

重命名为new_name

  该表单将图形的名称更改为new_name。

拥有者为new_owner

 这个表格改变了图表的所有者。

创建label

VLABEL和ELABEL的概要是相同的。

CREATE [ UNLOGGED ] VLABEL [ IF NOT EXISTS ] label_name [DISABLE INDEX]
       [ INHERITS ( parent_label_name [, ...] ) ]
       [ WITH (storage_parameter)]
       [ TABLESPACE tablespace_name ];
  1. UNLOGGED
    写入未记录标签的数据不会记录到预写日志中,这会使未记录的标签比记录的标签快得多。但是,未记录的标签不是安全的。
  2. IF NOT EXISTS
    如果相同的名字已经存在,什么也不做。
  3. LABEL_NAME
    要创建的顶点/边缘标签的名称。
  4. DISABLE INDEX
    创建带有无效索引的标签。无效索引不能用于搜索或插入,直到重新编制索引。
  5. INHERITS(parent_label [,...])
    可选的INHERITS子句指定顶点/边缘标签的列表。如果它是空的,则新标签继承初始标签。使用INHERITS会在新的子标签和其父标签之间创建一个持久边缘。子标签的数据默认包含在父级扫描中。
  6. TABLESPACE tablespace_name
    新标签将在名称为tablespace_name的表空间中创建。

AgensGraph查询

介绍

为了检索和操作图形数据,AgensGraph支持Cypher查询语言。Cypher是一种类似于SQL的声明性语言。Cypher很容易学习,因为它的语法直观地描述了图形中的模式。
下文简要说明如何使用示例图编写Cypher查询。

创建一个示例图

AgensGraph可以将多个图存储在单个数据库中。但是,Cypher无法辨别多个图表。因此,AgensGraph支持额外的数据定义语言和变量来使用Cypher创建和管理图表。

以下语句创建一个称为网络的图形并将其设置为当前图形。

CREATE GRAPH network;
SET graph_path = network;

在这个例子中,graph_path变量显式设置为网络。但是,如果在创建图形之前没有设置graph_path,则会在创建图形后自动设置它。

创建标签

在创建图形数据之前,生成一个标签是基本的。虽然这是默认值,但当在密码的CREATE语句中指定标签时,会自动生成标签(可同时创建VLABEL / ELABEL)。

所有图形元素都有一个标签。对于顶点,如果没有指定标签,则将ag_vertex作为默认标签。对于边缘,标签不能省略。ag_edge标签也存在,但用于其他目的。

AgensGraph支持DDL创建这样的标签。

以下语句创建一个顶点标签人员和一个边缘标签知道。

CREATE VLABEL person;
CREATE ELABEL knows;
CREATE (n:movie {title:'Matrix'});

Creating the Vertices and Edges

现在,我们可以创建一个顶点的人对和边缘知道使用Cypher支架的CREATE条款。该CREATE子句创建一个由顶点和边组成的模式。顶点的形式为:(variable:label {property: value, ...}),边有:-[variable:label {property: value, ...}]-。<最左侧或>最右侧的附加信息用于表示边缘的方向。variable如果创建的顶点和边不被引用,则可以省略。
注意:AgensGraph不支持--模式中边缘的语法,因为--意味着对行尾进行注释。

以下陈述创造了三种简单的模式:“汤姆知道夏天”,“帕特知道尼基”和“橄榄知道托德”。

CREATE (:person {name: 'Tom'})-[:knows {fromdate:'2011-11-24'}]->(:person {name: 'Summer'});
CREATE (:person {name: 'Pat'})-[:knows {fromdate:'2013-12-25'}]->(:person {name: 'Nikki'});
CREATE (:person {name: 'Olive'})-[:knows {fromdate:'2015-01-26'}]->(:person {name: 'Todd'});
MATCH (p:Person {name: 'Tom'}),(k:Person{name: 'Pat'}) 
CREATE (p)-[:KNOWS {fromdate:'2017-02-27'} ]->(k);

为了存储顶点和边的属性,AgensGraph使用PostgreSQL的jsonb类型。属性可以嵌套JSON对象作为它们的值。由于AgensGraph使用PostgreSQL的类型系统,因此PostgreSQL支持的任何数据类型都可以存储到顶点和边的属性中。

查询图表 Querying the Graph

让我们检索我们上面创建的模式。Cypher有MATCH条款在图表中查找模式。

以下陈述发现了这样的模式:“一个叫汤姆的人认识一个人”。

MATCH (n:person {name: 'Tom'})-[:knows]->(m:person) RETURN n.name AS n, m.name AS m;
   n   |    m
-------+----------
 "Tom" | "Summer"
 "Tom" | "Pat"
(2 rows)

由于属性是jsonb类型的,我们需要方法来访问它们的属性值。PostgreSQL支持通过运营商,如那些方法->,->>,#>,和#>>。如果用户想要访问顶点m的属性名称,可以写入。AgensGraph提供了另一种访问这些元素的方法。AgensGraph 在顶点和边上使用点运算符和括号运算符来访问JSON对象中的属性值和JSON数组中的元素,如上所示。(m)->>name.[]

该RETURN子句作为查询的结果返回变量及其属性。结果是在其行中具有多个匹配模式的表格。

可变长度边缘 Variable Length Edges

让我们考虑一个发现“汤姆”知道知道的查询。我们可以使用UNION子句:

MATCH (p:person {name: 'Tom'})-[:knows]->(f:person)
RETURN f.name
UNION ALL
MATCH (p:person {name: 'Tom'})-[:knows]->()-[:knows]->(f:person)
RETURN f.name;

它也可以写成:

MATCH (p:person {name: 'Tom'})-[r:knows*1..2]->(f:person)
RETURN f.name, r[1].fromdate;

查找位于可变长度的边缘顶点路径之后的顶点的查询在图形数据库中是典型的。*1..2用于边缘表示这样的可变长度的边缘。1边缘的最小长度在哪里,并且2是最大长度。如果您未指定值,则默认范围值为1且无穷大。

以上就是我闲暇时间所看所学的一些关于AgensGraph的简单知识

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
监控 druid Java
Spring Boot 3 集成 Druid 连接池详解
在现代的Java应用中,使用一个高效可靠的数据源是至关重要的。Druid连接池作为一款强大的数据库连接池,提供了丰富的监控和管理功能,成为很多Java项目的首选。本文将详细介绍如何在Spring Boot 3项目中配置数据源,集成Druid连接池,以实现更高效的数据库连接管理。
6736 2
Spring Boot 3 集成 Druid 连接池详解
|
存储 缓存 NoSQL
Redis的5.0/6.0/7.0版本重点介绍以及使用!
1. Stream数据类型:Redis 5.0引入了Stream数据类型,它是一种日志结构,用于高性能、持久化和实时处理的数据流。Stream可以按照时间顺序存储和检索消息,并支持消费者组和消费者偏移量管理等功能。 2. 基于模块的全文搜索:Redis 5.0通过引入Redis Search模块,提供了全文搜索的功能。它支持对文本字段进行索引和搜索,包括分词、词项权重、布尔查询等功能。 3. 客户端缓存:Redis 5.0引入了客户端缓存(Client-side caching)功能。客户端可以缓存服务器返回的数据,减少对服务器的请求,提高性能和响应速度。
3244 1
|
Rust JavaScript Unix
Nodejs 常见版本管理工具(nvm、n、fnm、nvs、nodenv)
Nodejs 常见版本管理工具(nvm、n、fnm、nvs、nodenv)
9851 0
|
Java Apache
如何用 Java 实现 word、excel 等文档在线预览?
java实现办公文件在线预览功能是一个大家在工作中也许会遇到的需求,网上些公司专门提供这样的服务,不过需要收费 如果想要免费的,可以用openoffice,实现原理就是:
|
缓存 JavaScript Cloud Native
阿里云发布 Spring Boot 新脚手架,真香
本文,围绕 spring initializr 框架,以 start.spring.io 为例,全面的给大家介绍如何使用和扩展这个框架,以及背后的运行原理。
54041 1
阿里云发布 Spring Boot 新脚手架,真香
|
Web App开发 关系型数据库 数据库
用PostgreSQL 做实时高效 搜索引擎 - 全文检索、模糊查询、正则查询、相似查询、ADHOC查询
用PostgreSQL 做实时高效 搜索引擎 - 全文检索、模糊查询、正则查询、相似查询、ADHOC查询作者digoal 日期2017-12-05 标签PostgreSQL , 搜索引擎 , GIN , ranking , high light , 全文检索 , 模糊查询 , 正则查询 , 相似查询 , ADHOC查询 背景字符串搜索是非常常见的业务需求,它包括: 1、前缀+模糊查询。
11999 1
|
7月前
|
数据采集 小程序 API
通义千问Qwen2.5-Coder 全系列来咯!强大、多样、实用
千问团队开源了强大的 Qwen2.5-Coder 系列模型,涵盖 0.5B 到 32B 六种尺寸,旨在推动开放代码模型的发展。该系列模型在代码生成、修复和推理等方面表现出色,支持多种编程语言,并在多个基准测试中达到 SOTA 水平。此外,Qwen2.5-Coder 还提供了丰富的应用场景,如代码助手、Artifacts 和 Interpreter,满足不同开发者的需求。
2737 106
|
存储 算法 Cloud Native
Ganos地理网格引擎支撑无人机路径规划能力实践
随着新能源技术的迅猛发展,低空经济已经逐步成为新的战略性新兴产业,但不同于传统的地表活动,低空活动具有立体性、区域性、融合性等特点,这些特点对于如何安全引导低空活动的顺利开展带来了一系列需要解决的技术问题。Ganos地理网格引擎提供了基于网格的路径规划能力,可以使用DEM、DSM、倾斜摄影等数据构建复杂环境下的无人机路径规划应用。
|
10月前
|
存储 NoSQL 数据处理
《MongoDB玩转复杂数据结构:嵌套文档、数组、对象,一篇让你彻底解锁!》
【8月更文挑战第24天】MongoDB是一款支持复杂数据结构处理的面向文档的NoSQL数据库。它允许使用嵌套文档、数组及对象等灵活的数据模型。例如,一个“公司”文档可以包含多个部门文档,每个部门下又有员工列表;或者创建包含多个产品的数组,以及包含街道、城市等信息的对象。MongoDB还提供强大的查询和更新功能,能够轻松地定位并修改这些复杂结构中的数据,从而极大地提高数据处理和分析的效率。
304 1
|
10月前
|
存储 SQL 测试技术
Entity Framework Core 中的存储过程超厉害!从定义到调用全攻略,提升性能与安全性!
【8月更文挑战第31天】在现代软件开发中,数据库操作效率至关重要。Entity Framework Core(EF Core)作为强大的对象关系映射(ORM)框架,支持存储过程,可提升数据库操作的性能、安全性和可维护性。本文详细介绍如何在 EF Core 中定义、配置及调用存储过程,并提供最佳实践建议,包括性能优化、安全性增强、代码可维护性提升以及参数化查询等。通过遵循这些指导原则,开发者能够充分利用存储过程的优势,显著提高应用程序质量和性能。附带完整示例代码,展示从定义实体类到调用存储过程的全过程。
582 0