图数据库:AgensGraph

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: 非常流行的图数据库

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
相关文章
|
3月前
|
存储 NoSQL 数据库
知识图谱之图数据库如何选型:知识图谱存储与图数据库总结、主流图数据库对比(JanusGraph、HugeGraph、Neo4j、Dgraph、NebulaGraph、Tugrapg)
知识图谱之图数据库如何选型:知识图谱存储与图数据库总结、主流图数据库对比(JanusGraph、HugeGraph、Neo4j、Dgraph、NebulaGraph、Tugrapg)
知识图谱之图数据库如何选型:知识图谱存储与图数据库总结、主流图数据库对比(JanusGraph、HugeGraph、Neo4j、Dgraph、NebulaGraph、Tugrapg)
|
4月前
|
存储 NoSQL 关系型数据库
浅谈图数据库
浅谈图数据库
67 0
|
存储 NoSQL Java
|
存储 分布式计算 NoSQL
聊聊图数据库和图数据库的小知识 Vol.02
在第二期的图数据库小知识中,我们回顾了图数据库的兴起契机,聊了聊【传统数据库通过设计良好的数据结构是不是可以实现图数据库的功能】、【图数据库会出于什么考虑做存储计算分离】等图数据库设计问题…
1250 0
|
存储 NoSQL 数据可视化
聊聊图数据库和图数据库的小知识
图数据库计算存储分离设计及该设计模式的考量原因、图数据库 0 标签的意义等图数据库相关问题
2453 0
|
存储 大数据 Apache
越来越火的图数据库究竟是什么?
如果把传统关系型数据库比作火车,那图数据库就是如今大数据时代的高铁。那究竟什么是图数据库呢?来不及解释了,先上车!~
3439 0
|
新零售 分布式数据库 数据库
图数据库HGraphDB介绍
一、HGraphDB概述图无处不在,社交和电商领域每天都会产生大量的实体连接数据,而描述图的方式往往是使用包括顶点和边以及丰富的属性的属性图来展现。在如今的2018年,社交网络和电商数据往往能够形成非常大的实体图,包括数十亿顶点和百亿条边这样的数据量。
6514 0
|
机器学习/深度学习 存储 NoSQL
图数据库浅谈
图数据库分为两大类:native graph和non-native graph native graph: 数据只能存放在一台机器上。不支持分片。如果你的数据量非常大,Neo4j是扛不住的。
1823 0
|
NoSQL 数据库 数据中心