在上一篇文章中我们已经对当前流行的几款图数据库做过简单的分析,并介绍了我们为什么使用Dgraph。从本篇内容开始,我们将开启Dgraph之旅,探索这个图数据库方向的新贵。
注:本章内容基于Dgraph v1.1.0
一、Dgraph组件
Dgraph架构简单明了,我们结合自身在实践过程中所搭建的集群架构,来介绍各个组件。
- ratel:提供用户界面来执行数据查询,数据修改及元数据管理。
- alpha:用于管理数据(谓词和索引),外部用户主要都是和alpha进行数据交互。
- group:多个alpha组成一个group(即图中同色alpha),group中的多个alpha通过raft协议保证数据一致性。
- zero:用于管理集群,并在group之间按照指定频率去均衡数据。
二、Dgraph数据类型
Dgraph中所有属性都被称为predicate,即谓词;每个predicate都有确定的数据类型。
数据类型 | 说明 |
---|---|
defalut | 默认类型 |
int | 64位有符号整数 |
float | 64位双精度浮点数 |
bool | 布尔 |
geo | 地理位置,目前支持Point、Polygon、MultiPolygon |
datetime | 时间类型,如2020-02-02 |
string | 字符串 |
password | 密码 |
uid | 边的类型,64位整形,以16进制形式表示,如0x1,系统默认分配 |
三、Dgraph索引及分词器
Dgraph基于每种数据类型,提供了不同的索引及其分词器。目前,建立索引及分词器的意义在于,建立以后可以使用相应的系统函数。
数据类型 | 可用索引 | index索引 可用的tokenizer |
---|---|---|
defalut | listcountindexupsert | defalut |
int | 同上 | int |
float | 同上 | float |
bool | 同上 | bool |
geo | 同上 | geo |
datetime | 同上 | yearmonthdayhour |
string | listcountlangindexupsert | exacthashtermfulltexttrigram |
password | - | - |
uid | listcountreverse | - |
注:
- count需要和list配合使用,即选用list后,才可选用count
- upsert需要和index配合使用,即选用index后,才可选用upsert
- 对于string类型使用tokenizer时,exact、hash、term只能任选其一
四、Dgraph实践
本节,我们将从零开始,教大家如何搭建最简单的Dgraph服务,并一步步地进行Dgraph的操作。
服务搭建
Dgraph支持物理机安装及docker安装,并且服务搭建非常简单,最小规模只需1个zero节点,1个alpha节点,1个ratel即可启动一个服务。下面我们以物理机安装为例,介绍服务如何搭建。
1、服务下载
通过
curl https://get.dgraph.io -sSf | bash
或者
wget https://github.com/dgraph-io/dgraph/releases/download/v1.2.0/dgraph-linux-amd64.tar.gz
即可完成安装包下载,两种方式的区别仅在于第一种只可以下载官方最新release的版本,第二种可以指定版本。下载完成后,将压缩包解压到指定目录即可,解压后的内容如下:
2、启动zero
./dgraph zero
更多关于zero的参数,可通过./dgraph zero --help查看使用方法。
3、启动alpha
./dgraph alpha --lru_mb 2048 --zero localhost:5080
此处的5080端口是zero节点启动的默认grpc端口。关于alpha的更多参数,可通过./dgraph alpha --help查看。
4、启动ratel
./dgraph-ratel
通过ratel默认端口8000,即可访问图形化界面:
至此,Dgraph服务就启动起来了。
Dgraph操作
当前,Dgraph提供ratel、http、client三种方式对图数据库进行相应操作。接下来我们将通过ratel的方式来介绍Dgraph的常规操作。
alter
说明: 操作图数据库元数据,如schema、type的新增、修改、删除等。
格式:
: 类型 索引类型 .
示例:
创建名为test_name、test_age的属性及test_friend的边
: int @index(int) .: string @index(term) .: [uid] .
执行后通过schema界面查看结果如下
可见,我们的schema已经建立成功。在ratel中,我们还可以直接通过界面来更快捷的操作schema
mutate
说明: 对图数据进行相应的新增、修改、删除等。
格式:
新增
{ set{ _:任意标识符 "值" . }}
修改
{ set{ "新值" . }}
删除
{ delete{ * . }}
示例:
新增两条数据,jack及rose,他们为朋友关系
{ set{ _:jack "jack" . _:jack "20" . _:jack _:rose . _:rose "rose" . _:rose "22" . }}
执行结果如下图
我们查询该数据确认是否执行成功
如图中数据所示,我们有jack和rose两个点,他们之间有一条叫做test_friend的边。
我们从数据的角度再看一下
所有数据一览无遗
upsert
说明: 对符合条件的数据进行新增或修改,类似query+mutate的组合。
格式:
upsert{ query{ 自定义方法名(func:方法){ v as uid //将uid赋值给变量v } } mutation{ set{ uid(v) "值" . } }}
示例:
通过upsert将jack的test_age改为31
upsert{ query{ find(func:eq(test_name, "jack")){ v as uid } } mutation{ set{ uid(v) "31" . } }}
执行后界面如下
我们通过查询来确认该条数据已被修改
query
说明: 查询图数据库信息,如数据,schema结构等。
格式:
{ 自定义方法名(func:方法){ 结果中需要展示的谓词 }}
我们还可使用一些系统函数来进行查询,如
schema{}
示例:
通过schema{}查看已经定义的schema
schema(pred:[test_name,test_age]){}
执行后界面如下
到这里,可能有些人会问,除了讲述mutate那里,我们看到两个点及其之间的关系,那么Dgraph作为图数据库,是否支持多度关系呢?
答案当然是肯定的,下面我们展示一个简单的二度查询。
示例:
给rose添加一个叫做carl的朋友
{ set{ <0x293310> _:carl . _:carl "carl" . _:carl "41" . }}
执行后界面如下
我们在通过查询语句查看,结果会是怎样呢
我们看到,jack有一个朋友rose,rose有一个朋友carl。这就是图数据里的二度关系。
接下来我们用一个实际业务场景来结束本节的讲述
示例:
查找名称包含“秀园”,绿化率大于30%的小区附近1km的幼儿园 执行后界面如下
五、结语
Dgraph有着丰富灵活的使用方法,在本章中,我们只是从Dgraph的基本概念到操作进行了简述。更多新鲜好玩的内容大家可以去Dgraph官网自行探索。
通过本章的介绍,快去开启自己的图数据库之旅吧。
如果你对我们做的事情感兴趣,欢迎加入,共同进步,请把简历砸至search-mp@ke.com。
作者介绍
魏煜,贝壳找房工程师,现负责搜索中台图数据平台相关研发。