Skip to content

Commit 13d1534

Browse files
DvirDukhanswilly22
authored andcommitted
add support for path type (#53)
* add support for path type * fixed PR comments * fixed PR comments * fixed PR comments * added example * changed readme * version bump
1 parent 7a70219 commit 13d1534

File tree

6 files changed

+119
-2
lines changed

6 files changed

+119
-2
lines changed

README.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ RedisGraph python client
1616

1717
```python
1818
import redis
19-
from redisgraph import Node, Edge, Graph
19+
from redisgraph import Node, Edge, Graph, Path
2020

2121
r = redis.Redis(host='localhost', port=6379)
2222

@@ -47,6 +47,15 @@ for record in result.result_set:
4747
person_age = record[1]
4848
visit_purpose = record[2]
4949
country_name = record[3]
50+
51+
query = """MATCH p = (:person)-[:visited {purpose:"pleasure"}]->(:country) RETURN p"""
52+
53+
result = redis_graph.query(query)
54+
55+
# Iterate through resultset
56+
for record in result.result_set:
57+
path = record[0]
58+
print(path)
5059

5160

5261
# All done, remove graph.

redisgraph/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
from .node import Node
22
from .edge import Edge
33
from .graph import Graph
4+
from .path import Path

redisgraph/path.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
from .node import Node
2+
from .edge import Edge
3+
4+
class Path(object):
5+
6+
def __init__(self, nodes, edges):
7+
assert(isinstance(nodes, list) and isinstance(edges, list))
8+
self.nodes = nodes
9+
self.edges = edges
10+
self.append_type = Node
11+
12+
@classmethod
13+
def new_empty_path(cls):
14+
return cls([], [])
15+
16+
def nodes(self):
17+
return self.nodes
18+
19+
def edges(self):
20+
return self.edges
21+
22+
def get_node(self, index):
23+
return self.nodes[index]
24+
25+
def get_relationship(self, index):
26+
return self.edges[index]
27+
28+
def first_node(self):
29+
return self.nodes[0]
30+
31+
def last_node(self):
32+
return self.nodes[-1]
33+
34+
def edge_count(self):
35+
return len(self.edges)
36+
37+
def nodes_count(self):
38+
return len(self.nodes)
39+
40+
def add_node(self, node):
41+
assert(type(node) == self.append_type)
42+
self.nodes.append(node)
43+
self.append_type = Edge
44+
return self
45+
46+
def add_edge(self, edge):
47+
assert(type(edge) == self.append_type)
48+
self.edges.append(edge)
49+
self.append_type = Node
50+
return self
51+
52+
def __eq__(self, other):
53+
return self.nodes == other.nodes and self.edges == other.edges
54+
55+
def __str__(self):
56+
res = "<"
57+
edge_count = self.edge_count()
58+
for i in range(0, edge_count):
59+
node_id = self.get_node(i).id
60+
res += "(" + str(node_id) + ")"
61+
edge = self.get_relationship(i)
62+
res += "-[" + str(int(edge.id)) + "]->" if edge.src_node == node_id else "<-[" + str(int(edge.id)) + "]-"
63+
node_id = self.get_node(edge_count).id
64+
res += "(" + str(node_id) + ")"
65+
res += ">"
66+
return res
67+

redisgraph/query_result.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from .node import Node
22
from .edge import Edge
3+
from .path import Path
34
from prettytable import PrettyTable
45
from redis import ResponseError
56

@@ -21,6 +22,7 @@ class ResultSetScalarTypes(object):
2122
VALUE_ARRAY = 6
2223
VALUE_EDGE = 7
2324
VALUE_NODE = 8
25+
VALUE_PATH = 9
2426

2527
class QueryResult(object):
2628
LABELS_ADDED = 'Labels added'
@@ -124,6 +126,11 @@ def parse_edge(self, cell):
124126
properties = self.parse_entity_properties(cell[4])
125127
return Edge(src_node_id, relation, dest_node_id, edge_id=edge_id, properties=properties)
126128

129+
def parse_path(self, cell):
130+
nodes = self.parse_scalar(cell[0])
131+
edges = self.parse_scalar(cell[1])
132+
return Path(nodes, edges)
133+
127134
def parse_scalar(self, cell):
128135
scalar_type = int(cell[0])
129136
value = cell[1]
@@ -162,6 +169,9 @@ def parse_scalar(self, cell):
162169
elif scalar_type == ResultSetScalarTypes.VALUE_EDGE:
163170
scalar = self.parse_edge(value)
164171

172+
elif scalar_type == ResultSetScalarTypes.VALUE_PATH:
173+
scalar = self.parse_path(value)
174+
165175
elif scalar_type == ResultSetScalarTypes.VALUE_UNKNOWN:
166176
print("Unknown scalar type\n")
167177

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from setuptools import setup, find_packages
22
setup(
33
name='redisgraph',
4-
version='2.0',
4+
version='2.1',
55

66
description='RedisGraph Python Client',
77
url='https://github.com/redislabs/redisgraph-py',

test.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,5 +65,35 @@ def test_array_functions(self):
6565
# All done, remove graph.
6666
redis_graph.delete()
6767

68+
69+
def test_path(self):
70+
redis_graph = Graph('social', self.r)
71+
72+
node0 = Node(node_id=0, label="L1")
73+
node1 = Node(node_id=1, label="L1")
74+
node2 = Node(node_id=2, label="L1")
75+
edge01 = Edge(node0, "R1", node1, edge_id=0, properties={'value': 1})
76+
edge12 = Edge(node1, "R1", node2, edge_id=1, properties={'value': 2})
77+
78+
redis_graph.add_node(node0)
79+
redis_graph.add_node(node1)
80+
redis_graph.add_node(node2)
81+
redis_graph.add_edge(edge01)
82+
redis_graph.add_edge(edge12)
83+
84+
redis_graph.flush()
85+
86+
path01 = Path.new_empty_path().add_node(node0).add_edge(edge01).add_node(node1)
87+
path12 = Path.new_empty_path().add_node(node1).add_edge(edge12).add_node(node2)
88+
expected_results = [[path01], [path12]]
89+
90+
query = "MATCH p=(:L1)-[:R1]->(:L1) RETURN p"
91+
result = redis_graph.query(query)
92+
self.assertEqual(expected_results, result.result_set)
93+
94+
# All done, remove graph.
95+
redis_graph.delete()
96+
97+
6898
if __name__ == '__main__':
6999
unittest.main()

0 commit comments

Comments
 (0)