-
Notifications
You must be signed in to change notification settings - Fork 850
Expand file tree
/
Copy pathgraph.py
More file actions
134 lines (103 loc) · 4.14 KB
/
graph.py
File metadata and controls
134 lines (103 loc) · 4.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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.
#
__author__ = 'Marko A. Rodriguez (http://markorodriguez.com)'
class Graph(object):
def __init__(self):
self.vertices = {}
self.edges = {}
def __repr__(self):
return "graph[]"
class Element(object):
def __init__(self, id, label, properties=None):
self.id = id
self.label = label
self.properties = [] if properties is None else properties
def __getitem__(self, key):
for p in self.properties:
if p.key == key:
return p.value
raise KeyError(key)
def values(self, *property_keys):
if len(property_keys) == 0:
return [p.value for p in self.properties]
else:
return [p.value for p in self.properties if p.key in property_keys]
def __eq__(self, other):
return isinstance(other, self.__class__) and self.id == other.id
def __hash__(self):
return hash(self.id)
class Vertex(Element):
def __init__(self, id, label="vertex", properties=None):
Element.__init__(self, id, label, properties)
def __repr__(self):
return "v[" + str(self.id) + "]"
class Edge(Element):
def __init__(self, id, outV, label, inV, properties=None):
Element.__init__(self, id, label, properties)
self.outV = outV
self.inV = inV
def __repr__(self):
return "e[" + str(self.id) + "][" + str(self.outV.id) + "-" + self.label + "->" + str(self.inV.id) + "]"
class VertexProperty(Element):
def __init__(self, id, label, value, vertex, properties=None):
Element.__init__(self, id, label, properties)
self.value = value
self.key = self.label
self.vertex = vertex
def __repr__(self):
return "vp[" + str(self.label) + "->" + str(self.value)[0:20] + "]"
class Property(object):
def __init__(self, key, value, element):
self.key = key
self.value = value
self.element = element
def __repr__(self):
return "p[" + str(self.key) + "->" + str(self.value)[0:20] + "]"
def __eq__(self, other):
return isinstance(other, self.__class__) and \
self.key == other.key and \
self.value == other.value and \
self.element == other.element
def __hash__(self):
return hash(self.key) + hash(self.value)
class Path(object):
def __init__(self, labels, objects):
self.labels = labels
self.objects = objects
def __repr__(self):
return "path[" + ", ".join(map(str, self.objects)) + "]"
def __eq__(self, other):
return isinstance(other, self.__class__) and self.objects == other.objects and self.labels == other.labels
def __hash__(self):
return hash(str(self.objects)) + hash(str(self.labels))
def __getitem__(self, key):
if isinstance(key, str):
objects = []
for i, labels in enumerate(self.labels):
if key in labels:
objects.append(self.objects[i])
if 0 == len(objects):
raise KeyError("The step with label " + key + " does not exist")
return objects if len(objects) > 1 else objects[0]
elif isinstance(key, int):
return self.objects[key]
else:
raise TypeError("The path access key must be either a string label or integer index")
def __len__(self):
return len(self.objects)