1 Star 1 Fork 0

独孤川 / dgraph-io_dgo

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
examples_test.go 29.33 KB
一键复制 编辑 原始数据 按行查看 历史
Anurag 提交于 2021-04-21 15:01 . fix(Client): Add DialCloudEndpoint (#147)
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541
/*
* Copyright (C) 2017 Dgraph Labs, Inc. and Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dgo_test
import (
"context"
"encoding/json"
"fmt"
"log"
"strings"
"time"
"github.com/dgraph-io/dgo/v210"
"github.com/dgraph-io/dgo/v210/protos/api"
"google.golang.org/grpc"
)
type CancelFunc func()
func getDgraphClient() (*dgo.Dgraph, CancelFunc) {
conn, err := grpc.Dial("127.0.0.1:9180", grpc.WithInsecure())
if err != nil {
log.Fatal("While trying to dial gRPC")
}
dc := api.NewDgraphClient(conn)
dg := dgo.NewDgraphClient(dc)
ctx := context.Background()
// Perform login call. If the Dgraph cluster does not have ACL and
// enterprise features enabled, this call should be skipped.
for {
// Keep retrying until we succeed or receive a non-retriable error.
err = dg.Login(ctx, "groot", "password")
if err == nil || !strings.Contains(err.Error(), "Please retry") {
break
}
time.Sleep(time.Second)
}
if err != nil {
log.Fatalf("While trying to login %v", err.Error())
}
return dg, func() {
if err := conn.Close(); err != nil {
log.Printf("Error while closing connection:%v", err)
}
}
}
func ExampleDgraph_Alter_dropAll() {
dg, cancel := getDgraphClient()
defer cancel()
op := api.Operation{DropAll: true}
ctx := context.Background()
if err := dg.Alter(ctx, &op); err != nil {
log.Fatal(err)
}
// Output:
}
func ExampleTxn_Query_variables() {
dg, cancel := getDgraphClient()
defer cancel()
type Person struct {
Uid string `json:"uid,omitempty"`
Name string `json:"name,omitempty"`
DType []string `json:"dgraph.type,omitempty"`
}
op := &api.Operation{}
op.Schema = `
name: string @index(exact) .
type Person {
name
}
`
ctx := context.Background()
err := dg.Alter(ctx, op)
if err != nil {
log.Fatal(err)
}
p := Person{
Name: "Alice",
DType: []string{"Person"},
}
mu := &api.Mutation{
CommitNow: true,
}
pb, err := json.Marshal(p)
if err != nil {
log.Fatal(err)
}
mu.SetJson = pb
_, err = dg.NewTxn().Mutate(ctx, mu)
if err != nil {
log.Fatal(err)
}
variables := make(map[string]string)
variables["$a"] = "Alice"
q := `
query Alice($a: string){
me(func: eq(name, $a)) {
name
dgraph.type
}
}
`
resp, err := dg.NewTxn().QueryWithVars(ctx, q, variables)
if err != nil {
log.Fatal(err)
}
type Root struct {
Me []Person `json:"me"`
}
var r Root
err = json.Unmarshal(resp.Json, &r)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(resp.Json))
// Output: {"me":[{"name":"Alice","dgraph.type":["Person"]}]}
}
func ExampleTxn_Mutate() {
type School struct {
Name string `json:"name,omitempty"`
DType []string `json:"dgraph.type,omitempty"`
}
type loc struct {
Type string `json:"type,omitempty"`
Coords []float64 `json:"coordinates,omitempty"`
}
// If omitempty is not set, then edges with empty values (0 for int/float, "" for string, false
// for bool) would be created for values not specified explicitly.
type Person struct {
Uid string `json:"uid,omitempty"`
Name string `json:"name,omitempty"`
Age int `json:"age,omitempty"`
Married bool `json:"married,omitempty"`
Raw []byte `json:"raw_bytes,omitempty"`
Friends []Person `json:"friends,omitempty"`
Location loc `json:"loc,omitempty"`
School []School `json:"school,omitempty"`
DType []string `json:"dgraph.type,omitempty"`
}
dg, cancel := getDgraphClient()
defer cancel()
// While setting an object if a struct has a Uid then its properties in the
// graph are updated else a new node is created.
// In the example below new nodes for Alice, Bob and Charlie and school
// are created (since they don't have a Uid).
p := Person{
Uid: "_:alice",
Name: "Alice",
Age: 26,
Married: true,
DType: []string{"Person"},
Location: loc{
Type: "Point",
Coords: []float64{1.1, 2},
},
Raw: []byte("raw_bytes"),
Friends: []Person{{
Name: "Bob",
Age: 24,
DType: []string{"Person"},
}, {
Name: "Charlie",
Age: 29,
DType: []string{"Person"},
}},
School: []School{{
Name: "Crown Public School",
DType: []string{"Institution"},
}},
}
op := &api.Operation{}
op.Schema = `
name: string @index(exact) .
age: int .
married: bool .
Friends: [uid] .
loc: geo .
type: string .
coords: float .
type Person {
name
age
married
Friends
loc
}
type Institution {
name
}
`
ctx := context.Background()
if err := dg.Alter(ctx, op); err != nil {
log.Fatal(err)
}
mu := &api.Mutation{
CommitNow: true,
}
pb, err := json.Marshal(p)
if err != nil {
log.Fatal(err)
}
mu.SetJson = pb
response, err := dg.NewTxn().Mutate(ctx, mu)
if err != nil {
log.Fatal(err)
}
// Assigned uids for nodes which were created would be returned in the response.Uids map.
puid := response.Uids["alice"]
const q = `
query Me($id: string){
me(func: uid($id)) {
name
age
loc
raw_bytes
married
dgraph.type
friends @filter(eq(name, "Bob")) {
name
age
dgraph.type
}
school {
name
dgraph.type
}
}
}
`
variables := make(map[string]string)
variables["$id"] = puid
resp, err := dg.NewTxn().QueryWithVars(ctx, q, variables)
if err != nil {
log.Fatal(err)
}
type Root struct {
Me []Person `json:"me"`
}
var r Root
err = json.Unmarshal(resp.Json, &r)
if err != nil {
log.Fatal(err)
}
out, _ := json.MarshalIndent(r, "", "\t")
fmt.Printf("%s\n", out)
// Output: {
// "me": [
// {
// "name": "Alice",
// "age": 26,
// "married": true,
// "raw_bytes": "cmF3X2J5dGVz",
// "friends": [
// {
// "name": "Bob",
// "age": 24,
// "loc": {},
// "dgraph.type": [
// "Person"
// ]
// }
// ],
// "loc": {
// "type": "Point",
// "coordinates": [
// 1.1,
// 2
// ]
// },
// "school": [
// {
// "name": "Crown Public School",
// "dgraph.type": [
// "Institution"
// ]
// }
// ],
// "dgraph.type": [
// "Person"
// ]
// }
// ]
// }
}
func ExampleTxn_Mutate_bytes() {
dg, cancel := getDgraphClient()
defer cancel()
type Person struct {
Uid string `json:"uid,omitempty"`
Name string `json:"name,omitempty"`
Bytes []byte `json:"bytes,omitempty"`
DType []string `json:"dgraph.type,omitempty"`
}
op := &api.Operation{}
op.Schema = `
name: string @index(exact) .
bytes: string .
type Person {
name
bytes
}
`
ctx := context.Background()
err := dg.Alter(ctx, op)
if err != nil {
log.Fatal(err)
}
p := Person{
Name: "Alice-new",
DType: []string{"Person"},
Bytes: []byte("raw_bytes"),
}
mu := &api.Mutation{
CommitNow: true,
}
pb, err := json.Marshal(p)
if err != nil {
log.Fatal(err)
}
mu.SetJson = pb
_, err = dg.NewTxn().Mutate(ctx, mu)
if err != nil {
log.Fatal(err)
}
q := `
{
q(func: eq(name, "Alice-new")) {
name
bytes
dgraph.type
}
}
`
resp, err := dg.NewTxn().Query(ctx, q)
if err != nil {
log.Fatal(err)
}
type Root struct {
Me []Person `json:"q"`
}
var r Root
err = json.Unmarshal(resp.Json, &r)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Me: %+v\n", r.Me)
// Output: Me: [{Uid: Name:Alice-new Bytes:[114 97 119 95 98 121 116 101 115] DType:[Person]}]
}
func ExampleTxn_Query_unmarshal() {
type School struct {
Name string `json:"name,omitempty"`
DType []string `json:"dgraph.type,omitempty"`
}
type Person struct {
Uid string `json:"uid,omitempty"`
Name string `json:"name,omitempty"`
Age int `json:"age,omitempty"`
Married bool `json:"married,omitempty"`
Raw []byte `json:"raw_bytes,omitempty"`
Friends []Person `json:"friends,omitempty"`
School []School `json:"school,omitempty"`
DType []string `json:"dgraph.type,omitempty"`
}
dg, cancel := getDgraphClient()
defer cancel()
op := &api.Operation{}
op.Schema = `
name: string @index(exact) .
age: int .
married: bool .
Friends: [uid] .
type Person {
name
age
married
Friends
}
type Institution {
name
}
`
ctx := context.Background()
err := dg.Alter(ctx, op)
if err != nil {
log.Fatal(err)
}
p := Person{
Uid: "_:bob",
Name: "Bob",
Age: 24,
DType: []string{"Person"},
}
txn := dg.NewTxn()
pb, err := json.Marshal(p)
if err != nil {
log.Fatal(err)
}
mu := &api.Mutation{
CommitNow: true,
SetJson: pb,
}
response, err := txn.Mutate(ctx, mu)
if err != nil {
log.Fatal(err)
}
bob := response.Uids["bob"]
// While setting an object if a struct has a Uid then its properties
// in the graph are updated else a new node is created.
// In the example below new nodes for Alice and Charlie and school are created
// (since they dont have a Uid). Alice is also connected via the friend edge
// to an existing node Bob.
p = Person{
Uid: "_:alice",
Name: "Alice",
Age: 26,
Married: true,
DType: []string{"Person"},
Raw: []byte("raw_bytes"),
Friends: []Person{{
Uid: bob,
}, {
Name: "Charlie",
Age: 29,
DType: []string{"Person"},
}},
School: []School{{
Name: "Crown Public School",
DType: []string{"Institution"},
}},
}
txn = dg.NewTxn()
mu = &api.Mutation{}
pb, err = json.Marshal(p)
if err != nil {
log.Fatal(err)
}
mu.SetJson = pb
mu.CommitNow = true
response, err = txn.Mutate(ctx, mu)
if err != nil {
log.Fatal(err)
}
// Assigned uids for nodes which were created would be returned in the response.Uids map.
puid := response.Uids["alice"]
variables := make(map[string]string)
variables["$id"] = puid
const q = `
query Me($id: string){
me(func: uid($id)) {
name
age
loc
raw_bytes
married
dgraph.type
friends @filter(eq(name, "Bob")) {
name
age
dgraph.type
}
school {
name
dgraph.type
}
}
}
`
resp, err := dg.NewTxn().QueryWithVars(ctx, q, variables)
if err != nil {
log.Fatal(err)
}
type Root struct {
Me []Person `json:"me"`
}
var r Root
err = json.Unmarshal(resp.Json, &r)
if err != nil {
log.Fatal(err)
}
out, _ := json.MarshalIndent(r, "", "\t")
fmt.Printf("%s\n", out)
// Output: {
// "me": [
// {
// "name": "Alice",
// "age": 26,
// "married": true,
// "raw_bytes": "cmF3X2J5dGVz",
// "friends": [
// {
// "name": "Bob",
// "age": 24,
// "dgraph.type": [
// "Person"
// ]
// }
// ],
// "school": [
// {
// "name": "Crown Public School",
// "dgraph.type": [
// "Institution"
// ]
// }
// ],
// "dgraph.type": [
// "Person"
// ]
// }
// ]
// }
}
func ExampleTxn_Query_besteffort() {
dg, cancel := getDgraphClient()
defer cancel()
// NOTE: Best effort only works with read-only queries.
txn := dg.NewReadOnlyTxn().BestEffort()
resp, err := txn.Query(context.Background(), `{ q(func: uid(0x1)) { uid } }`)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(resp.Json))
// Output: {"q":[{"uid":"0x1"}]}
}
func ExampleTxn_Mutate_facets() {
dg, cancel := getDgraphClient()
defer cancel()
// Doing a dropAll isn't required by the user. We do it here so that
// we can verify that the example runs as expected.
op := api.Operation{DropAll: true}
ctx := context.Background()
if err := dg.Alter(ctx, &op); err != nil {
log.Fatal(err)
}
op = api.Operation{}
op.Schema = `
name: string @index(exact) .
age: int .
married: bool .
NameOrigin: string .
Since: string .
Family: string .
Age: bool .
Close: bool .
Friends: [uid] .
type Person {
name
age
married
NameOrigin
Since
Family
Age
Close
Friends
}
type Institution {
name
Since
}
`
err := dg.Alter(ctx, &op)
if err != nil {
log.Fatal(err)
}
// This example shows example for SetObject using facets.
type School struct {
Name string `json:"name,omitempty"`
Since time.Time `json:"school|since,omitempty"`
DType []string `json:"dgraph.type,omitempty"`
}
type Person struct {
Uid string `json:"uid,omitempty"`
Name string `json:"name,omitempty"`
NameOrigin string `json:"name|origin,omitempty"`
Friends []Person `json:"friends,omitempty"`
// These are facets on the friend edge.
Since *time.Time `json:"friends|since,omitempty"`
Family string `json:"friends|family,omitempty"`
Age float64 `json:"friends|age,omitempty"`
Close bool `json:"friends|close,omitempty"`
School []School `json:"school,omitempty"`
DType []string `json:"dgraph.type,omitempty"`
}
ti := time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC)
p := Person{
Uid: "_:alice",
Name: "Alice",
NameOrigin: "Indonesia",
DType: []string{"Person"},
Friends: []Person{
Person{
Name: "Bob",
Since: &ti,
Family: "yes",
Age: 13,
Close: true,
DType: []string{"Person"},
},
Person{
Name: "Charlie",
Family: "maybe",
Age: 16,
DType: []string{"Person"},
},
},
School: []School{School{
Name: "Wellington School",
Since: ti,
DType: []string{"Institution"},
}},
}
mu := &api.Mutation{}
pb, err := json.Marshal(p)
if err != nil {
log.Fatal(err)
}
mu.SetJson = pb
mu.CommitNow = true
response, err := dg.NewTxn().Mutate(ctx, mu)
if err != nil {
log.Fatal(err)
}
auid := response.Uids["alice"]
variables := make(map[string]string)
variables["$id"] = auid
const q = `
query Me($id: string){
me(func: uid($id)) {
name @facets
dgraph.type
friends @filter(eq(name, "Bob")) @facets {
name
dgraph.type
}
school @facets {
name
dgraph.type
}
}
}
`
resp, err := dg.NewTxn().QueryWithVars(ctx, q, variables)
if err != nil {
log.Fatal(err)
}
type Root struct {
Me []Person `json:"me"`
}
var r Root
err = json.Unmarshal(resp.Json, &r)
if err != nil {
log.Fatal(err)
}
out, _ := json.MarshalIndent(r.Me, "", "\t")
fmt.Printf("%s\n", out)
// Output: [
// {
// "name": "Alice",
// "name|origin": "Indonesia",
// "friends": [
// {
// "name": "Bob",
// "friends|since": "2009-11-10T23:00:00Z",
// "friends|family": "yes",
// "friends|age": 13,
// "friends|close": true,
// "dgraph.type": [
// "Person"
// ]
// }
// ],
// "school": [
// {
// "name": "Wellington School",
// "school|since": "2009-11-10T23:00:00Z",
// "dgraph.type": [
// "Institution"
// ]
// }
// ],
// "dgraph.type": [
// "Person"
// ]
// }
// ]
}
func ExampleTxn_Mutate_list() {
dg, cancel := getDgraphClient()
defer cancel() // This example shows example for SetObject for predicates with list type.
type Person struct {
Uid string `json:"uid"`
Address []string `json:"address"`
PhoneNumber []int64 `json:"phone_number"`
DType []string `json:"dgraph.type,omitempty"`
}
p := Person{
Uid: "_:person",
Address: []string{"Redfern", "Riley Street"},
PhoneNumber: []int64{9876, 123},
DType: []string{"Person"},
}
op := &api.Operation{}
op.Schema = `
address: [string] .
phone_number: [int] .
type Person {
Address
phone_number
}
`
ctx := context.Background()
err := dg.Alter(ctx, op)
if err != nil {
log.Fatal(err)
}
mu := &api.Mutation{}
pb, err := json.Marshal(p)
if err != nil {
log.Fatal(err)
}
mu.SetJson = pb
mu.CommitNow = true
response, err := dg.NewTxn().Mutate(ctx, mu)
if err != nil {
log.Fatal(err)
}
variables := map[string]string{"$id": response.Uids["person"]}
const q = `
query Me($id: string){
me(func: uid($id)) {
address
phone_number
dgraph.type
}
}
`
resp, err := dg.NewTxn().QueryWithVars(ctx, q, variables)
if err != nil {
log.Fatal(err)
}
type Root struct {
Me []Person `json:"me"`
}
var r Root
err = json.Unmarshal(resp.Json, &r)
if err != nil {
log.Fatal(err)
}
// List items aren't guaranteed to be in the same order.
fmt.Println(string(resp.Json))
// {"me":[{"address":["Riley Street","Redfern"],"phone_number":[9876,123]}]}
}
func ExampleDeleteEdges() {
dg, cancel := getDgraphClient()
defer cancel()
op := &api.Operation{}
op.Schema = `
age: int .
married: bool .
name: string @lang .
location: string .
Friends: [uid] .
type Person {
name
age
married
Friends
}
type Institution {
name
}
`
ctx := context.Background()
err := dg.Alter(ctx, op)
if err != nil {
log.Fatal(err)
}
type School struct {
Uid string `json:"uid"`
Name string `json:"name@en,omitempty"`
DType []string `json:"dgraph.type,omitempty"`
}
type Person struct {
Uid string `json:"uid,omitempty"`
Name string `json:"name,omitempty"`
Age int `json:"age,omitempty"`
Married bool `json:"married,omitempty"`
Friends []Person `json:"friends,omitempty"`
Location string `json:"location,omitempty"`
Schools []*School `json:"schools,omitempty"`
DType []string `json:"dgraph.type,omitempty"`
}
// Lets add some data first.
p := Person{
Uid: "_:alice",
Name: "Alice",
Age: 26,
Married: true,
DType: []string{"Person"},
Location: "Riley Street",
Friends: []Person{{
Name: "Bob",
Age: 24,
DType: []string{"Person"},
}, {
Name: "Charlie",
Age: 29,
DType: []string{"Person"},
}},
Schools: []*School{&School{
Name: "Crown Public School",
DType: []string{"Institution"},
}},
}
mu := &api.Mutation{}
pb, err := json.Marshal(p)
if err != nil {
log.Fatal(err)
}
mu.SetJson = pb
mu.CommitNow = true
response, err := dg.NewTxn().Mutate(ctx, mu)
if err != nil {
log.Fatal(err)
}
alice := response.Uids["alice"]
variables := make(map[string]string)
variables["$alice"] = alice
const q = `
query Me($alice: string){
me(func: uid($alice)) {
name
age
location
married
dgraph.type
friends {
name
age
dgraph.type
}
schools {
name@en
dgraph.type
}
}
}
`
resp, err := dg.NewTxn().QueryWithVars(ctx, q, variables)
if err != nil {
log.Fatal(err)
}
// Now lets delete the friend and location edge from Alice
mu = &api.Mutation{}
dgo.DeleteEdges(mu, alice, "friends", "location")
mu.CommitNow = true
_, err = dg.NewTxn().Mutate(ctx, mu)
if err != nil {
log.Fatal(err)
}
resp, err = dg.NewTxn().QueryWithVars(ctx, q, variables)
if err != nil {
log.Fatal(err)
}
type Root struct {
Me []Person `json:"me"`
}
var r Root
err = json.Unmarshal(resp.Json, &r)
out, _ := json.MarshalIndent(r.Me, "", "\t")
fmt.Printf("%s\n", out)
// Output: [
// {
// "name": "Alice",
// "age": 26,
// "married": true,
// "schools": [
// {
// "uid": "",
// "name@en": "Crown Public School",
// "dgraph.type": [
// "Institution"
// ]
// }
// ],
// "dgraph.type": [
// "Person"
// ]
// }
// ]
}
func ExampleTxn_Mutate_deleteNode() {
dg, cancel := getDgraphClient()
defer cancel()
// In this test we check S * * deletion.
type Person struct {
Uid string `json:"uid,omitempty"`
Name string `json:"name,omitempty"`
Age int `json:"age,omitempty"`
Married bool `json:"married,omitempty"`
Friends []*Person `json:"friends,omitempty"`
DType []string `json:"dgraph.type,omitempty"`
}
p := Person{
Uid: "_:alice",
Name: "Alice",
Age: 26,
Married: true,
DType: []string{"Person"},
Friends: []*Person{&Person{
Uid: "_:bob",
Name: "Bob",
Age: 24,
DType: []string{"Person"},
}, &Person{
Uid: "_:charlie",
Name: "Charlie",
Age: 29,
DType: []string{"Person"},
}},
}
op := &api.Operation{}
op.Schema = `
age: int .
married: bool .
friends: [uid] .
type Person {
name: string
age: int
married: bool
friends: [Person]
}
`
ctx := context.Background()
err := dg.Alter(ctx, op)
if err != nil {
log.Fatal(err)
}
mu := &api.Mutation{
CommitNow: true,
}
pb, err := json.Marshal(p)
if err != nil {
log.Fatal(err)
}
mu.SetJson = pb
response, err := dg.NewTxn().Mutate(ctx, mu)
if err != nil {
log.Fatal(err)
}
alice := response.Uids["alice"]
bob := response.Uids["bob"]
charlie := response.Uids["charlie"]
variables := make(map[string]string)
variables["$alice"] = alice
variables["$bob"] = bob
variables["$charlie"] = charlie
const q = `
query Me($alice: string, $bob: string, $charlie: string){
me(func: uid($alice)) {
name
age
married
dgraph.type
friends {
uid
name
age
dgraph.type
}
}
me2(func: uid($bob)) {
name
age
dgraph.type
}
me3(func: uid($charlie)) {
name
age
dgraph.type
}
}
`
resp, err := dg.NewTxn().QueryWithVars(ctx, q, variables)
if err != nil {
log.Fatal(err)
}
type Root struct {
Me []Person `json:"me"`
Me2 []Person `json:"me2"`
Me3 []Person `json:"me3"`
}
var r Root
err = json.Unmarshal(resp.Json, &r)
// Now lets try to delete Alice. This won't delete Bob and Charlie
// but just remove the connection between Alice and them.
// The JSON for deleting a node should be of the form {"uid": "0x123"}.
// If you wanted to delete multiple nodes you could supply an array of objects
// like [{"uid": "0x321"}, {"uid": "0x123"}] to DeleteJson.
d := map[string]string{"uid": alice}
pb, err = json.Marshal(d)
if err != nil {
log.Fatal(err)
}
mu = &api.Mutation{
CommitNow: true,
DeleteJson: pb,
}
_, err = dg.NewTxn().Mutate(ctx, mu)
if err != nil {
log.Fatal(err)
}
resp, err = dg.NewTxn().QueryWithVars(ctx, q, variables)
if err != nil {
log.Fatal(err)
}
err = json.Unmarshal(resp.Json, &r)
if err != nil {
log.Fatal(err)
}
out, _ := json.MarshalIndent(r, "", "\t")
fmt.Printf("%s\n", out)
// Output: {
// "me": [],
// "me2": [
// {
// "name": "Bob",
// "age": 24,
// "dgraph.type": [
// "Person"
// ]
// }
// ],
// "me3": [
// {
// "name": "Charlie",
// "age": 29,
// "dgraph.type": [
// "Person"
// ]
// }
// ]
// }
}
func ExampleTxn_Mutate_deletePredicate() {
dg, cancel := getDgraphClient()
defer cancel()
type Person struct {
Uid string `json:"uid,omitempty"`
Name string `json:"name,omitempty"`
Age int `json:"age,omitempty"`
Married bool `json:"married,omitempty"`
Friends []Person `json:"friends,omitempty"`
DType []string `json:"dgraph.type,omitempty"`
}
p := Person{
Uid: "_:alice",
Name: "Alice",
Age: 26,
Married: true,
DType: []string{"Person"},
Friends: []Person{Person{
Name: "Bob",
Age: 24,
DType: []string{"Person"},
}, Person{
Name: "Charlie",
Age: 29,
DType: []string{"Person"},
}},
}
op := &api.Operation{}
op.Schema = `
name: string .
age: int .
married: bool .
friends: [uid] .
type Person {
name: string
age: int
married: bool
friends: [Person]
}
`
ctx := context.Background()
err := dg.Alter(ctx, op)
if err != nil {
log.Fatal(err)
}
mu := &api.Mutation{
CommitNow: true,
}
pb, err := json.Marshal(p)
if err != nil {
log.Fatal(err)
}
mu.SetJson = pb
response, err := dg.NewTxn().Mutate(ctx, mu)
if err != nil {
log.Fatal(err)
}
alice := response.Uids["alice"]
variables := make(map[string]string)
variables["$id"] = alice
const q = `
query Me($id: string){
me(func: uid($id)) {
name
age
married
dgraph.type
friends {
uid
name
age
dgraph.type
}
}
}
`
resp, err := dg.NewTxn().QueryWithVars(ctx, q, variables)
if err != nil {
log.Fatal(err)
}
type Root struct {
Me []Person `json:"me"`
}
var r Root
err = json.Unmarshal(resp.Json, &r)
if err != nil {
log.Fatal(err)
}
op = &api.Operation{DropAttr: "friends"}
err = dg.Alter(ctx, op)
if err != nil {
log.Fatal(err)
}
op = &api.Operation{DropAttr: "married"}
err = dg.Alter(ctx, op)
if err != nil {
log.Fatal(err)
}
// Also lets run the query again to verify that predicate data was deleted.
resp, err = dg.NewTxn().QueryWithVars(ctx, q, variables)
if err != nil {
log.Fatal(err)
}
r = Root{}
err = json.Unmarshal(resp.Json, &r)
if err != nil {
log.Fatal(err)
}
// Alice should have no friends and only two attributes now.
fmt.Printf("%+v\n", r)
// Output: {Me:[{Uid: Name:Alice Age:26 Married:false Friends:[] DType:[Person]}]}
}
func ExampleTxn_Discard() {
dg, cancel := getDgraphClient()
defer cancel()
ctx, toCancel := context.WithTimeout(context.Background(), 30*time.Second)
defer toCancel()
err := dg.Alter(ctx, &api.Operation{
DropAll: true,
})
if err != nil {
log.Fatal("The drop all operation should have succeeded")
}
err = dg.Alter(ctx, &api.Operation{
Schema: `name: string @index(exact) .`,
})
if err != nil {
log.Fatal("The alter should have succeeded")
}
txn := dg.NewTxn()
_, err = txn.Mutate(ctx, &api.Mutation{
SetNquads: []byte(`_:a <name> "Alice" .`),
})
if err != nil {
log.Fatal("The mutation should have succeeded")
}
txn.Discard(ctx)
// now query the cluster and make sure that the data has made no effect
queryTxn := dg.NewReadOnlyTxn()
query := `
{
q (func: eq(name, "Alice")) {
name
dgraph.type
}
}
`
resp, err := queryTxn.Query(ctx, query)
if err != nil {
log.Fatal("The query should have succeeded")
}
fmt.Printf(string(resp.Json))
// Output: {"q":[]}
}
func ExampleTxn_Mutate_upsert() {
dg, cancel := getDgraphClient()
defer cancel()
ctx, toCancel := context.WithTimeout(context.Background(), 30*time.Second)
defer toCancel()
// Warn: Cleaning up the database
if err := dg.Alter(ctx, &api.Operation{DropAll: true}); err != nil {
log.Fatal("The drop all operation should have succeeded")
}
op := &api.Operation{}
op.Schema = `
name: string .
email: string @index(exact) .`
if err := dg.Alter(ctx, op); err != nil {
log.Fatal(err)
}
m1 := `
_:n1 <name> "user" .
_:n1 <email> "user@dgraphO.io" .
`
mu := &api.Mutation{
SetNquads: []byte(m1),
CommitNow: true,
}
if _, err := dg.NewTxn().Mutate(ctx, mu); err != nil {
log.Fatal(err)
}
req := &api.Request{CommitNow: true}
req.Query = `
query {
me(func: eq(email, "user@dgraphO.io")) {
v as uid
}
}
`
m2 := `uid(v) <email> "user@dgraph.io" .`
mu.SetNquads = []byte(m2)
req.Mutations = []*api.Mutation{mu}
// Update email only if matching uid found.
if _, err := dg.NewTxn().Do(ctx, req); err != nil {
log.Fatal(err)
}
query := `
{
me(func: eq(email, "user@dgraph.io")) {
name
email
dgraph.type
}
}
`
resp, err := dg.NewTxn().Query(ctx, query)
if err != nil {
log.Fatal(err)
}
// resp.Json contains the updated value.
fmt.Println(string(resp.Json))
// Output: {"me":[{"name":"user","email":"user@dgraph.io"}]}
}
func ExampleTxn_Mutate_upsertJSON() {
dg, cancel := getDgraphClient()
defer cancel()
// Warn: Cleaning up the database
ctx := context.Background()
if err := dg.Alter(ctx, &api.Operation{DropAll: true}); err != nil {
log.Fatal(err)
}
type Person struct {
Uid string `json:"uid,omitempty"`
Name string `json:"name,omitempty"`
Age int `json:"age,omitempty"`
Email string `json:"email,omitempty"`
Friends []Person `json:"friends,omitempty"`
DType []string `json:"dgraph.type,omitempty"`
}
op := &api.Operation{Schema: `email: string @index(exact) @upsert .`}
if err := dg.Alter(context.Background(), op); err != nil {
log.Fatal(err)
}
// Create and query the user using Upsert block
req := &api.Request{CommitNow: true}
req.Query = `
{
me(func: eq(email, "user@dgraph.io")) {
...fragmentA
}
}
fragment fragmentA {
v as uid
}
`
pb, err := json.Marshal(Person{Uid: "uid(v)", Name: "Wrong", Email: "user@dgraph.io"})
if err != nil {
log.Fatal(err)
}
mu := &api.Mutation{SetJson: pb}
req.Mutations = []*api.Mutation{mu}
if _, err := dg.NewTxn().Do(ctx, req); err != nil {
log.Fatal(err)
}
// Fix the name and add age
pb, err = json.Marshal(Person{Uid: "uid(v)", Name: "user", Age: 35})
if err != nil {
log.Fatal(err)
}
mu.SetJson = pb
req.Mutations = []*api.Mutation{mu}
if _, err := dg.NewTxn().Do(ctx, req); err != nil {
log.Fatal(err)
}
q := `
{
Me(func: has(email)) {
age
name
email
dgraph.type
}
}
`
resp, err := dg.NewReadOnlyTxn().Query(ctx, q)
if err != nil {
log.Fatal("The query should have succeeded")
}
type Root struct {
Me []Person `json:"me"`
}
var r Root
if err := json.Unmarshal(resp.Json, &r); err != nil {
log.Fatal(err)
}
fmt.Println(string(resp.Json))
// Delete the user now
mu.SetJson = nil
dgo.DeleteEdges(mu, "uid(v)", "age", "name", "email")
req.Mutations = []*api.Mutation{mu}
if _, err := dg.NewTxn().Do(ctx, req); err != nil {
log.Fatal(err)
}
resp, err = dg.NewReadOnlyTxn().Query(ctx, q)
if err != nil {
log.Fatal("The query should have succeeded")
}
if err := json.Unmarshal(resp.Json, &r); err != nil {
log.Fatal(err)
}
fmt.Println(string(resp.Json))
// Output: {"Me":[{"age":35,"name":"user","email":"user@dgraph.io"}]}
// {"Me":[]}
}
1
https://gitee.com/dgchuan/dgraph-io_dgo.git
git@gitee.com:dgchuan/dgraph-io_dgo.git
dgchuan
dgraph-io_dgo
dgraph-io_dgo
master

搜索帮助