dgraph 使用简介

dgraph 使用简介dgraph 简介 dgraph 使用示例(基于 golang) golang client 安装 创建 schema 数据的 CURD 事务 总结 dgraph 简介 dgraph 是基于 gola

dgraph 使用简介

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

代码100分

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

代码100分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:

代码100分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 的坑中.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/7679.html

(0)
上一篇 2023-03-16
下一篇 2023-03-16

相关推荐

  • Python列表倒序实现

    Python列表倒序实现a href=”https://www.python100.com/a/sm.html”font color=”red”免责声明/font/a a href=”https://beian.miit.gov.cn/”苏ICP备2023018380号-1/a Copyright www.python100.com .Some Rights Reserved.

    2024-06-04
    59
  • 企业实践 | 如何更好地使用 Apache Flink 解决数据计算问题?「建议收藏」

    企业实践 | 如何更好地使用 Apache Flink 解决数据计算问题?「建议收藏」业务数据的指数级扩张,数据处理的速度可不能跟不上业务发展的步伐。基于 Flink 的数据平台构建、运用 Flink 解决业务场景中的具体问题等随着 Flink 被更广泛的应用于广告、金融风控、实时 …

    2022-12-17
    126
  • 事务的隔离级别是什么_mysql事务隔离级别 默认

    事务的隔离级别是什么_mysql事务隔离级别 默认在讲事务的隔离级别,我们先得回忆一下事务的隔离性 事务的隔离性是在当多个用户并发访问数据库时,比如说操作同一张表时,数据库为每一个用户开启事务,不能被其他事务的操作所干扰,多个并发事务之间需要相互隔离

    2023-04-18
    170
  • 吓尿,给小表加个字段,把数据库搞挂了「终于解决」

    吓尿,给小表加个字段,把数据库搞挂了「终于解决」一天下午,在给线上一个小表加个字段,发现老是加不上去,一直卡死。运维同学突然跑过来跟我说,线上数据库这半个小时一直在重启,问我是否有做什么操作。我当时虎躯一震,总共100多行的小表加个字段都加出问题了

    2023-04-16
    155
  • 使用PyCharm编辑器设置颜色主题

    使用PyCharm编辑器设置颜色主题PyCharm是一款由JetBrains公司开发的Python IDE(集成开发环境),起初是以Python语言开发为主题的IDE,但在后来逐渐成为一种多语言通用的开发工具。PyCharm被Python社区广泛使用,并且有着丰富的插件库和主题库供开发者使用。

    2024-08-31
    26
  • 一个韭菜用python采集(Python采集)

    一个韭菜用python采集(Python采集)数据采集(DAQ),又称数据获取,是指从传感器和其它待测设备等模拟和数字被测单元中自动采集非电量或者电量信号,送到上位机中进行分析,处理。数据采集系统是结合基于计算机或者其他专用测试平台的测量软硬件产品来实现灵活的、用户自定义的测量系统。采集一般是采样方式,即隔一定时间(称采样周期)对同一点数据重复采集。采集的数据大多是瞬时值,也可是某段时间内的一个特征值。

    2024-06-16
    52
  • mysql查询性能优化_sql性能优化

    mysql查询性能优化_sql性能优化1、不要取出全部列,取出全部列,会让优化器无法完成索引覆盖扫描这类优化,还会为服务器带来额外的I/O、内存和CPU的消耗。应该严格禁止SELECT * 的写法。MySQL使用如下三种方式应用WHERE

    2023-01-22
    161
  • 远程工具 批量管理程序[亲测有效]

    远程工具 批量管理程序[亲测有效]远程工具 批量管理程序远程桌面是微软公司为了便于网络管理员管理维护服务器推出的一项服务。从windows 2000 server版本开始引入,网络管理员时候远程桌面连接器连接到网络任意一台开启了远程…

    2023-02-23
    145

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注