dgraph 使用简介
dgraph 简介
dgraph 是基于 golang 开发的开源的分布式图数据库. 诞生时间不长, 发展却很迅速. 目前是 v20.x 版本, dgraph 集群主要包含 3 种节点:
- Zero: 是集群的核心, 负责调度集群服务器和平衡服务器组之间的数据
- Alpha: 保存数据的 谓词 和 索引. 谓词包括数据的 属性 和数据之间的 关系; 索引是为了更快的进行数据的过滤和查找
- 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 使用简介的更多相关文章
- ASP.NET Core 1.1 简介
ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...
- MVVM模式和在WPF中的实现(一)MVVM模式简介
MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...
- Cassandra简介
在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了一种非常流行的图形数据库Neo4J的使用方法.而在本文中,我们将对另外一种类型的NoSQL数据库——Cassandra进行简单地介 ...
- REST简介
一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...
- Microservice架构模式简介
在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices>.该书描述了如何按照Mic ...
- const,static,extern 简介
const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...
- HTTPS简介
一.简单总结 1.HTTPS概念总结 HTTPS 就是对HTTP进行了TLS或SSL加密. 应用层的HTTP协议通过传输层的TCP协议来传输,HTTPS 在 HTTP和 TCP中间加了一层TLS/SS ...
- 【Machine Learning】机器学习及其基础概念简介
机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- Cesium简介以及离线部署运行
Cesium简介 cesium是国外一个基于JavaScript编写的使用WebGL的地图引擎,一款开源3DGIS的js库.cesium支持3D,2D,2.5D形式的地图展示,可以自行绘制图形,高亮区 ...
随机推荐
- 终于开始了,微软的野心将通过全场景开发平台dotnet 5体现得淋漓尽致!
本文已经同步到微信公众号「极客起源」 . 现在都在谈论全场景开发,也就是用一套开发工具,可以开发包括但不限于桌面.移动.IOT.游戏.Web等平台的应用.这样对于开发人员是非常爽的.本文将介绍微软 ...
- JVM学习第三天(JVM的执行子系统)之字节码指令
早上看了Class类文件结构,晚上继续来看字节码指令,毕竟谁也不是一步登天的(说白了还是穷); 字节码指令 Java虚拟机的指令由一个字节长度的.代表着某种特定操作含义的数字(称为操作码,Opcode ...
- 转载:记录一次MySQL两千万数据的大表优化解决过程
地址:https://database.51cto.com/art/201902/592522.htm 虽然是广告文,但整体可读性尚可.
- js中页面加载完成后执行的几种方法及执行顺序
在js和jquery使用中,经常使用到页面加载完成后执行某一方法.通过整理,大概是五种方式(其中有的只是书写方式不一样). 1:使用jQuery的$(function){}; 2:使用jquery的$ ...
- Mybatis如何执行Select语句,你真的知道吗?
持续原创输出,点击上方蓝字关注我吧 作者:不才陈某 博客:https://chenjiabing666.github.io 前言 本篇文章是Myabtis源码分析的第三篇,前两篇分别介绍了Mybati ...
- jmeter中接口测试出现乱码或不识别中文解决办法
在查看结果是中出现乱码时:jmeter的bin目录下的jmeter.properties下最下面添加sampleresult.default.encoding=UTF-8后重新打开工具就好了 在接口的 ...
- [极客大挑战 2019]Havefun wp
很少见的很简单的一道题 查看源代码 获得一段被注释的代码 直接?cat=dog即可得flag
- mysql浅谈--事务ACID特性
mysql MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管 ...
- 容器云平台No.3~kubernetes使用
今天是是第三篇,接着上一篇继续 首先,通过kubectl可以看到,三个节点都正常运行 [root@k8s-master001 ~]# kubectl get no NAME STATUS ROLES ...
- 每天一个dos命令-del.
比较常用的选项: /F 强制删除只读文件. /Q 安静模式.删除全局通配符时,不要求确认 文件名或者路径中有空格,需要使用引号包围 常用的实例:del /q/f c:\Securitylog\S ...