go實現dgraph的各種操作
import "github.com/dgraph-io/dgo"
import "github.com/dgraph-io/dgo/protos/api"
import "google.golang.org/grpc"
我在這篇博客將會做以下的工作:
- 初始化Node
- 添加Node
- 查詢數據庫
- 為數據庫添加Edge , 即 添加predicate<朋友>
- 更新數據庫
- 刪除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客戶端查看驗證是否插入成功
可以看出, 插入成功了
添加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)
}
可以看到結果如下:
添加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)
}
}
驗證:
更新數據
若在此時, 我發現我的數據弄錯了
用戶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)
}
可以看到結果:
更新成功
刪除用戶
刪除用戶時, 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)
}
再次查詢, 數據已經消失
寫在最后
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