dgraph 简介

dgraph 是基于 golang 开发的开源的分布式图数据库. 诞生时间不长, 发展却很迅速. 目前是 v20.x 版本, dgraph 集群主要包含 3 种节点:

  1. Zero: 是集群的核心, 负责调度集群服务器和平衡服务器组之间的数据
  2. Alpha: 保存数据的 谓词索引. 谓词包括数据的 属性 和数据之间的 关系; 索引是为了更快的进行数据的过滤和查找
  3. Ratel: dgraph 的 UI 接口, 可以在此界面上进行数据的 CURD, 也可以修改数据的 schema

通过增加 Alpha 的数量完成 dgraph 的水平扩展.

dgraph 是 golang 开发的, 所以部署非常简单, 更简单的方式是使用 docker

docker pull dgraph/dgraph:latest

然后配置一个 docker-comopse.yml, 一键启动 dgraph 服务:

version: "3.2"
services:
zero:
image: dgraph/dgraph:latest
volumes:
- type: volume
source: dgraph
target: /dgraph
volume:
nocopy: true
ports:
- 5080:5080
- 6080:6080
restart: on-failure
command: dgraph zero --my=zero:5080
alpha:
image: dgraph/dgraph:latest
volumes:
- type: volume
source: dgraph
target: /dgraph
volume:
nocopy: true
ports:
- 7080:7080
- 8080:8080
- 9080:9080
restart: on-failure
command: dgraph alpha --my=alpha:7080 --lru_mb=2048 --zero=zero:5080
ratel:
image: dgraph/dgraph:latest
volumes:
- type: volume
source: dgraph
target: /dgraph
volume:
nocopy: true
ports:
- 8000:8000
command: dgraph-ratel volumes:
dgraph:

启动 dgraph, 在上面 docker-compose.yml 相同的文件夹下执行:

docker-compose up -d

如果没有错误, 可以通过: http://<YOUR IP/Domain>:8000/ 来访问 draph 的 UI 界面.

dgraph 使用示例(基于 golang)

通过 dgraph 的 UI 界面, 可以完成所有的操作, 但要想将 dgraph 和应用结合, 还得使用 dgraph 的 SDK.

dgraph 的 SDK 支持各种语言, 官方支持的主要有: Go, C#, Java, Javascript, Python.

dgraph 本身就是基于 golang 开发的, 所以对 Go 的支持肯定最全面, 下面就使用 golang 的 client 来演示 dgraph 的操作.

golang client 安装

安装最新版的 client:

go get github.com/dgraph-io/dgo/v200

创建 schema

代码:

 1  func NewDgraphClient() *dgo.Dgraph {
2 conn, err := grpc.Dial("localhost:9080", grpc.WithInsecure())
3 if err != nil {
4 log.Fatal(err)
5 }
6
7 client := dgo.NewDgraphClient(api.NewDgraphClient(conn))
8
9 return client
10 }
11
12 func CreateSchema(client *dgo.Dgraph) error {
13 schema := `
14 name: string @index(term) .
15 age: int .
16
17 type Person {
18 name
19 age
20 }
21 `
22 op := &api.Operation{Schema: schema}
23
24 err := client.Alter(context.Background(), op)
25 return err
26 }

执行成功后, 在 UI 界面(http://localhost:8000)上验证是否创建成功:

schema(pred:[name, age]) {
perdicate
type
index
}

结果如下:

{
"data": {
"schema": [
{
"predicate": "age",
"type": "int"
},
{
"predicate": "name",
"type": "string",
"index": true
}
]
},
... 省略 ...
}

数据的 CURD

首先, 新增数据

 1  type Person struct {
2 Uid string `json:"uid"`
3 Name string `json:"name"`
4 Age int `json:"age"`
5 Friends []Person `json:"friends"`
6 }
7
8 func AddSomeData(client *dgo.Dgraph) error {
9 p1 := &Person{
10 Name: "Dog",
11 Age: 10,
12 }
13 p1.Friends = make([]Person, 0)
14
15 p2 := &Person{
16 Name: "Monkey",
17 Age: 20,
18 }
19 p3 := &Person{
20 Name: "Cat",
21 Age: 30,
22 }
23
24 p1.Friends = append(p1.Friends, *p2)
25 p1.Friends = append(p1.Friends, *p3)
26
27 mu := &api.Mutation{CommitNow: true}
28 pb, err := json.Marshal(p1)
29 if err != nil {
30 return err
31 }
32
33 mu.SetJson = pb
34 _, err = client.NewTxn().Mutate(context.Background(), mu)
35 return err
36 }

查询数据:

 1  func QueryData(client *dgo.Dgraph) error {
2 q := `
3 query q($name: string){
4 q(func:allofterms(name, $name)){
5 name
6 age
7 uid
8 friends{
9 name
10 age
11 uid
12 }
13 }
14 }
15 `
16 txn := client.NewTxn()
17 res, err := txn.QueryWithVars(context.Background(), q, map[string]string{"$name": "Dog"})
18 if err != nil {
19 return err
20 }
21 fmt.Println(res.String())
22 return nil
23 }

为了简化, 返回值中我直接打印了 string 格式, 其实返回的是个 json 结构.

可以看出, 返回值中包含了上一步创建的 3 个 Person, 其中 2 个作为 Dog 的 friends 返回的.

更新数据:

1  func UpdateData(client *dgo.Dgraph) error {
2 mu := &api.Mutation{
3 CommitNow: true,
4 SetNquads: []byte(`<0xfffd8d67d832b975> <age> "12" .`),
5 }
6
7 _, err := client.NewTxn().Mutate(context.Background(), mu)
8 return err
9 }

其中 <0xfffd8d67d832b975> 是数据的 uid, 根据上面 query 示例的返回值中可以查找到.

这里需要注意的是, 虽然是 int 类型, 但是它的值要用 双引号 围住.

删除数据(删除数据的一个属性):

1  func DeleteProp(client *dgo.Dgraph) error {
2 mu := &api.Mutation{
3 CommitNow: true,
4 DelNquads: []byte(`<0xfffd8d67d832b976> <age> * .`),
5 }
6
7 _, err := client.NewTxn().Mutate(context.Background(), mu)
8 return err
9 }

删除了 <0xfffd8d67d832b976> 这条数据的 属性, <0xfffd8d67d832b976> 是上面 name="Monkey" 的那条数据.

将数据的属性和关系都删除之后, 这条数据就相当于删除了.

直接根据 Uid 删除数据的 api 也有, 但是使用后无效(具体我提了个 issue 到 dgraph 的代码库)

事务

draph 是支持事务的, 上面的例子中其实已经使用了事务, 只不过每个事务中只有一个操作.

如果有多个操作, 类似下面这样的代码即可:

 1  ctx := context.Background()
2 tnx := client.NewTxn()
3
4 _, err := tnx.Mutate(ctx, mu1)
5 if err != nil {
6 tnx.Discard(ctx)
7 }
8 _, err = tnx.Mutate(ctx, mu2)
9 if err != nil {
10 tnx.Discard(ctx)
11 }
12
13 tnx.Commit(ctx)

总结

图数据库不是万能的, 它的目的也不是取代关系数据库.

我们根据使用场景在合适的时候选用 dgraph, 可以更加的轻松的完成数据分析, 而不用深陷 sql 的坑中.

dgraph 使用简介的更多相关文章

  1. ASP.NET Core 1.1 简介

    ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...

  2. MVVM模式和在WPF中的实现(一)MVVM模式简介

    MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...

  3. Cassandra简介

    在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了一种非常流行的图形数据库Neo4J的使用方法.而在本文中,我们将对另外一种类型的NoSQL数据库——Cassandra进行简单地介 ...

  4. REST简介

    一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...

  5. Microservice架构模式简介

    在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices>.该书描述了如何按照Mic ...

  6. const,static,extern 简介

    const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...

  7. HTTPS简介

    一.简单总结 1.HTTPS概念总结 HTTPS 就是对HTTP进行了TLS或SSL加密. 应用层的HTTP协议通过传输层的TCP协议来传输,HTTPS 在 HTTP和 TCP中间加了一层TLS/SS ...

  8. 【Machine Learning】机器学习及其基础概念简介

    机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  9. Cesium简介以及离线部署运行

    Cesium简介 cesium是国外一个基于JavaScript编写的使用WebGL的地图引擎,一款开源3DGIS的js库.cesium支持3D,2D,2.5D形式的地图展示,可以自行绘制图形,高亮区 ...

随机推荐

  1. SpringBoot简单(登录/显示/登出)工程下载 使用Thymeleaf输出页面文字

    下载地址:https://files.cnblogs.com/files/xiandedanteng/SessionShare20191226.zip 测试用,画面如下: SpringMVC入门弟子也 ...

  2. yum wget rpm

    wget 类似于迅雷,是一种下载工具          下载安装包 yum: 是redhat, centos 系统下的软件安装方式 下载安装包并自动安装 以及一些依赖关系 基于RPM包管理,能够从指定 ...

  3. .net core Configuration对象

    前因:最近在阅读.net core源码,发现关于Configuration介绍的文档都比较多,但是都比较杂乱,(微软文档太官方),所以写下一些自己的感想 主要通过三种使用情况来介绍 Web应用程序使用 ...

  4. Linux:使用SecureCRT来上传和下载文件

    SecureCRT自带的有几种上传下载功能,SecureCRT下的文件传输协议有以下几种:ASCII.Xmodem.Ymodem.Zmodem. ASCII:这是最快的传输协议,但只能传送文本文件.  ...

  5. 【python练习册】1.3 将1.2题生成的n个激活码保存到mysql关系型数据库中

    该题涉及到mysql中一些指令,先熟悉一下 MySQL指令 参考:https://www.cnblogs.com/zhuyongzhe/p/7686105.html mysql -u root -p ...

  6. Python全栈工程师系列学习之学习记录

    @ 目录 前言 Day 01 一.python的历史和种类 二.安装python解释器以及配置环境变量 三.变量.常量和注释 Day 02 Day 03 Day 04 Day 05 Day 06 一. ...

  7. ActiveMQ客户端Apache.NMS从.net 4.0移植到.net standard 2.0

    1.从官网或GitHub下载Apache.NMS源码 2.新建.net standard 2.0类库 3.将源码复制到新建的类库中,并删除或注释CommonAssemblyInfo.cs文件(程序集版 ...

  8. nioServerChannel的的状态

    转载自https://blog.csdn.net/zxhoo/article/details/17964353 Channel继承层次图分析上面提到的三个状态的时候,会去看Channel继承层次里某些 ...

  9. java ConcurrentHashMap和CopyOnWriteArrayList解决并发问题

    ConcurrentHashMap 一.hashtable.hashmap.ConcurrentHashMap 1.线程不安全的HashMap 因为多线程环境下,使用Hashmap进行put操作会引起 ...

  10. 我要吹爆这份阿里中间件技术内部的RM笔记,简直佩服到五体投地

    消息队列 RocketMQ 版是阿里云基于 Apache RocketMQ 构建的低延迟.高并发.高可用.高可靠的分布式消息中间件.该产品最初由阿里巴巴自研并捐赠给 Apache 基金会,服务于阿里集 ...