Class: RedGrape::Graph

Inherits:
Object show all
Includes:
Pipe::E, Pipe::V
Defined in:
lib/red_grape/graph.rb

Constant Summary collapse

UID =
nil

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Pipe::E

#e

Methods included from Pipe::V

#v

Constructor Details

#initialize(name = nil, &block) ⇒ Graph

Returns a new instance

block

a block which is given the instance as the first argument

to initialize it



75
76
77
78
79
80
81
82
# File 'lib/red_grape/graph.rb', line 75

def initialize(name=nil, &block)
  @name = name || uid
  @serializer = Serializer::GraphMLSerializer.new self
  @vertices = {}
  @edges = {}
  @property_descriptions = {}
  block.call self if block
end

Instance Attribute Details

#nameObject

Returns the value of attribute name.



70
71
72
# File 'lib/red_grape/graph.rb', line 70

def name
  @name
end

#serializerObject

Returns the value of attribute serializer.



70
71
72
# File 'lib/red_grape/graph.rb', line 70

def serializer
  @serializer
end

Class Method Details

.create_tinker_graphObject

Returns the default graph which has 6 vertices and 6 edges.



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/red_grape/graph.rb', line 19

def create_tinker_graph
  self.new :tinkergraph do |g|
    v1 = g.add_vertex 1, name:'marko', age:29
    v2 = g.add_vertex 2, name:'vadas', age:27
    v3 = g.add_vertex 3, name:'lop', lang:'java'
    v4 = g.add_vertex 4, name:'josh', age:32
    v5 = g.add_vertex 5, name:'ripple', lang:'java'
    v6 = g.add_vertex 6, name:'peter', age:35
    g.add_edge 7, v1, v2, 'knows', weight:0.5
    g.add_edge 8, v1, v4, 'knows', weight:1.0
    g.add_edge 9, v1, v3, 'created', weight:0.4
    g.add_edge 10, v4, v5, 'created', weight:1.0
    g.add_edge 11, v4, v3, 'created', weight:0.4
    g.add_edge 12, v6, v3, 'created', weight:0.2
  end
end

.featuresObject

Returns the features as a hash



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
# File 'lib/red_grape/graph.rb', line 37

def features
  {
    ignores_supplied_ids:false,
    is_persistent:false,
    is_rdf_model:false,
    is_wrapper:false,
    supports_boolean_property:true,
    supports_double_property:true,
    supports_duplicate_edges:true,
    supports_edge_index:false,
    supports_edge_iteration:true,
    supports_edge_key_index:false,
    supports_float_property:true,
    supports_indices:false,
    supports_integer_property:true,
    supports_key_indices:false,
    supports_long_property:true,
    supports_map_property:true,
    supports_mixed_list_property:true,
    supports_primitive_array_property:true,
    supports_self_loops:true,
    supports_serializable_object_property:true,
    supports_string_property:true,
    supports_threded_transactions:false,
    supports_transactions:false,
    supports_uniform_list_property:true,
    supports_vertex_index:false,
    supports_vertex_iteration:true,
    supports_vertex_key_index:false
  }
end

.load(filename) ⇒ Object



14
15
16
# File 'lib/red_grape/graph.rb', line 14

def load(filename)
  self.new.load filename
end

.readonly?Boolean

Returns:

  • (Boolean)


214
# File 'lib/red_grape/graph.rb', line 214

def self.readonly?; true end

Instance Method Details

#add_edge(id, from, to, label, opts = {}) ⇒ Object



160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# File 'lib/red_grape/graph.rb', line 160

def add_edge(id, from, to, label, opts={})
  id = uid(@edges.keys) unless id
  if id.is_a? Edge
    raise ArgumentError.new "#{id.id} already exists." if @edges[id.id]
    @edges[id.id] = id
  else
    id = id.to_s
    raise ArgumentError.new "#{id} already exists." if @edges[id]

    from = self.vertex(from.to_s) unless from.is_a? Vertex
    to = self.vertex(to.to_s) unless to.is_a? Vertex
    add_vertex from unless self.vertex(from.id)
    add_vertex to unless self.vertex(to.id)
    @edges[id] = Edge.new self, id, from, to, label, opts
  end
end

#add_vertex(id, v = nil) ⇒ Object



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/red_grape/graph.rb', line 120

def add_vertex(id, v=nil)
  id = uid(@vertices.keys) unless id
  if v
    if v.is_a? Hash
      id = id.to_s
      v = Vertex.new self, id, v
    end
  else
    if id.is_a? Hash
      v = id
      id = (v[:id] || v['id']).to_s
    elsif id.respond_to?(:id)
      v = id
      id = v.id.to_s
    else
      id = id.to_s
      v = {}
    end
    v = Vertex.new self, id, v
  end
  raise ArgumentError.new "invalid id" unless id == v.id
  raise ArgumentError.new "#{id} already exists." if @vertices[id]

  @vertices[id] = v
end

#dupObject



226
227
228
229
230
231
232
233
# File 'lib/red_grape/graph.rb', line 226

def dup
  obj = self.class.new
  obj.instance_variable_set :@serializer, @serializer
  obj.instance_variable_set :@vertices, @vertices.dup
  obj.instance_variable_set :@edges, @edges.dup
  obj.instance_variable_set :@property_descriptions, @property_descriptions.dup
  obj
end

#edge(*id) ⇒ Object



116
117
118
# File 'lib/red_grape/graph.rb', line 116

def edge(*id)
  items :edge, *id
end

#find(*args) ⇒ Object



202
203
204
# File 'lib/red_grape/graph.rb', line 202

def find(*args)
  Graph::Vertex.new
end

#items(type, *id) ⇒ Object

:nodoc:



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
# File 'lib/red_grape/graph.rb', line 84

def items(type, *id) # :nodoc:
  items = case type
    when :vertex, :vertices
      @vertices
    when :edge, :edges
      @edges
    else
      raise ArgumentError.new('type should be :vertex or :edge')
    end

  if id.size == 2 # TODO: for the time being
    items.values.select{|e| e[id[0]] == id[1]}
  elsif 1 < id.size
    id.map{|i| items[i.to_s]}
  elsif id.size == 0
    items.values
  else
    case id.first
    when Array
      id.first.map{|i| items[i.to_s]}
    when :all
      items.values
    else
      items[id.first.to_s]
    end
  end
end

#load(filename) ⇒ Object



193
194
195
# File 'lib/red_grape/graph.rb', line 193

def load(filename)
  @serializer.load filename
end

#readonlyObject



206
207
208
# File 'lib/red_grape/graph.rb', line 206

def readonly
  dup.readonly!
end

#readonly!Object



210
211
212
213
214
215
216
# File 'lib/red_grape/graph.rb', line 210

def readonly!
  %w(add_vertex add_edge remove_vertex remove_edge load).each do |name|
    eval "def self.#{name}(*args); raise NoMethodError end"
  end
  def self.readonly?; true end
  self
end

#readonly?Boolean

Returns:

  • (Boolean)


218
219
220
# File 'lib/red_grape/graph.rb', line 218

def readonly?
  false
end

#remove_edge(id) ⇒ Object



177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
# File 'lib/red_grape/graph.rb', line 177

def remove_edge(id)
  if id.is_a? Edge
    e = id
    id = id.id
  else
    id = id.to_s
    e = @edges[id]
  end
  @edges.delete id
  if e
    e.source.out_edges.delete e
    e.target.in_edges.delete e
  end
  e
end

#remove_vertex(id) ⇒ Object



146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/red_grape/graph.rb', line 146

def remove_vertex(id)
  id = id.id if id.is_a? Vertex
  v = @vertices.delete id.to_s
  if v
    v.out_edges.dup.each do |e| 
      remove_edge e
    end
    v.in_edges.dup.each do |e|
      remove_edge e
    end
  end
  v
end

#save(file) ⇒ Object



197
198
199
200
# File 'lib/red_grape/graph.rb', line 197

def save(file)
  file = File.open file if file.is_a? String
  @serializer.save file
end

#shutdownObject



222
223
224
# File 'lib/red_grape/graph.rb', line 222

def shutdown
  # do nothing
end

#to_hObject



248
249
250
251
252
253
254
255
256
257
# File 'lib/red_grape/graph.rb', line 248

def to_h
  {
    version:RedGrape::VERSION,
    name:'-',
    graph:to_s,
    features:self.class.features,
    readOnly:readonly?,
    type:self.class.name
  }
end

#to_sObject



244
245
246
# File 'lib/red_grape/graph.rb', line 244

def to_s
  "redgrape[vertices:#{@vertices.size} edges:#{@edges.size}]"
end

#uid(denies = []) ⇒ Object

:nodoc:



235
236
237
238
239
240
241
242
# File 'lib/red_grape/graph.rb', line 235

def uid(denies=[]) # :nodoc:
  id = "##{Time.now.to_i}-#{rand(10000)}"
  if denies.include? id
    uid denies
  else
    id
  end
end

#vertex(*id) ⇒ Object



112
113
114
# File 'lib/red_grape/graph.rb', line 112

def vertex(*id)
  items :vertex, *id
end