go實現dgraph的各種操作


go實現dgraph的各種操作

import "github.com/dgraph-io/dgo"
import "github.com/dgraph-io/dgo/protos/api"
import "google.golang.org/grpc"

我在這篇博客將會做以下的工作:

  1. 初始化Node
  2. 添加Node
  3. 查詢數據庫
  4. 為數據庫添加Edge , 即 添加predicate<朋友>
  5. 更新數據庫
  6. 刪除Node

之前我已經實現了用dgraph的http客戶端實現 dgraph 的各種操作, 但是在 go 客戶端實現和 http 客戶端實現還是存在着比較大的區別. 因此, 我就寫了這篇博客用於記錄.

哦, 對了, 另外還有一個關鍵就是, 在我寫這篇博客的時候 dgraph 在GODOC和GOWalker的文檔都還沒補全, 有很多方法都還只是寫了個名, 甚至都沒介紹, 對新手非常不友好.

初始化數據庫

此處, 我將創建五個用戶作為基礎數據庫

初始化Person的結構體, 表的屬性從中也可以看出

type Person struct{
	Uid		string	`json:"uid,omitempty"`
	Name		string	`json:"name,omitempty"`
	From		string	`json:"from,omitempty"`
	NameOFcn	string	`json:"nameOFcn,omitempty"`
	NameOFjp	string	`json:"nameOFjp,omitempty"`
	NameOFen	string	`json:"nameOFen,omitempty"`
	Age		int	`json:"age,omitempty"`
	Friend		[]Person `json:"friend,omitempty"`
}

插入五個人的數據

var (
	dgraph = flag.String("d", "127.0.0.1:9080", "Dgraph server address")
)

func main() {
	flag.Parse()
	conn, err := grpc.Dial(*dgraph, grpc.WithInsecure())
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()

	dg := dgo.NewDgraphClient(api.NewDgraphClient(conn))

	p1 := Person{
		Name: "wangha",
		Age: 17,
		From: "China",
		NameOFen: "wangha",
		NameOFcn: "王哈",
		NameOFjp: "王ハ",
	}
	p2 := Person{
		Name: "chenchao",
		Age: 22,
		From: "China",
		NameOFen: "ChaoChen",
		NameOFcn: "陳超",
	}
	p3 := Person{
		Name: "xhe",
		Age: 18,
		From: "Japan",
		NameOFen: "wanghe",
		NameOFcn: "x鶴",
	}
	p4 := Person{
		Name: "changyang",
		Age: 19,
		From: "England",
		NameOFcn: "常颺",
	}
	p5 := Person{
		Name: "yetao",
		Age: 18,
		From: "Russian",
		NameOFen: "TaoYe",
		NameOFcn: "葉掏",
	}

	op := &api.Operation{}
	op.Schema = `
		name: string .
		age: int .
		from: string .
		nameOFcn: string @index(term) .
		nameOFjp: string @index(term) .
		nameOFen: string @index(term) .
	`

	ctx := context.Background()
	if err := dg.Alter(ctx, op); err != nil {
		log.Fatal(err)
	}

	mu := &api.Mutation{
		CommitNow: true,
	}

	var p = [5]Person{p1,p2,p3,p4,p5}

	for _,x := range p {
		pb, err := json.Marshal(x)
		if err != nil {
			log.Println(err)
		}
		mu.SetJson = pb
		_,err = dg.NewTxn().Mutate(ctx, mu)
		if err != nil {
			log.Println(err)
		}
	}
}

我們可以從http客戶端查看驗證是否插入成功

init

可以看出, 插入成功了

添加Node

此處新注冊了一位朋友, 我們需要將他添加到 dgprah

和前面的步驟基本一樣, 只是少了初始化 schema 的步驟

func main() {
	flag.Parse()
	conn, err := grpc.Dial(*dgraph, grpc.WithInsecure())
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()

	dg := dgo.NewDgraphClient(api.NewDgraphClient(conn))

	ctx := context.Background()

	mu := &api.Mutation{
		CommitNow: true,
	}

	type arrays struct{
		Uids	[]Person `json:"info"`
	}

	t := Person{
		Name : "yaozhao",
		Age : 24,
		From : "M78Star",
		NameOFcn : "姚X",
		NameOFjp : "姚飛機",
		NameOFen : "ZhaoYao",
	}

	pb, err := json.Marshal(t)
	if err != nil {
		log.Println(err)
	}
	mu.SetJson = pb

	assign,err := dg.NewTxn().Mutate(ctx,mu)
	if err != nil{
		log.Println(err)
	}
	fmt.Printf("assign: %v \n",assign)
}

查詢

此時,我們查詢有關於Name="yaozhao"的信息

func main() {
	flag.Parse()
	conn, err := grpc.Dial(*dgraph, grpc.WithInsecure())
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()

	dg := dgo.NewDgraphClient(api.NewDgraphClient(conn))
	ctx := context.Background()

	vars := make(map[string]string)
	vars["$enname"] = "ZhaoYao"
	q := `query wanghainfo($enname: string){
		info(func: eq(nameOFen, $enname)){
			uid
			expand(_all_)
		}
	}`

	resp, err := dg.NewTxn().QueryWithVars(ctx,q,vars)
	if err != nil {
		log.Println(err)
	}

	type arrays struct{
		Uids	[]Person `json:"info"`
	}

	var r arrays

	err = json.Unmarshal(resp.Json, &r)
	if err != nil{
		log.Println(err)
	}

	log.Println(string(resp.Json))
	log.Println(r.Uids[0].Uid)
}

可以看到結果如下:

queryuid

添加Edge: predicate<friend>

我在 json 格式進行Mutate時, 沒有找到相關的添加Edge的方法, 因此我改為用NQuad格式.

NQuad介紹: RDF/NQuad

func main() {
	flag.Parse()
	conn, err := grpc.Dial(*dgraph, grpc.WithInsecure())
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()

	dg := dgo.NewDgraphClient(api.NewDgraphClient(conn))

	ctx := context.Background()

	mu := &api.Mutation{
		CommitNow: true,
	}

	type arrays struct{
		Uids	[]Person `json:"info"`
	}

	var1 := make(map[string]string)
	var1["$enname"] = "wangha"
	q1 := `query wanghainfo($enname: string){
		info(func: eq(nameOFen, $enname)){
			uid
		}
	}`

	resp, err := dg.NewTxn().QueryWithVars(ctx,q1,var1)
	if err != nil {
		log.Println(err)
	}

	var r1 arrays
	var r2 arrays

	err = json.Unmarshal(resp.Json, &r1)
	if err != nil{
		log.Println(err)
	}
	Uid_wangha := r1.Uids[0].Uid


	var1["$enname"] = "TaoYe"
        q2 := `query wanghainfo($enname: string){
                info(func: eq(nameOFen, $enname)){
                        uid
                }
        }`

	resp, err = dg.NewTxn().QueryWithVars(ctx,q2,var1)
	if err != nil{
		log.Println(err)
	}

	err = json.Unmarshal(resp.Json, &r2)
	if err != nil{
		log.Println(err)
	}
	Uid_TaoYe := r2.Uids[0].Uid

	t :=fmt.Sprintf("<%s> <friend> <%s> .",Uid_wangha,Uid_TaoYe)
	mu.SetNquads = []byte(t)

	_,err = dg.NewTxn().Mutate(ctx,mu)
	if err != nil{
		log.Println(err)
	}
}

驗證:

addfriend

更新數據

若在此時, 我發現我的數據弄錯了

用戶nameOFen="ZhaoYao"的用戶age實際應該為20, 此時, 同樣是用NQuad來更新數據

func main() {
	flag.Parse()
	conn, err := grpc.Dial(*dgraph, grpc.WithInsecure())
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()

	dg := dgo.NewDgraphClient(api.NewDgraphClient(conn))

	ctx := context.Background()

	mu := &api.Mutation{
		CommitNow: true,
	}

	type arrays struct{
		Uids	[]Person `json:"info"`
	}

	var1 := make(map[string]string)
	var1["$enname"] = "ZhaoYao"
	q1 := `query wanghainfo($enname: string){
		info(func: eq(nameOFen, $enname)){
			uid
		}
	}`

	resp, err := dg.NewTxn().QueryWithVars(ctx,q1,var1)
	if err != nil {
		log.Println(err)
	}

	var r1 arrays

	err = json.Unmarshal(resp.Json, &r1)
	if err != nil{
		log.Println(err)
	}
	Uid_wangha := r1.Uids[0].Uid
	log.Println(Uid_wangha)

	t := fmt.Sprintf("<%s> <age> \"%s\" .",Uid_wangha,"20")
	mu.SetNquads = []byte(t)

	assign,err := dg.NewTxn().Mutate(ctx,mu)
	if err != nil{
		log.Println(err)
	}
	fmt.Printf("assign: %v",assign)
}

可以看到結果:

update

更新成功

刪除用戶

刪除用戶時, dgraph規定了無法刪除Uid <subject> , 只能刪除<predicate>和<object>

使用了&api.Mutation內規定的方法去刪除

func main() {
	flag.Parse()
	conn, err := grpc.Dial(*dgraph, grpc.WithInsecure())
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()

	dg := dgo.NewDgraphClient(api.NewDgraphClient(conn))
	ctx := context.Background()

	vars := make(map[string]string)
	vars["$enname"] = "ZhaoYao"
	q := `query wanghainfo($enname: string){
		info(func: eq(nameOFen, $enname)){
			uid
		}
	}`

	resp, err := dg.NewTxn().QueryWithVars(ctx,q,vars)
	if err != nil {
		log.Println(err)
	}

	type arrays struct{
		Uids	[]Person `json:"info"`
	}

	var r arrays

	err = json.Unmarshal(resp.Json, &r)
	if err != nil{
		log.Println(err)
	}

	log.Println(string(resp.Json))
	log.Println(r.Uids[0].Uid)

	d := map[string]string{"uid":string(r.Uids[0].Uid)}
	pb, err := json.Marshal(d)

	mu := &api.Mutation{
		CommitNow: true,
		DeleteJson: pb,
	}

	assign,err := dg.NewTxn().Mutate(ctx, mu)
	if err != nil{
		log.Println(err)
	}
	fmt.Printf("assign: %v \n",assign)
}

再次查詢, 數據已經消失

delete

寫在最后

dgraph 是一個非常強的分布式 NoSql , 想弄懂了真的得看很多遍技術文檔

以下鏈接可能在你學習的時候會有所幫助

Mutate : https://docs.dgraph.io/mutations/

Query : https://docs.dgraph.io/query-language/

Client : https://docs.dgraph.io/clients/

Dgo : https://gowalker.org/github.com/dgraph-io/dgo

Api : https://gowalker.org/github.com/dgraph-io/dgo/protos/api#Assigned

Grpc : https://godoc.org/google.golang.org/grpc

RDF : https://www.w3.org/TR/n-quads/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM