Skip to content

Commit 3b0ad09

Browse files
authored
Merge pull request #62 from RedisGraph/multi-label
multi label api change
2 parents f86cee7 + 69b85d1 commit 3b0ad09

File tree

7 files changed

+112
-70
lines changed

7 files changed

+112
-70
lines changed

client_test.go

+57-31
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ func createGraph() {
1616
graph = GraphNew("social", conn)
1717

1818
// Create 2 nodes connect via a single edge.
19-
japan := NodeNew("Country", "j", nil)
20-
john := NodeNew("Person", "p", nil)
19+
japan := NodeNew([]string{"Country"}, "j", nil)
20+
john := NodeNew([]string{"Person"}, "p", nil)
2121
edge := EdgeNew("Visited", john, japan, nil)
2222

2323
// Set node properties.
@@ -91,9 +91,9 @@ func checkQueryResults(t *testing.T, res *QueryResult) {
9191
d, ok := r.GetByIndex(2).(*Node)
9292
assert.True(t, ok, "Third column should contain nodes.")
9393

94-
assert.Equal(t, s.Label, "Person", "Node should be of type 'Person'")
94+
assert.Equal(t, s.Labels[0], "Person", "Node should be of type 'Person'")
9595
assert.Equal(t, e.Relation, "Visited", "Edge should be of relation type 'Visited'")
96-
assert.Equal(t, d.Label, "Country", "Node should be of type 'Country'")
96+
assert.Equal(t, d.Labels[0], "Country", "Node should be of type 'Country'")
9797

9898
assert.Equal(t, len(s.Properties), 4, "Person node should have 4 properties")
9999

@@ -131,7 +131,7 @@ func TestCreateQuery(t *testing.T) {
131131
res.Next()
132132
r := res.Record()
133133
w := r.GetByIndex(0).(*Node)
134-
assert.Equal(t, w.Label, "WorkPlace", "Unexpected node label.")
134+
assert.Equal(t, w.Labels[0], "WorkPlace", "Unexpected node label.")
135135
}
136136

137137
func TestCreateROQueryFailure(t *testing.T) {
@@ -199,8 +199,8 @@ func TestArray(t *testing.T) {
199199
t.Error(err)
200200
}
201201

202-
a := NodeNew("person", "", nil)
203-
b := NodeNew("person", "", nil)
202+
a := NodeNew([]string{"person"}, "", nil)
203+
b := NodeNew([]string{"person"}, "", nil)
204204

205205
a.SetProperty("name", "a")
206206
a.SetProperty("age", 32)
@@ -288,9 +288,9 @@ func TestPath(t *testing.T) {
288288
e := p.GetEdge(0)
289289
d := p.LastNode()
290290

291-
assert.Equal(t, s.Label, "Person", "Node should be of type 'Person'")
291+
assert.Equal(t, s.Labels[0], "Person", "Node should be of type 'Person'")
292292
assert.Equal(t, e.Relation, "Visited", "Edge should be of relation type 'Visited'")
293-
assert.Equal(t, d.Label, "Country", "Node should be of type 'Country'")
293+
assert.Equal(t, d.Labels[0], "Country", "Node should be of type 'Country'")
294294

295295
assert.Equal(t, len(s.Properties), 4, "Person node should have 4 properties")
296296

@@ -308,12 +308,12 @@ func TestPath(t *testing.T) {
308308

309309
func TestParameterizedQuery(t *testing.T) {
310310
createGraph()
311-
params := []interface{}{1, 2.3, "str", true, false, nil, []interface {}{0, 1, 2}, []interface {}{"0", "1", "2"}}
311+
params := []interface{}{1, 2.3, "str", true, false, nil, []interface{}{0, 1, 2}, []interface{}{"0", "1", "2"}}
312312
q := "RETURN $param"
313313
params_map := make(map[string]interface{})
314314
for index, param := range params {
315315
params_map["param"] = param
316-
res, err := graph.ParameterizedQuery(q, params_map);
316+
res, err := graph.ParameterizedQuery(q, params_map)
317317
if err != nil {
318318
t.Error(err)
319319
}
@@ -348,24 +348,24 @@ func TestCreateIndex(t *testing.T) {
348348
func TestQueryStatistics(t *testing.T) {
349349
graph.Flush()
350350
err := graph.Delete()
351-
assert.Nil(t,err)
351+
assert.Nil(t, err)
352352

353353
q := "CREATE (:Person{name:'a',age:32,array:[0,1,2]})"
354354
res, err := graph.Query(q)
355-
assert.Nil(t,err)
355+
assert.Nil(t, err)
356356

357357
assert.Equal(t, 1, res.NodesCreated(), "Expecting 1 node created")
358358
assert.Equal(t, 0, res.NodesDeleted(), "Expecting 0 nodes deleted")
359-
assert.Greater(t, res.InternalExecutionTime(),0.0, "Expecting internal execution time not to be 0.0")
359+
assert.Greater(t, res.InternalExecutionTime(), 0.0, "Expecting internal execution time not to be 0.0")
360360
assert.Equal(t, true, res.Empty(), "Expecting empty resultset")
361361

362-
res,err = graph.Query("MATCH (n) DELETE n")
363-
assert.Nil(t,err)
362+
res, err = graph.Query("MATCH (n) DELETE n")
363+
assert.Nil(t, err)
364364
assert.Equal(t, 1, res.NodesDeleted(), "Expecting 1 nodes deleted")
365365

366366
// Create 2 nodes connect via a single edge.
367-
japan := NodeNew("Country", "j", nil)
368-
john := NodeNew("Person", "p", nil)
367+
japan := NodeNew([]string{"Country"}, "j", nil)
368+
john := NodeNew([]string{"Person"}, "p", nil)
369369
edge := EdgeNew("Visited", john, japan, nil)
370370

371371
// Set node properties.
@@ -386,21 +386,21 @@ func TestQueryStatistics(t *testing.T) {
386386

387387
// Flush graph to DB.
388388
res, err = graph.Commit()
389-
assert.Nil(t,err)
389+
assert.Nil(t, err)
390390
assert.Equal(t, 2, res.NodesCreated(), "Expecting 2 node created")
391391
assert.Equal(t, 0, res.NodesDeleted(), "Expecting 0 nodes deleted")
392392
assert.Equal(t, 7, res.PropertiesSet(), "Expecting 7 properties set")
393393
assert.Equal(t, 1, res.RelationshipsCreated(), "Expecting 1 relationships created")
394394
assert.Equal(t, 0, res.RelationshipsDeleted(), "Expecting 0 relationships deleted")
395-
assert.Greater(t, res.InternalExecutionTime(),0.0, "Expecting internal execution time not to be 0.0")
395+
assert.Greater(t, res.InternalExecutionTime(), 0.0, "Expecting internal execution time not to be 0.0")
396396
assert.Equal(t, true, res.Empty(), "Expecting empty resultset")
397397
q = "MATCH p = (:Person)-[:Visited]->(:Country) RETURN p"
398398
res, err = graph.Query(q)
399-
assert.Nil(t,err)
399+
assert.Nil(t, err)
400400
assert.Equal(t, len(res.results), 1, "expecting 1 result record")
401401
assert.Equal(t, false, res.Empty(), "Expecting resultset to have records")
402-
res,err = graph.Query("MATCH ()-[r]-() DELETE r")
403-
assert.Nil(t,err)
402+
res, err = graph.Query("MATCH ()-[r]-() DELETE r")
403+
assert.Nil(t, err)
404404
assert.Equal(t, 1, res.RelationshipsDeleted(), "Expecting 1 relationships deleted")
405405
}
406406

@@ -410,39 +410,65 @@ func TestUtils(t *testing.T) {
410410

411411
res = ToString("test_string")
412412
assert.Equal(t, res, "\"test_string\"")
413-
413+
414414
res = ToString(10)
415-
assert.Equal(t, res, "10")
415+
assert.Equal(t, res, "10")
416416

417417
res = ToString(1.2)
418418
assert.Equal(t, res, "1.2")
419419

420420
res = ToString(true)
421421
assert.Equal(t, res, "true")
422422

423-
var arr = []interface{}{1,2,3,"boom"}
423+
var arr = []interface{}{1, 2, 3, "boom"}
424424
res = ToString(arr)
425425
assert.Equal(t, res, "[1,2,3,\"boom\"]")
426-
426+
427427
jsonMap := make(map[string]interface{})
428-
jsonMap["object"] = map[string]interface{} {"foo": 1}
428+
jsonMap["object"] = map[string]interface{}{"foo": 1}
429429
res = ToString(jsonMap)
430430
assert.Equal(t, res, "{object: {foo: 1}}")
431431
}
432432

433+
func TestMultiLabelNode(t *testing.T) {
434+
// clear database
435+
graph.Flush()
436+
err := graph.Delete()
437+
assert.Nil(t, err)
438+
439+
// create a multi label node
440+
multiLabelNode := NodeNew([]string{"A","B"}, "n", nil)
441+
graph.AddNode(multiLabelNode)
442+
_, err = graph.Commit()
443+
assert.Nil(t, err)
444+
445+
// fetch node
446+
res, err := graph.Query("MATCH (n) RETURN n")
447+
assert.Nil(t, err)
448+
449+
res.Next()
450+
r := res.Record()
451+
n := r.GetByIndex(0).(*Node)
452+
453+
// expecting 2 labels
454+
assert.Equal(t, len(n.Labels), 2, "expecting 2 labels")
455+
assert.Equal(t, n.Labels[0], "A")
456+
assert.Equal(t, n.Labels[1], "B")
457+
}
458+
433459
func TestNodeMapDatatype(t *testing.T) {
434460
graph.Flush()
435461
err := graph.Delete()
436462
assert.Nil(t, err)
437463

438464
// Create 2 nodes connect via a single edge.
439-
japan := NodeNew("Country", "j",
465+
japan := NodeNew([]string{"Country"}, "j",
440466
map[string]interface{}{
441467
"name": "Japan",
442468
"population": 126800000,
443469
"states": []string{"Kanto", "Chugoku"},
444470
})
445-
john := NodeNew("Person", "p",
471+
john := NodeNew([]string{"Person"}, "p",
446472
map[string]interface{}{
447473
"name": "John Doe",
448474
"age": 33,
@@ -488,7 +514,7 @@ func TestTimeout(t *testing.T) {
488514

489515
params := make(map[string]interface{})
490516
params["ub"] = 1000000
491-
res, err = graph.ParameterizedQueryWithOptions("UNWIND range(0, $ub) AS v RETURN v", params, options);
517+
res, err = graph.ParameterizedQueryWithOptions("UNWIND range(0, $ub) AS v RETURN v", params, options)
492518
assert.Nil(t, res)
493519
assert.NotNil(t, err)
494520
}

edge.go

+7
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ type Edge struct {
1717
graph *Graph
1818
}
1919

20+
// EdgeNew create a new Edge
2021
func EdgeNew(relation string, srcNode *Node, destNode *Node, properties map[string]interface{}) *Edge {
2122
p := properties
2223
if p == nil {
@@ -32,15 +33,18 @@ func EdgeNew(relation string, srcNode *Node, destNode *Node, properties map[stri
3233
}
3334
}
3435

36+
// SetProperty assign a new property to edge
3537
func (e *Edge) SetProperty(key string, value interface{}) {
3638
e.Properties[key] = value
3739
}
3840

41+
// GetProperty retrieves property from edge
3942
func (e *Edge) GetProperty(key string) interface{} {
4043
v, _ := e.Properties[key]
4144
return v
4245
}
4346

47+
// SourceNodeID returns edge source node ID
4448
func (e Edge) SourceNodeID() uint64 {
4549
if e.Source != nil {
4650
return e.Source.ID
@@ -49,6 +53,7 @@ func (e Edge) SourceNodeID() uint64 {
4953
}
5054
}
5155

56+
// DestNodeID returns edge destination node ID
5257
func (e Edge) DestNodeID() uint64 {
5358
if e.Source != nil {
5459
return e.Destination.ID
@@ -57,6 +62,7 @@ func (e Edge) DestNodeID() uint64 {
5762
}
5863
}
5964

65+
// Returns a string representation of edge
6066
func (e Edge) String() string {
6167
if len(e.Properties) == 0 {
6268
return "{}"
@@ -71,6 +77,7 @@ func (e Edge) String() string {
7177
return s
7278
}
7379

80+
// Encode makes Edge satisfy the Stringer interface
7481
func (e Edge) Encode() string {
7582
s := []string{"(", e.Source.Alias, ")"}
7683

example_graph_test.go

+6-5
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ import (
44
"crypto/tls"
55
"crypto/x509"
66
"fmt"
7-
"github.com/RedisGraph/redisgraph-go"
8-
"github.com/gomodule/redigo/redis"
97
"io/ioutil"
108
"log"
119
"os"
10+
11+
"github.com/RedisGraph/redisgraph-go"
12+
"github.com/gomodule/redigo/redis"
1213
)
1314

1415
func ExampleGraphNew() {
@@ -22,7 +23,7 @@ func ExampleGraphNew() {
2223
res.Next()
2324
r := res.Record()
2425
w := r.GetByIndex(0).(*redisgraph.Node)
25-
fmt.Println(w.Label)
26+
fmt.Println(w.Labels[0])
2627
// Output: WorkPlace
2728
}
2829

@@ -40,7 +41,7 @@ func ExampleGraphNew_pool() {
4041
res.Next()
4142
r := res.Record()
4243
w := r.GetByIndex(0).(*redisgraph.Node)
43-
fmt.Println(w.Label)
44+
fmt.Println(w.Labels[0])
4445
// Output: WorkPlace
4546

4647
}
@@ -103,7 +104,7 @@ func ExampleGraphNew_tls() {
103104
res.Next()
104105
r := res.Record()
105106
w := r.GetByIndex(0).(*redisgraph.Node)
106-
fmt.Println(w.Label)
107+
fmt.Println(w.Labels[0])
107108
}
108109

109110
func getConnectionDetails() (host string, password string) {

examples/redisgraph_tls_client/redisgraph_tls_client.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@ import (
55
"crypto/x509"
66
"flag"
77
"fmt"
8-
"github.com/RedisGraph/redisgraph-go"
9-
"github.com/gomodule/redigo/redis"
108
"io/ioutil"
119
"log"
1210
"os"
11+
12+
"github.com/RedisGraph/redisgraph-go"
13+
"github.com/gomodule/redigo/redis"
1314
)
1415

1516
var (
@@ -85,6 +86,6 @@ func main() {
8586
res.Next()
8687
r := res.Record()
8788
w := r.GetByIndex(0).(*redisgraph.Node)
88-
fmt.Println(w.Label)
89+
fmt.Println(w.Labels[0])
8990
// Output: WorkPlace
9091
}

graph.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,12 @@ func (g *Graph) ExecutionPlan(q string) (string, error) {
7575
// Delete removes the graph.
7676
func (g *Graph) Delete() error {
7777
_, err := g.Conn.Do("GRAPH.DELETE", g.Id)
78+
79+
// clear internal mappings
80+
g.labels = g.labels[:0]
81+
g.properties = g.properties[:0]
82+
g.relationshipTypes = g.relationshipTypes[:0]
83+
7884
return err
7985
}
8086

@@ -266,7 +272,7 @@ func (g *Graph) CallProcedure(procedure string, yield []string, args ...interfac
266272
}
267273
q += fmt.Sprintf("%s)", strings.Join(tmp, ","))
268274

269-
if yield != nil && len(yield) > 0 {
275+
if len(yield) > 0 {
270276
q += fmt.Sprintf(" YIELD %s", strings.Join(yield, ","))
271277
}
272278

0 commit comments

Comments
 (0)