dgraph 使用簡介

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

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


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

-Advertisement-
Play Games
更多相關文章
  • 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支持多系統,不是所有引擎都 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...