rose 组件图_【图数据库系列】Dgraph简介篇

在上一篇文章中我们已经对当前流行的几款图数据库做过简单的分析,并介绍了我们为什么使用Dgraph。从本篇内容开始,我们将开启Dgraph之旅,探索这个图数据库方向的新贵。

注:本章内容基于Dgraph v1.1.0

一、Dgraph组件

Dgraph架构简单明了,我们结合自身在实践过程中所搭建的集群架构,来介绍各个组件。

4069b9ac80260a301b170bebba051692.png

  • ratel:提供用户界面来执行数据查询,数据修改及元数据管理。
  • alpha:用于管理数据(谓词和索引),外部用户主要都是和alpha进行数据交互。
  • group:多个alpha组成一个group(即图中同色alpha),group中的多个alpha通过raft协议保证数据一致性。
  • zero:用于管理集群,并在group之间按照指定频率去均衡数据。

二、Dgraph数据类型

Dgraph中所有属性都被称为predicate,即谓词;每个predicate都有确定的数据类型。

数据类型说明
defalut默认类型
int64位有符号整数
float64位双精度浮点数
bool布尔
geo地理位置,目前支持Point、Polygon、MultiPolygon
datetime时间类型,如2020-02-02
string字符串
password密码
uid边的类型,64位整形,以16进制形式表示,如0x1,系统默认分配

三、Dgraph索引及分词器

Dgraph基于每种数据类型,提供了不同的索引及其分词器。目前,建立索引及分词器的意义在于,建立以后可以使用相应的系统函数。

数据类型可用索引index索引
可用的tokenizer
defalutlistcountindexupsertdefalut
int同上int
float同上float
bool同上bool
geo同上geo
datetime同上yearmonthdayhour
stringlistcountlangindexupsertexacthashtermfulltexttrigram
password--
uidlistcountreverse-

注:

  1. count需要和list配合使用,即选用list后,才可选用count
  2. upsert需要和index配合使用,即选用index后,才可选用upsert
  3. 对于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的版本,第二种可以指定版本。下载完成后,将压缩包解压到指定目录即可,解压后的内容如下:

d1ebf70ede04dd528e6780e249c6597f.png

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,即可访问图形化界面:

08c268de632cb9c4ce075827a42b8770.png

至此,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界面查看结果如下

263723c65efa12dfe854098e8d85cf2c.png

可见,我们的schema已经建立成功。在ratel中,我们还可以直接通过界面来更快捷的操作schema

c84a7df60cc03e4e64d4e56a79f6d5cc.png

mutate

说明: 对图数据进行相应的新增、修改、删除等。

格式:

新增

{    set{	    _:任意标识符  "值" .     }}

修改

{    set{	      "新值" .     }}

删除

{    delete{	      * .     }}

示例:

新增两条数据,jack及rose,他们为朋友关系

{    set{      _:jack  "jack" .      _:jack  "20" .       _:jack  _:rose .      _:rose "rose" .      _:rose "22" .    }}

执行结果如下图

cb3e0c23a312772b0487877fb15e0aa7.png

我们查询该数据确认是否执行成功

24fbfc1825871e21fa2f7454e08f8ef0.png

如图中数据所示,我们有jack和rose两个点,他们之间有一条叫做test_friend的边。

我们从数据的角度再看一下

0d0a80ec0939bc1dbf0e8c9a30493416.png

所有数据一览无遗

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" .    }  }}

执行后界面如下

17224c17d69fd0af56f1c5367b36fbfa.png

我们通过查询来确认该条数据已被修改

104f1b94222a61d881077f20107ee512.png

query

说明: 查询图数据库信息,如数据,schema结构等。

格式:

{  自定义方法名(func:方法){    结果中需要展示的谓词  }}

我们还可使用一些系统函数来进行查询,如

schema{}

示例:

通过schema{}查看已经定义的schema

schema(pred:[test_name,test_age]){}

执行后界面如下

23b20aaddd39b2096c286b468d4372a2.png

到这里,可能有些人会问,除了讲述mutate那里,我们看到两个点及其之间的关系,那么Dgraph作为图数据库,是否支持多度关系呢?

答案当然是肯定的,下面我们展示一个简单的二度查询。

示例:

给rose添加一个叫做carl的朋友

{    set{      <0x293310>  _:carl .      _:carl "carl" .      _:carl "41" .    }}

执行后界面如下

76296f6b2da282032a0cb89fadbca54d.png

我们在通过查询语句查看,结果会是怎样呢

34ed5fa9fe8b6eaf536483a580f4cb87.png

我们看到,jack有一个朋友rose,rose有一个朋友carl。这就是图数据里的二度关系。

接下来我们用一个实际业务场景来结束本节的讲述

示例:

查找名称包含“秀园”,绿化率大于30%的小区附近1km的幼儿园 执行后界面如下

a3b5f7f4c9b1a82bf45a45ce3e08c8c5.png

五、结语

Dgraph有着丰富灵活的使用方法,在本章中,我们只是从Dgraph的基本概念到操作进行了简述。更多新鲜好玩的内容大家可以去Dgraph官网自行探索。

通过本章的介绍,快去开启自己的图数据库之旅吧。

如果你对我们做的事情感兴趣,欢迎加入,共同进步,请把简历砸至search-mp@ke.com。

作者介绍

魏煜,贝壳找房工程师,现负责搜索中台图数据平台相关研发。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值