基于postgres的图数据库agensgraph(下)

上篇当中讲了agensgraph的安装,配置和启动,下篇继续讲解agensgraph的使用。在上篇文章的最后,我们知道了启动数据库的命令如下:

$ ag_ctl -D /usr/local/pgsql/data -l logfile start

可以使用上面给出的命令启动agensgraph试试看:

以上是服务启动的过程。服务启动后,我们可以试着创建一个数据库。创建数据库的命令是createdb

$ which createdb
/usr/local/pgsql/bin/createdb

使用createdb命令创建数据库:

$ createdb foo

上面的命令会创建名为foo的数据库。此时可以连接到数据库服务,这里不是使用postgres自带的psql命令,而是使用agens命令登录到数据库:

$ agens foo

登录状态如下:

如上所示,我们登录了数据库服务端,并且连接到了foo这个数据库。因为agensgraphpostgres数据库做了扩展,因此在数据库里不光可以创建关系型的表table,还可以创建「图」表graph。此时可以试试看创建一个graph

CREATE GRAPH network;
SET graph_path = network;

如上所示,我们创建了一个「图」graph,创建完graph以后,此时可以往里面添加图数据。图数据由两部分组成,分别是「点」(VLABEL)和「边」(ELABEL)。下面的命令分别创建叫做person的「点」,以及连接person的「边」(叫做knows):

CREATE VLABEL person;
CREATE ELABEL knows;

添加完了ELABELVLABEL以后,接下来可以添加图数据:

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);

从上面创建数据的过程可以看到每条数据的组成方式:

上面的数据的vertext描述的就是人,edge描述的是人与人的认识关系,并且在关系(边)中,保存了认识的起始时间(fromdate)。上面数据创建的完整过程如下:

有了数据,接下来可以试试看做数据查询:

MATCH (n:person {name: 'Tom'})-[:knows]->(m:person) RETURN n.name AS n, m.name AS m;

上面的查询就是查找Tom所认识的人,查询结果如下:

可以看到我们找到两条edges数据,代表着Tom认识的人。以上是对图数据的一个基本操作的讲解,接下来看一下图数据和关系型数据的混合查询。

因为agensgraph是直接在postgres内核实现的,所以它可以对自己的图数据与postgres里面已有的关系型数据进行混合查询,下面讲讲混合查询的使用方法。

关系型数据与图数据的混合查询

接下来看看关系型数据与图数据的混合查询方法。首先创建一个graph:

CREATE GRAPH bitnine;

然后添加vertex数据:

CREATE VLABEL dev;
CREATE (:dev {name: 'someone', year: 2015});
CREATE (:dev {name: 'somebody', year: 2016});

上面添加了两条dev的点数据,里面是json结构的数据,包含nameyear两条属性。完整的执行过程如下:

可以看到上面创建了叫做bitnine的graph。完成了graph的创建以后,接下来我们创建一张关系表history

CREATE TABLE history (year, event)
AS VALUES (1996, 'PostgreSQL'), (2016, 'AgensGraph');

上面创建了一张history的关系表,里面包含yearevent两个字段。注意graph和table里面有一个共同的属性,就是year。所以我们可以通过year作为两边数据的关系,做一个混合查询:

SELECT n->>'name' as name, history.event, history.year FROM history, (MATCH (n:dev) RETURN n) as dev where history.year > (n->>'year')::int; 

上面的查询可以看到,我们使用year作为查询条件,将history.year大于bitnine这张表里的year的数据组合查询出来。我们分析一下就可以知道,满足这个查询条件的就是这样的数据组合:

我们看看查询结果是不是和分析的一样:

可以看到查询结果和分析的一样。

参考文档

本系列文章简单介绍了agensgraph图数据库的初步使用,希望能够帮助大家入门。要深入学习,建议读一下agensgraph的文档:

里面包含Quick-guideDeveloperOperations手册:

可以把上面三篇pdf仔细看下。