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 ];
- UNLOGGED
写入未记录标签的数据不会记录到预写日志中,这会使未记录的标签比记录的标签快得多。但是,未记录的标签不是安全的。 - IF NOT EXISTS
如果相同的名字已经存在,什么也不做。 - LABEL_NAME
要创建的顶点/边缘标签的名称。 - DISABLE INDEX
创建带有无效索引的标签。无效索引不能用于搜索或插入,直到重新编制索引。 - INHERITS(parent_label [,…])
可选的INHERITS子句指定顶点/边缘标签的列表。如果它是空的,则新标签继承初始标签。使用INHERITS会在新的子标签和其父标签之间创建一个持久边缘。子标签的数据默认包含在父级扫描中。 - 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且无穷大。
您也可以使用更新的条款,例如CREATE,SET,REMOVE和DELETE之后MATCH的条款。在下一节中,我们将看到如何修改和删除图中的数据。