Skip to content

Commit 8053523

Browse files
committed
retrieve node neighbours
1 parent 32f1270 commit 8053523

File tree

5 files changed

+138
-27
lines changed

5 files changed

+138
-27
lines changed

src/main/java/com/redislabs/redisgraph/Client.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import java.util.ArrayList;
77
import java.util.HashMap;
88
import java.util.List;
9-
import java.util.Map;
109

1110
public class Client {
1211
private JedisPool pool;
@@ -133,6 +132,24 @@ public HashMap<String, String> getEdge(String graphId, String id) {
133132
return attributes;
134133
}
135134

135+
public List<String> getNeighbours(String graphId, String nodeId, String edgeType, int direction) {
136+
Jedis conn = _conn();
137+
List<String> args = new ArrayList<String>(4);
138+
args.add(graphId);
139+
args.add(nodeId);
140+
args.add(edgeType);
141+
args.add(String.valueOf(direction));
142+
143+
String[] stringArgs = args.toArray(new String[args.size()]);
144+
145+
List<String> neighbours = conn.getClient()
146+
.sendCommand(Commands.Command.GETNEIGHBOURS, stringArgs)
147+
.getMultiBulkReply();
148+
149+
return neighbours;
150+
}
151+
152+
136153
public ResultSet query(String graphId, String query) {
137154
Jedis conn = _conn();
138155

@@ -142,4 +159,9 @@ public ResultSet query(String graphId, String query) {
142159

143160
return new ResultSet(resp);
144161
}
162+
163+
public boolean setProperty(String elementId, String key, Object value) {
164+
Jedis conn = _conn();
165+
return conn.hset(elementId, key, value.toString()) == 1;
166+
}
145167
}

src/main/java/com/redislabs/redisgraph/Commands.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public enum Command implements ProtocolCommand {
99
ADDEDGE("graph.ADDEDGE"),
1010
GETEDGE("graph.GETEDGE"),
1111
GETNODE("graph.GETNODE"),
12+
GETNEIGHBOURS("graph.GETNEIGHBOURS"),
1213
REMOVEEDGE("graph.REMOVEEDGE"),
1314
DELETEGRAPH("graph.DELETE"),
1415
QUERY("graph.QUERY");

src/main/java/com/redislabs/redisgraph/RedisGraphAPI.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.redislabs.redisgraph;
22

3+
import java.util.ArrayList;
34
import java.util.HashMap;
5+
import java.util.List;
46
import java.util.Map;
57

68
public class RedisGraphAPI {
@@ -49,7 +51,7 @@ public RedisNode getNode(String id) {
4951
return new RedisNode(id, label, attributes);
5052
}
5153

52-
public RedisEdge getEdge(String id) {
54+
public RedisEdge getEdge(String id) {
5355
HashMap<String, String> attributes = client.getEdge(this.graphId, id);
5456
String edgeId = attributes.get("id");
5557
String relation = attributes.get("type");
@@ -67,8 +69,19 @@ public RedisEdge getEdge(String id) {
6769
return new RedisEdge(edgeId, srcNode, destNode, relation, attributes);
6870
}
6971

72+
public List<RedisNode> getNeighbours(String nodeId, String edgeType, int direction) {
73+
List<String> nodeIds = client.getNeighbours(this.graphId, nodeId, edgeType, direction);
74+
ArrayList<RedisNode> nodes = new ArrayList<RedisNode>();
75+
76+
for(String id: nodeIds) {
77+
nodes.add(getNode(id));
78+
}
79+
80+
return nodes;
81+
}
82+
7083
public RedisEdge connectNodes(RedisNode src, String relation, RedisNode dest, Object... attributes) {
71-
String edgeId = client.connectNodes(this.graphId, src.id, relation, dest.id, attributes);
84+
String edgeId = client.connectNodes(this.graphId, src.getId(), relation, dest.getId(), attributes);
7285
HashMap<String, String> attr = new HashMap<String, String>();
7386

7487
for(int i = 0; i < attributes.length; i+=2) {
@@ -83,4 +96,8 @@ public RedisEdge connectNodes(RedisNode src, String relation, RedisNode dest, Ob
8396
public ResultSet query(String query) {
8497
return client.query(this.graphId, query);
8598
}
99+
100+
public boolean setProperty(String elementId, String key, Object value) {
101+
return client.setProperty(elementId, key, value);
102+
}
86103
}

src/main/java/com/redislabs/redisgraph/RedisNode.java

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55
import java.util.Map;
66

77
public class RedisNode {
8-
String id;
9-
String label;
10-
Map<String, String> attributes;
8+
private String id;
9+
private String label;
10+
private Map<String, String> attributes;
1111

12-
List<RedisEdge> incomingEdges;
13-
List<RedisEdge> outgoingEdges;
12+
private List<RedisEdge> incomingEdges;
13+
private List<RedisEdge> outgoingEdges;
1414

1515
public RedisNode(String id, String label, Map<String, String> attributes) {
1616
this.id = id;
@@ -20,7 +20,23 @@ public RedisNode(String id, String label, Map<String, String> attributes) {
2020
this.outgoingEdges = new ArrayList<RedisEdge>();
2121
}
2222

23-
public String getId(){
24-
return this.id;
23+
public String getId() {
24+
return id;
25+
}
26+
27+
public String getLabel() {
28+
return label;
29+
}
30+
31+
public Map<String, String> getAttributes() {
32+
return attributes;
33+
}
34+
35+
public List<RedisEdge> getIncomingEdges() {
36+
return incomingEdges;
37+
}
38+
39+
public List<RedisEdge> getOutgoingEdges() {
40+
return outgoingEdges;
2541
}
2642
}

src/test/java/com/redislabs/redisgraph/RedisGraphAPITest.java

Lines changed: 72 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.redislabs.redisgraph;
22
import org.junit.Assert;
33

4+
import java.util.List;
5+
46
public class RedisGraphAPITest {
57
@org.testng.annotations.Test
68
public void testCreateNode() throws Exception {
@@ -10,10 +12,10 @@ public void testCreateNode() throws Exception {
1012
RedisNode node = api.createNode("name", "roi", "age", 32);
1113

1214
// Validate node
13-
Assert.assertNotNull(node.id);
14-
Assert.assertSame(node.attributes.get("name"), "roi");
15-
Assert.assertSame(Integer.parseInt(node.attributes.get("age")), 32);
16-
Assert.assertSame(node.attributes.size(),2);
15+
Assert.assertNotNull(node.getId());
16+
Assert.assertSame(node.getAttributes().get("name"), "roi");
17+
Assert.assertSame(Integer.parseInt(node.getAttributes().get("age")), 32);
18+
Assert.assertSame(node.getAttributes().size(),2);
1719
}
1820

1921
@org.testng.annotations.Test
@@ -24,11 +26,11 @@ public void testCreateLabeledNode() throws Exception {
2426
RedisNode node = api.createLabeledNode("human","name", "roi", "age", 32);
2527

2628
// Validate node
27-
Assert.assertNotNull(node.id);
28-
Assert.assertSame(node.label, "human");
29-
Assert.assertSame(node.attributes.get("name"), "roi");
30-
Assert.assertSame(Integer.parseInt(node.attributes.get("age")), 32);
31-
Assert.assertSame(node.attributes.size(),2);
29+
Assert.assertNotNull(node.getId());
30+
Assert.assertSame(node.getLabel(), "human");
31+
Assert.assertSame(node.getAttributes().get("name"), "roi");
32+
Assert.assertSame(Integer.parseInt(node.getAttributes().get("age")), 32);
33+
Assert.assertSame(node.getAttributes().size(),2);
3234
}
3335

3436
@org.testng.annotations.Test
@@ -81,15 +83,15 @@ public void testGetNode() throws Exception {
8183
RedisNode node = api.createLabeledNode("human","name", "shany", "age", 23);
8284

8385
// Get node
84-
RedisNode retrievedNode = api.getNode(node.id);
86+
RedisNode retrievedNode = api.getNode(node.getId());
8587

8688
// Expecting a single result
8789
Assert.assertNotNull(retrievedNode);
88-
Assert.assertEquals(node.id, retrievedNode.id);
89-
Assert.assertEquals(node.label, retrievedNode.label);
90-
Assert.assertEquals(retrievedNode.attributes.size(), 2);
91-
Assert.assertEquals(retrievedNode.attributes.get("name"), "shany");
92-
Assert.assertEquals(Integer.parseInt(retrievedNode.attributes.get("age")), 23);
90+
Assert.assertEquals(node.getId(), retrievedNode.getId());
91+
Assert.assertEquals(node.getLabel(), retrievedNode.getLabel());
92+
Assert.assertEquals(retrievedNode.getAttributes().size(), 2);
93+
Assert.assertEquals(retrievedNode.getAttributes().get("name"), "shany");
94+
Assert.assertEquals(Integer.parseInt(retrievedNode.getAttributes().get("age")), 23);
9395
}
9496

9597
@org.testng.annotations.Test
@@ -114,8 +116,61 @@ public void testGetEdge() throws Exception {
114116
Assert.assertEquals(retrievedEdge.getAttributes().get("strength"), "3");
115117
Assert.assertEquals(retrievedEdge.getAttributes().get("from"), "high-school");
116118

117-
Assert.assertEquals(retrievedEdge.getSrc().id, src.id);
118-
Assert.assertEquals(retrievedEdge.getDest().id, dest.id);
119+
Assert.assertEquals(retrievedEdge.getSrc().getId(), src.getId());
120+
Assert.assertEquals(retrievedEdge.getDest().getId(), dest.getId());
121+
}
122+
123+
@org.testng.annotations.Test
124+
public void testSetProperty() throws Exception {
125+
RedisGraphAPI api = new RedisGraphAPI("social");
126+
127+
// Create a node
128+
RedisNode node = api.createNode("name", "shimshon", "age", 60);
129+
api.setProperty(node.getId(), "age", 61);
130+
131+
node = api.getNode(node.getId());
132+
133+
// Validate node
134+
Assert.assertSame(Integer.parseInt(node.getAttributes().get("age")), 61);
135+
}
136+
137+
@org.testng.annotations.Test
138+
public void testGetNeighbours() throws Exception {
139+
RedisGraphAPI api = new RedisGraphAPI("social");
140+
141+
// Create both source and destination nodes
142+
RedisNode roi = api.createNode("name", "roi", "age", 32);
143+
RedisNode amit = api.createNode("name", "amit", "age", 30);
144+
RedisNode shany = api.createNode("name", "shany", "age", 23);
145+
146+
// Connect source and destination nodes.
147+
api.connectNodes(roi, "knows", amit);
148+
api.connectNodes(roi, "knows", shany);
149+
api.connectNodes(amit, "knows", roi);
150+
api.connectNodes(shany, "knows", roi);
151+
152+
int DIR_OUT = 0;
153+
int DIR_IN = 1;
154+
int DIR_BOTH = 2;
155+
156+
List<RedisNode> neighbours;
157+
neighbours = api.getNeighbours(roi.getId(), "knows", DIR_OUT);
158+
Assert.assertEquals(neighbours.size(), 2);
159+
160+
neighbours = api.getNeighbours(roi.getId(), "knows", DIR_IN);
161+
Assert.assertEquals(neighbours.size(), 2);
162+
163+
neighbours = api.getNeighbours(roi.getId(), "knows", DIR_BOTH);
164+
Assert.assertEquals(neighbours.size(), 4);
165+
166+
neighbours = api.getNeighbours(amit.getId(), "knows", DIR_OUT);
167+
Assert.assertEquals(neighbours.size(), 1);
168+
169+
neighbours = api.getNeighbours(amit.getId(), "knows", DIR_IN);
170+
Assert.assertEquals(neighbours.size(), 1);
171+
172+
neighbours = api.getNeighbours(amit.getId(), "knows", DIR_BOTH);
173+
Assert.assertEquals(neighbours.size(), 2);
119174

120175
}
121176
}

0 commit comments

Comments
 (0)