基于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
这个数据库。因为agensgraph
对postgres
数据库做了扩展,因此在数据库里不光可以创建关系型的表table
,还可以创建「图」表graph
。此时可以试试看创建一个graph
:
CREATE GRAPH network;
SET graph_path = network;
如上所示,我们创建了一个「图」graph
,创建完graph
以后,此时可以往里面添加图数据。图数据由两部分组成,分别是「点」(VLABEL
)和「边」(ELABEL
)。下面的命令分别创建叫做person
的「点」,以及连接person
的「边」(叫做knows
):
CREATE VLABEL person;
CREATE ELABEL knows;
添加完了ELABEL
和VLABEL
以后,接下来可以添加图数据:
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结构的数据,包含name
和year
两条属性。完整的执行过程如下:
可以看到上面创建了叫做bitnine
的graph。完成了graph的创建以后,接下来我们创建一张关系表history
:
CREATE TABLE history (year, event)
AS VALUES (1996, 'PostgreSQL'), (2016, 'AgensGraph');
上面创建了一张history
的关系表,里面包含year
和event
两个字段。注意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
的数据组合查询出来。我们分析一下就可以知道,满足这个查询条件的就是这样的数据组合:
(:dev {name: 'someone', year: 2015});
<->(2016, 'AgensGraph')
我们看看查询结果是不是和分析的一样:
可以看到查询结果和分析的一样。
参考文档
本系列文章简单介绍了agensgraph
图数据库的初步使用,希望能够帮助大家入门。要深入学习,建议读一下agensgraph
的文档:
里面包含Quick-guide
,Developer
,Operations
手册:
可以把上面三篇pdf仔细看下。