dgraph 使用簡介

来源:https://www.cnblogs.com/wang_yb/archive/2020/06/28/13204729.html

dgraph 簡介 dgraph 使用示例(基於 golang) golang client 安裝 創建 schema 數據的 CURD 事務 總結 dgraph 簡介 dgraph 是基於 golang 開發的開源的分散式圖資料庫. 誕生時間不長, 發展卻很迅速. 目前是 v20.x 版本, dg ...


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 的坑中.


您的分享是我們最大的動力!

更多相關文章
  • Vulnhub簡介 Vulnhub是一個提供各種漏洞環境的靶場平臺,供安全愛好者學習滲透使用,大部分環境是做好的虛擬機鏡像文件,鏡像預先設計了多種漏洞,需要使用VMware或者VirtualBox運行。每個鏡像會有破解的目標,大多是Boot2root,從啟動虛機到獲取操作系統的root許可權和查看fl ...
  • 今天準備在 ubuntu 伺服器裡面安裝 nodejs 版本,ubuntu 18.04 倉庫 nodejs 預設是 8.x 版本。 1. 通過 apt 安裝 nodejs 在 Ubuntu 18.04 的預設倉庫包含了一個 Node.js 的版本,截至當前,該倉庫的 node.js 版本是 8.10 ...
  • 痞子衡的技術交流群里經常有群友提問: i.MXRT中的FlexSPI驅動API到底怎麼用啊?這個問題已經出現過好幾次了,本來痞子衡不打算專門為這個寫文章的,因為這部分內容在晶元手冊System Boot章節里的最後一節ROM APIs里其實介紹得非常詳細了,但是既然還是有不少朋友在問這個,看起來手冊... ...
  • 1、拉取鏡像命令 docker pull php:7.2.0-cli-alpine 2、啟動容器並執行命令 docker run -it --name php-cli php:7.2.0-cli-alpine php -m 3、查看container 列表命令 docker ps 4、刪除某一con ...
  • 聲明: 1)僅作為個人學習,如有冒犯,告知速刪! 2)不想誤導,如有錯誤,不吝指教! 1: 查看文件信息:ls ls常用參數: 參數含義 -a 顯示指定目錄下所有子目錄與文件,包括隱藏文件 -l 以列表方式顯示文件的詳細信息 -h 配合 -l 以人性化的方式顯示文件大小 註:也可以ls -lh組合 ...
  • 一 Glusterfs介紹 Glusterfs是一個開源的分散式文件系統,是Scale存儲的核心,能夠處理千數量級的客戶端。是整合了許多存儲塊(server)通過Infiniband RDMA或者 Tcp/Ip方式互聯的一個並行的網路文件系統。 特征: 容量可以按比例的擴展,且性能卻不會因此而降低。 ...
  • 前面我們聊到了mariadb的事務,以及事務隔離級別,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/13198186.html;今天我們來聊一聊mariadb的日誌相關話題;mariadb日誌有6種,分別是查詢日誌(general_log),慢查詢日誌(lo... ...
  • MySQL 事務 異常 事務隔離的級別 事務 在你操作資料庫的同時,有可能其他用戶還會不斷地對數據進行增刪改查操作。為了避免並行進行時出現混亂,就產生了“事務”。事務就是要保證一組資料庫操作,要麼全部成功要麼全部失敗,以此來保證不混亂。 事務支持是在引擎層實現的,MySQL支持多系統,不是所有引擎都 ...
一周排行
  • 本次課程就正式進入開發部分。 首先我們先搭建項目框架,還是和之前漸進式風格保持一致,除必備組件外,儘量使用原生功能以方便大家理解。 開發工具:vs 2019 或以上 資料庫:SQL SERVER 2017 或以上 其他需要用到的我們在項目過程中再提。 一、新建 MVC項目 1、打開VS 2019,C ...
  • 一.背景說明: 之前分享過一個微服務開發框架, “享一個集成.NET Core+Swagger+Consul+Polly+Ocelot+IdentityServer4+Exceptionless+Apollo+SkyWalking的微服務開發框架”,前兩天在Github上收到一個Issues,是想我 ...
  • 前言 Http我們都已經耳熟能詳了,而關於Http學習的文章網上有很多,各個知識點的講解也可說是深入淺出。然而,學習過後,我們對Http還是一知半解。問題出在了哪? Http是一個客戶機與伺服器之間的通信的協議,真的想學習Http,就必須把客戶機和伺服器也學了,也就是說,必須立體的學習,不然我們永遠 ...
  • 本人製作的這個 “簡易日誌 (SimpleLogger)” 包裡面包含的代碼邏輯,最開始也就是簡單地寫入文本,後來經過實際使用的演化,做了各種優化,添加了一些實用的特性,感覺用著還不錯。正所謂獨樂樂不如眾樂樂,於是將其打包上傳到微軟的包管理庫 NuGet 中,大家可以使用試試,相互交流。 ...
  • 1.需求示意圖 2.需求描述 原本是為了給做unity3d客戶端開發的同事提供不定時的消息推送,比如商城購買道具後服務端將道具信息推送給客戶端。 本篇文章簡化理解,用“相關部門開展活動,向全市人民徵集社會服務改善意見”為例子。但核心想法一致:單向推送(指這個需求上只需要單向)。所以這個功能並不是聊天 ...
  • 找到項目中ServiceStack.Text.dll文件的版本,比如我的版本是5.0.0,到GitHub上下載對應的源碼(https://github.com/ServiceStack/ServiceStack.Text/tags) 打開解決方案,重新生成ServiceStack.Text項目,如果 ...
  • 前言 上一篇文章主要介紹了IL的概念以及基礎的示例代碼,在這一篇文章中我們將通過對象調用看IL。 創建對象與調用方法 class Program { static void Main(string[] args) { var obj = new MyClass(); Console.WriteLin ...
  • abp版本5.9 概述 數據遷移無非就是兩件事情,1、創建資料庫,並根據實體創建對應的表;2、添加一些初始數據 abp的數據遷移也是完成這兩件事,比較特殊的是它是多租戶saas系統,而且支持不同的租戶有獨立的資料庫。所以abp中的遷移要先遷移戶主Host,再遷移租戶Tenant的資料庫 它的遷移定義 ...
  • 本文屬於OData系列 目錄 武裝你的WEBAPI-OData入門 武裝你的WEBAPI-OData便捷查詢 武裝你的WEBAPI-OData分頁查詢 武裝你的WEBAPI-OData資源更新Delta 武裝你的WEBAPI-OData之EDM 武裝你的WEBAPI-OData常見問題 武裝你的WE ...
  • 前言 面試總是會被問到有沒有用過分散式鎖、redis 鎖,大部分讀者平時很少接觸到,所以只能很無奈的回答 “沒有”。本文通過 Spring Boot 整合 redisson 來實現分散式鎖,並結合 demo 測試結果。 首先看下大佬總結的圖 正文 添加依賴 <!--redis--> <depende ...