rgraphum 0.0.1.alpha

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. data/.gitignore +26 -0
  2. data/GLOSSARIES.md +108 -0
  3. data/GREMLIN.md +1398 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +136 -0
  7. data/Rakefile +16 -0
  8. data/bin/.irbrc +41 -0
  9. data/bin/rgraphum_console +61 -0
  10. data/bin/rgraphum_runner +57 -0
  11. data/examples/ba_model/make.rb +19 -0
  12. data/examples/ba_model/make_dummy_twitter_rt_data.rb +0 -0
  13. data/examples/basic/check_modularity.rb +27 -0
  14. data/examples/basic/make_graph.rb +12 -0
  15. data/examples/parser/dot.rb +28 -0
  16. data/examples/sis_model/lifegame.rb +161 -0
  17. data/graph_struct.jpg +0 -0
  18. data/lib/rgraphum/analyzer/linear_regression.rb +31 -0
  19. data/lib/rgraphum/analyzer/meme_tracker.rb +296 -0
  20. data/lib/rgraphum/analyzer/twitter/rt_at_mark.rb +45 -0
  21. data/lib/rgraphum/analyzer.rb +8 -0
  22. data/lib/rgraphum/cluster.rb +67 -0
  23. data/lib/rgraphum/communities.rb +65 -0
  24. data/lib/rgraphum/community.rb +86 -0
  25. data/lib/rgraphum/cosine_similarity_matrix.rb +40 -0
  26. data/lib/rgraphum/edge.rb +194 -0
  27. data/lib/rgraphum/edges.rb +161 -0
  28. data/lib/rgraphum/ext/cosine_similarity_matrix.rb +79 -0
  29. data/lib/rgraphum/ext/linear_regression.rb +22 -0
  30. data/lib/rgraphum/ext/tf_idf.rb +52 -0
  31. data/lib/rgraphum/graph/gremlin.rb +193 -0
  32. data/lib/rgraphum/graph/math/clustering_coefficient.rb +53 -0
  33. data/lib/rgraphum/graph/math/community_detection.rb +141 -0
  34. data/lib/rgraphum/graph/math/degree_distribution.rb +50 -0
  35. data/lib/rgraphum/graph/math/dijkstra.rb +331 -0
  36. data/lib/rgraphum/graph/math.rb +45 -0
  37. data/lib/rgraphum/graph.rb +267 -0
  38. data/lib/rgraphum/importer.rb +97 -0
  39. data/lib/rgraphum/marshal.rb +26 -0
  40. data/lib/rgraphum/motifs.rb +8 -0
  41. data/lib/rgraphum/parsers/flare.rb +42 -0
  42. data/lib/rgraphum/parsers/gephi.rb +193 -0
  43. data/lib/rgraphum/parsers/graphviz.rb +78 -0
  44. data/lib/rgraphum/parsers/miserables.rb +54 -0
  45. data/lib/rgraphum/parsers.rb +32 -0
  46. data/lib/rgraphum/path.rb +37 -0
  47. data/lib/rgraphum/query.rb +130 -0
  48. data/lib/rgraphum/rgraphum_array.rb +159 -0
  49. data/lib/rgraphum/rgraphum_array_dividers.rb +43 -0
  50. data/lib/rgraphum/rgraphum_random.rb +5 -0
  51. data/lib/rgraphum/simulator/ba_model.rb +140 -0
  52. data/lib/rgraphum/simulator/sir_model.rb +178 -0
  53. data/lib/rgraphum/simulator/sis_model.rb +158 -0
  54. data/lib/rgraphum/simulator.rb +29 -0
  55. data/lib/rgraphum/statistic/power_law.rb +9 -0
  56. data/lib/rgraphum/t.rb +12 -0
  57. data/lib/rgraphum/tf_idf.rb +27 -0
  58. data/lib/rgraphum/version.rb +3 -0
  59. data/lib/rgraphum/vertex.rb +354 -0
  60. data/lib/rgraphum/vertices.rb +97 -0
  61. data/lib/rgraphum.rb +38 -0
  62. data/performance/add-vertices-edges.rb +20 -0
  63. data/performance/add-vertices.rb +12 -0
  64. data/performance/build-graph.rb +19 -0
  65. data/performance/delete-graph.rb +24 -0
  66. data/performance/delete-vertices.rb +25 -0
  67. data/performance/refer-graph.rb +23 -0
  68. data/rgraphum.gemspec +30 -0
  69. data/test/lib/rgraphum/analyzer/linear_regression_test.rb +20 -0
  70. data/test/lib/rgraphum/analyzer/meme_tracker_test.rb +383 -0
  71. data/test/lib/rgraphum/analyzer/twitter/rt_at_mark_test.rb +120 -0
  72. data/test/lib/rgraphum/array_test.rb +95 -0
  73. data/test/lib/rgraphum/bubble_test.rb +7 -0
  74. data/test/lib/rgraphum/communities_test.rb +53 -0
  75. data/test/lib/rgraphum/cosine_similarity_test.rb +18 -0
  76. data/test/lib/rgraphum/edge_test.rb +89 -0
  77. data/test/lib/rgraphum/edges_test.rb +178 -0
  78. data/test/lib/rgraphum/graph_builder_test.rb +64 -0
  79. data/test/lib/rgraphum/graph_dup_test.rb +199 -0
  80. data/test/lib/rgraphum/graph_plus_test.rb +80 -0
  81. data/test/lib/rgraphum/graph_test.rb +512 -0
  82. data/test/lib/rgraphum/gremlin_test.rb +145 -0
  83. data/test/lib/rgraphum/importers/idg_json_edges.json +20 -0
  84. data/test/lib/rgraphum/importers/idg_json_test.rb +207 -0
  85. data/test/lib/rgraphum/importers/idg_json_vertices.json +46 -0
  86. data/test/lib/rgraphum/math/average_distance_matrix_test.rb +142 -0
  87. data/test/lib/rgraphum/math/clustering_coefficient_test.rb +219 -0
  88. data/test/lib/rgraphum/math/community_test.rb +78 -0
  89. data/test/lib/rgraphum/math/degree_distribution_test.rb +40 -0
  90. data/test/lib/rgraphum/math/dijkstra_test.rb +146 -0
  91. data/test/lib/rgraphum/math/modularity_test.rb +154 -0
  92. data/test/lib/rgraphum/math/quick_average_distance_matrix_test.rb +84 -0
  93. data/test/lib/rgraphum/path_test.rb +44 -0
  94. data/test/lib/rgraphum/query/enumerable_test.rb +42 -0
  95. data/test/lib/rgraphum/query/where_operators_test.rb +75 -0
  96. data/test/lib/rgraphum/query/where_test.rb +59 -0
  97. data/test/lib/rgraphum/simulator/ba_model_test.rb +75 -0
  98. data/test/lib/rgraphum/simulator/sir_model_test.rb +513 -0
  99. data/test/lib/rgraphum/simulator/sis_model_test.rb +478 -0
  100. data/test/lib/rgraphum/simulator_test.rb +22 -0
  101. data/test/lib/rgraphum/tf_idf_test.rb +30 -0
  102. data/test/lib/rgraphum/vertex_test.rb +50 -0
  103. data/test/lib/rgraphum/vertices_test.rb +180 -0
  104. data/test/test_helper.rb +98 -0
  105. data/tmp/.gitkeep +0 -0
  106. metadata +254 -0
@@ -0,0 +1,512 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'rgraphum'
4
+ require 'test_helper'
5
+
6
+ class RgraphumTest < MiniTest::Test
7
+ def setup
8
+ make_test_graph
9
+ end
10
+
11
+ def test_constractor
12
+ hash_vertices = [
13
+ {id: 1, label: "hoge" },
14
+ {id: 2, label: "huga" },
15
+ ]
16
+ hash_edges = [
17
+ {id: 1, source: 1, target: 2, weight: 1},
18
+ {id: 2, source: 2, target: 1, weight: 1},
19
+ ]
20
+
21
+ @graph = Rgraphum::Graph.new(vertices: hash_vertices, edges: hash_edges)
22
+
23
+ assert_instance_of Rgraphum::Vertices, @graph.vertices
24
+ assert_instance_of Rgraphum::Edges, @graph.edges
25
+
26
+ @graph.vertices.each do |vertex|
27
+ assert_instance_of Rgraphum::Vertex, vertex
28
+ end
29
+ @graph.edges.each do |edge|
30
+ assert_instance_of Rgraphum::Edge, edge
31
+ end
32
+
33
+ rg_assert_equal @graph.vertices[0].edges[0].source, @graph.vertices[0]
34
+ rg_assert_equal @graph.vertices[0].edges[1].source, @graph.vertices[1]
35
+ rg_assert_equal @graph.vertices[1].edges[0].source, @graph.vertices[0]
36
+ rg_assert_equal @graph.vertices[1].edges[1].source, @graph.vertices[1]
37
+
38
+ rg_assert_equal @graph.vertices[0].edges[0].target, @graph.vertices[1]
39
+ rg_assert_equal @graph.vertices[0].edges[1].target, @graph.vertices[0]
40
+ rg_assert_equal @graph.vertices[1].edges[0].target, @graph.vertices[1]
41
+ rg_assert_equal @graph.vertices[1].edges[1].target, @graph.vertices[0]
42
+ end
43
+
44
+ def test_basic_method
45
+ assert_instance_of Rgraphum::Vertices, @graph_a.vertices
46
+ assert_instance_of Rgraphum::Edges, @graph_a.edges
47
+
48
+ assert @graph_a.vertices.graph
49
+ assert @graph_a.edges.graph
50
+
51
+ # 基本統計量
52
+ assert_equal 2, @graph_a.m
53
+ assert_equal 2, @graph_b.m
54
+ assert_equal 2, @graph_a.m_with_weight
55
+ assert_equal 4, @graph_b.m_with_weight
56
+ assert_equal 2, @graph_a.average_degree
57
+ assert_equal 2, @graph_b.average_degree
58
+
59
+ # vertex_ids
60
+ assert_equal [1, 2], @graph_a.vertices.id
61
+ assert_equal 1, @graph_a.vertices.id.first
62
+ assert_equal 2, @graph_a.vertices.id.last
63
+
64
+ # edges
65
+ edges = @graph_a.edges
66
+
67
+ assert edges
68
+ assert_equal 2, edges.size
69
+ assert_same edges[0].target, edges[1].source
70
+ assert_same edges[0].source, edges[1].target
71
+ assert_same @graph_a.vertices[0], edges[0].source
72
+ assert_same @graph_a.vertices[0], edges[1].target
73
+ assert_same @graph_a.vertices[1], edges[1].source
74
+ assert_same @graph_a.vertices[1], edges[0].target
75
+
76
+ assert_equal 2, @graph_a.vertices[0].edges.size
77
+ assert_equal 2, @graph_a.vertices[1].edges.size
78
+
79
+
80
+ edge_ids = @graph_a.edges.id
81
+ # edge_ids
82
+ assert edge_ids
83
+ assert_equal 1, edge_ids.first
84
+ assert_equal 2, edge_ids.last
85
+
86
+ @graph_a.vertices = [{label: "hoge"}, {label: "hoge"}]
87
+ vertices = @graph_a.vertices
88
+ rg_assert_equal [{id: 0, label: "hoge"}, {id: 1, label: "hoge"}], vertices
89
+ end
90
+
91
+ def test_delete_edge
92
+ delete_edge = @graph_a.edges.where(id: 1).first
93
+ remain_edge = @graph_a.edges.where(id: 2).first
94
+ @graph_a.edges.delete(delete_edge)
95
+ rg_assert_equal ([remain_edge]), @graph_a.edges
96
+ rg_assert_equal ([remain_edge]), @graph_a.vertices[0].edges
97
+
98
+ delete_edge = @graph_b.edges.where(id: 1).first
99
+ remain_edge = @graph_b.vertices[0].edges.where(id: 2).first
100
+ @graph_b.vertices[0].edges.delete(delete_edge)
101
+ rg_assert_equal ([remain_edge]), @graph_b.edges
102
+ rg_assert_equal ([remain_edge]), @graph_b.vertices[0].edges
103
+ end
104
+
105
+ def test_delete_edge_with_id
106
+ remain_edge = @graph_a.edges.where(id: 2).first
107
+ @graph_a.edges.delete(1)
108
+ rg_assert_equal ([remain_edge]), @graph_a.edges
109
+ rg_assert_equal ([remain_edge]), @graph_a.vertices[0].edges
110
+
111
+ remain_edge = @graph_b.vertices[0].edges.where(id: 2).first
112
+ @graph_b.vertices[0].edges.delete(1)
113
+ rg_assert_equal ([remain_edge]), @graph_b.edges
114
+ rg_assert_equal ([remain_edge]), @graph_b.vertices[0].edges
115
+ end
116
+
117
+ def test_vertex
118
+ assert_equal 2, @graph_a.vertices[0].degree
119
+ assert_equal 2, @graph_a.vertices[0].degree_weight
120
+ end
121
+
122
+ def test_find_by_some_key
123
+ # find_by_labbel
124
+ vertex = @graph_a.vertices.where(label: "hoge").first
125
+ rg_assert_equal @graph_a.vertices[0], vertex
126
+ assert_same @graph_a.vertices[0], vertex
127
+ end
128
+
129
+ def test_where_condition
130
+ vertex = @graph_a.vertices.where(label: "hoge").first
131
+ rg_assert_equal @graph_a.vertices[0], vertex
132
+ assert_same @graph_a.vertices[0], vertex
133
+ end
134
+
135
+ def test_id_aspect!
136
+ id_aspect_vertices = @graph_a.id_aspect!.vertices
137
+ rg_assert_equal [ {:id=>1, :label=>"hoge" }, {:id=>2, :label=>"huga"} ], id_aspect_vertices
138
+ expected = [
139
+ {:id=>1, :source=>1, :target=>2, :weight=>1 },
140
+ {:id=>2, :source=>2, :target=>1, :weight=>1 },
141
+ ]
142
+ rg_assert_equal expected, id_aspect_vertices[0].edges
143
+ expected = [
144
+ {:id=>1, :source=>1, :target=>2, :weight=>1 },
145
+ {:id=>2, :source=>2, :target=>1, :weight=>1 },
146
+ ]
147
+ rg_assert_equal expected, id_aspect_vertices[1].edges
148
+ end
149
+
150
+ def test_real_aspect!
151
+ real_aspect_vertices = @graph_a.real_aspect!.vertices
152
+
153
+ assert_equal 2, real_aspect_vertices.size
154
+ rg_assert_equal real_aspect_vertices[0], real_aspect_vertices[0].edges[0].source
155
+ rg_assert_equal real_aspect_vertices[1], real_aspect_vertices[0].edges[0].target
156
+ rg_assert_equal real_aspect_vertices[1], real_aspect_vertices[1].edges[1].source
157
+ rg_assert_equal real_aspect_vertices[0], real_aspect_vertices[1].edges[1].target
158
+ end
159
+
160
+ def test_compact_with
161
+ Rgraphum::Vertex.class_eval {
162
+ field :hoge
163
+ }
164
+ @graph_a.vertices.each { |vertex| vertex.hoge = vertex.label }
165
+ graph = @graph_a + @graph_a
166
+ graph = graph.compact_with(:hoge, graph)
167
+
168
+ graph.id_aspect!
169
+
170
+ expected = [
171
+ { :id=>1, :source=>1, :target=>2, :weight=>2 },
172
+ { :id=>2, :source=>2, :target=>1, :weight=>2 },
173
+ ]
174
+ rg_assert_equal expected, graph.edges
175
+
176
+ expected = [
177
+ { :id=>1, :label=>"hoge", :hoge =>"hoge" },
178
+ { :id=>2, :label=>"huga", :hoge =>"huga" },
179
+ ]
180
+ rg_assert_equal expected, graph.vertices
181
+
182
+ expected = [
183
+ { :id=>1, :source=>1, :target=>2, :weight=>2 },
184
+ { :id=>2, :source=>2, :target=>1, :weight=>2 },
185
+ ]
186
+ rg_assert_equal expected, graph.vertices[0].edges
187
+ expected = [
188
+ { :id=>1, :source=>1, :target=>2, :weight=>2 },
189
+ { :id=>2, :source=>2, :target=>1, :weight=>2 },
190
+ ]
191
+ rg_assert_equal expected, graph.vertices[1].edges
192
+ end
193
+
194
+ def test_compact_with_label
195
+ graph = @graph_a + @graph_a
196
+ graph.compact_with_label.id_aspect!
197
+
198
+ expected = [
199
+ { :id=>1, :source=>1, :target=>2, :weight=>2 },
200
+ { :id=>2, :source=>2, :target=>1, :weight=>2 },
201
+ ]
202
+ rg_assert_equal expected, graph.edges
203
+
204
+ expected = [
205
+ { :id=>1, :label=>"hoge" },
206
+ { :id=>2, :label=>"huga" },
207
+ ]
208
+ rg_assert_equal expected, graph.vertices
209
+
210
+ expected = [
211
+ { :id=>1, :source=>1, :target=>2, :weight=>2 },
212
+ { :id=>2, :source=>2, :target=>1, :weight=>2 },
213
+ ]
214
+ rg_assert_equal expected, graph.vertices[0].edges
215
+ expected = [
216
+ { :id=>1, :source=>1, :target=>2, :weight=>2 },
217
+ { :id=>2, :source=>2, :target=>1, :weight=>2 },
218
+ ]
219
+ rg_assert_equal expected, graph.vertices[1].edges
220
+ end
221
+
222
+ def test_add_vertex_with_no_id_added_id
223
+ @graph = Rgraphum::Graph.new
224
+ @graph.vertices = [{ :label => "huga" },{ :label => "huga" }]
225
+ assert_equal ([0,1]), @graph.vertices.id
226
+
227
+ @graph.vertices << { :label => "piyo" }
228
+ rg_assert_equal ( { :id => 2, :label => "piyo" } ), @graph.vertices.where(label: "piyo").first
229
+ assert_equal ([0,1,2]), @graph.vertices.id
230
+ end
231
+
232
+ def test_add_edge_with_no_id_add_id
233
+ # 0 - 1
234
+ # \ /
235
+ # 2
236
+ # / \
237
+ # 3 - 4
238
+
239
+ # add edge to graph
240
+ @graph = Rgraphum::Graph.new
241
+ @graph.vertices = [
242
+ { id: 0, label: "A", community_id: 1 },
243
+ { id: 1, label: "B", community_id: 1 },
244
+ {id:2,label:"C"},
245
+ {id:3,label:"D"},
246
+ {id:4,label:"E"},
247
+ ]
248
+ @graph.edges = [
249
+ {source:0,target:1,weight:1},
250
+ {source:0,target:2,weight:1},
251
+ {source:1,target:2,weight:1},
252
+ {source:2,target:3,weight:1},
253
+ {source:2,target:4,weight:1},
254
+ {source:3,target:4,weight:1},
255
+ ]
256
+
257
+ @graph.id_aspect!
258
+ rg_assert_equal({id:0,source:0,target:1,weight:1}, @graph.edges[0])
259
+ rg_assert_equal({id:1,source:0,target:2,weight:1}, @graph.edges[1])
260
+ rg_assert_equal({id:2,source:1,target:2,weight:1}, @graph.edges[2])
261
+ rg_assert_equal({id:3,source:2,target:3,weight:1}, @graph.edges[3])
262
+ rg_assert_equal({id:4,source:2,target:4,weight:1}, @graph.edges[4])
263
+ rg_assert_equal({id:5,source:3,target:4,weight:1}, @graph.edges[5])
264
+
265
+ # add edge to vertex
266
+ @graph = Rgraphum::Graph.new
267
+ @graph.vertices = [
268
+ { id: 0, label: "A", community_id: 1 },
269
+ { id: 1, label: "B", community_id: 1 },
270
+ {id:2,label:"C"},
271
+ {id:3,label:"D"},
272
+ {id:4,label:"E"},
273
+ ]
274
+ @graph.vertices[0].edges << {source:0,target:1,weight:1}
275
+ @graph.vertices[0].edges << {source:0,target:2,weight:1}
276
+ @graph.vertices[1].edges << {source:1,target:2,weight:1}
277
+ @graph.vertices[2].edges << {source:2,target:3,weight:1}
278
+ @graph.vertices[2].edges << {source:2,target:4,weight:1}
279
+ @graph.vertices[3].edges << {source:3,target:4,weight:1}
280
+
281
+ @graph.id_aspect!
282
+ rg_assert_equal({id:0,source:0,target:1,weight:1}, @graph.edges[0])
283
+ rg_assert_equal({id:1,source:0,target:2,weight:1}, @graph.edges[1])
284
+ rg_assert_equal({id:2,source:1,target:2,weight:1}, @graph.edges[2])
285
+ rg_assert_equal({id:3,source:2,target:3,weight:1}, @graph.edges[3])
286
+ rg_assert_equal({id:4,source:2,target:4,weight:1}, @graph.edges[4])
287
+ rg_assert_equal({id:5,source:3,target:4,weight:1}, @graph.edges[5])
288
+
289
+ end
290
+ def test_add_edge_with_id_aspect
291
+ @graph = Rgraphum::Graph.new
292
+ @graph.vertices = [{ :label => "hoge" },{:label => "huga"}]
293
+ rg_assert_equal ([{ :id => 0, :label => "hoge"}, {:id => 1, :label => "huga"}]), @graph.vertices
294
+
295
+ @graph.edges << { :source => 1, :target =>0 }
296
+ @graph.id_aspect!
297
+ rg_assert_equal [ { :id => 0, :source => 1, :target => 0, :weight => 1}], @graph.edges
298
+
299
+ @graph.real_aspect!
300
+ @graph.edges << { :source => 0, :target => 1 }
301
+ @graph.id_aspect!
302
+ rg_assert_equal [ { :id => 0, :source => 1, :target => 0, :weight => 1 },{ :id => 1, :source => 0, :target => 1, :weight => 1}], @graph.edges
303
+ end
304
+
305
+ def test_edges_input_with_array
306
+ @graph = Rgraphum::Graph.new
307
+ @graph.vertices = [
308
+ {:id => 1, :label => "hoge" },
309
+ {:id => 2, :label => "huga" },
310
+ ]
311
+ @graph.edges = [
312
+ {:source => 1, :target => 2, :weight => 1},
313
+ {:source => 2, :target => 1, :weight => 1},
314
+ ]
315
+ @graph.id_aspect!
316
+ rg_assert_equal [ {:id => 0, :source => 1, :target => 2, :weight => 1},{ :id => 1, :source => 2, :target => 1, :weight => 1}], @graph.edges
317
+ end
318
+
319
+ def test_divide_by_time
320
+ @graph = Rgraphum::Graph.new
321
+ @graph.vertices = [
322
+ {:id => 1, :label => "hoge", :start => Time.parse("2010-01-01 12:05"), :end => Time.parse("2010-01-01 12:05" )},
323
+ {:id => 2, :label => "huga", :start => Time.parse("2010-01-02 12:05"), :end => Time.parse("2010-01-02 13:35" )},
324
+ ]
325
+ @graph.edges = [
326
+ { :source => 1, :target => 2, :weight => 1, :start => Time.parse("2010-01-01 12:05"), :end => Time.parse("2010-01-01 12:05") },
327
+ { :source => 2, :target => 1, :weight => 1, :start => Time.parse("2010-01-02 12:05"), :end => Time.parse("2010-01-02 13:35") },
328
+ { :source => 2, :target => 1, :weight => 1, :start => Time.parse("2010-01-02 12:26"), :end => Time.parse("2010-01-02 13:19:59") },
329
+ { :source => 2, :target => 1, :weight => 1, :start => Time.parse("2010-01-02 12:40") },
330
+ ]
331
+
332
+ @graph.divide_by_time
333
+
334
+ vertices = @graph.vertices.sort_by{ |vertex| vertex.start }
335
+ assert_equal "2010-01-01 12:00:00 +0900", vertices[0].start.to_s
336
+ assert_equal "2010-01-01 12:19:59 +0900", vertices[0].end.to_s
337
+
338
+ assert_equal "2010-01-02 12:00:00 +0900", vertices[1].start.to_s
339
+ assert_equal "2010-01-02 12:19:59 +0900", vertices[1].end.to_s
340
+
341
+ assert_equal "2010-01-02 12:20:00 +0900", vertices[2].start.to_s
342
+ assert_equal "2010-01-02 12:39:59 +0900", vertices[2].end.to_s
343
+
344
+ assert_equal "2010-01-02 12:40:00 +0900", vertices[3].start.to_s
345
+ assert_equal "2010-01-02 12:59:59 +0900", vertices[3].end.to_s
346
+
347
+ assert_equal "2010-01-02 13:00:00 +0900", vertices[4].start.to_s
348
+ assert_equal "2010-01-02 13:19:59 +0900", vertices[4].end.to_s
349
+
350
+ assert_equal "2010-01-02 13:20:00 +0900", vertices[5].start.to_s
351
+ assert_equal "2010-01-02 13:39:59 +0900", vertices[5].end.to_s
352
+
353
+ assert_nil vertices[6]
354
+
355
+
356
+ edges = @graph.edges.sort_by{ |edge| edge.start }
357
+ # edges.each { |edge| p "###########"; p edge.id; p edge.source.id; p edge.target.id; p edge.start; p edge.end }
358
+ assert_equal "2010-01-01 12:00:00 +0900", edges[0].start.to_s
359
+ assert_equal "2010-01-01 12:19:59 +0900", edges[0].end.to_s
360
+
361
+ assert_equal "2010-01-02 12:00:00 +0900", edges[1].start.to_s
362
+ assert_equal "2010-01-02 12:19:59 +0900", edges[1].end.to_s
363
+
364
+ assert_equal "2010-01-02 12:20:00 +0900", edges[2].start.to_s
365
+ assert_equal "2010-01-02 12:39:59 +0900", edges[2].end.to_s
366
+
367
+ assert_equal "2010-01-02 12:40:00 +0900", edges[3].start.to_s
368
+ assert_equal "2010-01-02 12:59:59 +0900", edges[3].end.to_s
369
+
370
+ assert_equal "2010-01-02 13:00:00 +0900", edges[4].start.to_s
371
+ assert_equal "2010-01-02 13:19:59 +0900", edges[4].end.to_s
372
+
373
+ assert_equal "2010-01-02 13:20:00 +0900", edges[5].start.to_s
374
+ assert_equal "2010-01-02 13:39:59 +0900", edges[5].end.to_s
375
+
376
+ assert_nil edges[6]
377
+
378
+ assert_equal 1, edges[0].weight
379
+ assert_equal 1, edges[1].weight
380
+ assert_equal 2, edges[2].weight
381
+ assert_equal 3, edges[3].weight
382
+ assert_equal 2, edges[4].weight
383
+ assert_equal 1, edges[5].weight
384
+ end
385
+
386
+ def test_graph_dump_and_load
387
+ # 2
388
+ # / \
389
+ # 1 4
390
+ # \ /
391
+ # 3
392
+ vertex1 = Rgraphum::Vertex.new({id: 1, label: "vertex 1" })
393
+ vertex2 = Rgraphum::Vertex.new({id: 2, label: "vertex 2" })
394
+ vertex3 = Rgraphum::Vertex.new({id: 3, label: "vertex 3" })
395
+ vertex4 = Rgraphum::Vertex.new({id: 4, label: "vertex 4" })
396
+ vertices = [vertex1, vertex2, vertex3, vertex4]
397
+ edges = [
398
+ Rgraphum::Edge.new({source: vertex1, target: vertex2}),
399
+ Rgraphum::Edge.new({source: vertex2, target: vertex4}),
400
+ Rgraphum::Edge.new({source: vertex1, target: vertex3}),
401
+ Rgraphum::Edge.new({source: vertex3, target: vertex4}),
402
+ ]
403
+ graph = Rgraphum::Graph.new(vertices: vertices, edges: edges)
404
+
405
+ data = Marshal.dump(graph)
406
+ graph_dash = Marshal.load(data)
407
+
408
+ assert_equal graph, graph_dash
409
+ end
410
+
411
+ def test_graphs_dump_and_load
412
+ # 2 2 - 5
413
+ # / \ / /
414
+ # 1 4 1 /
415
+ # \ / \ /
416
+ # 3 6
417
+ vertex1 = Rgraphum::Vertex.new({id: 1, label: "vertex 1" })
418
+ vertex2 = Rgraphum::Vertex.new({id: 2, label: "vertex 2" })
419
+ vertex3 = Rgraphum::Vertex.new({id: 3, label: "vertex 3" })
420
+ vertex4 = Rgraphum::Vertex.new({id: 4, label: "vertex 4" })
421
+ vertex5 = Rgraphum::Vertex.new({id: 5, label: "vertex 5" })
422
+ vertex6 = Rgraphum::Vertex.new({id: 6, label: "vertex 6" })
423
+
424
+ vertices1 = [vertex1, vertex2, vertex3, vertex4]
425
+ edges1 = [
426
+ Rgraphum::Edge.new({source: vertex1, target: vertex2}),
427
+ Rgraphum::Edge.new({source: vertex2, target: vertex4}),
428
+ Rgraphum::Edge.new({source: vertex1, target: vertex3}),
429
+ Rgraphum::Edge.new({source: vertex3, target: vertex4}),
430
+ ]
431
+ graph1 = Rgraphum::Graph.new(vertices: vertices1, edges: edges1)
432
+
433
+ vertices2 = [vertex1, vertex2, vertex5, vertex6]
434
+ edges2 = [
435
+ Rgraphum::Edge.new({source: vertex1, target: vertex2}),
436
+ Rgraphum::Edge.new({source: vertex2, target: vertex5}),
437
+ Rgraphum::Edge.new({source: vertex1, target: vertex6}),
438
+ Rgraphum::Edge.new({source: vertex6, target: vertex5}),
439
+ ]
440
+ graph2 = Rgraphum::Graph.new(vertices: vertices2, edges: edges2)
441
+
442
+ graphs = [graph1, graph2, graph1]
443
+
444
+ data = Marshal.dump(graphs)
445
+ graphs_dash = Marshal.load(data)
446
+
447
+ assert_equal graphs, graphs_dash
448
+ rg_refute_equal graphs_dash[0], graphs_dash[1]
449
+ assert_equal graphs_dash[0], graphs_dash[2]
450
+ assert_same graphs_dash[0], graphs_dash[2]
451
+ assert_same graphs_dash[0].vertices[0], graphs_dash[2].vertices[0]
452
+ assert_same graphs_dash[0].edges[0], graphs_dash[2].edges[0]
453
+
454
+ assert_same graphs_dash[0].edges[0], graphs_dash[0].vertices[0].edges[0]
455
+ end
456
+
457
+ def test_rgraphum_marshal
458
+ vertex1 = Rgraphum::Vertex.new({id: 1, label: "vertex 1" })
459
+ vertex2 = Rgraphum::Vertex.new({id: 2, label: "vertex 2" })
460
+ vertices = [vertex1, vertex2]
461
+ edges = [
462
+ Rgraphum::Edge.new({source: vertex1, target: vertex2}),
463
+ ]
464
+ graph = Rgraphum::Graph.new(vertices: vertices, edges: edges)
465
+
466
+ tempfile = Tempfile.new("graph.txt")
467
+ graph.dump_to(tempfile.path)
468
+ graph_dash = Rgraphum::Graph.load_from(tempfile.path)
469
+
470
+ assert_equal graph, graph_dash
471
+ end
472
+
473
+ def test_simurate_1
474
+ after_graph = @graph_a.simulate("BAModel", round: 1)
475
+ assert_equal @graph_a.vertices.size + 1, after_graph.vertices.size
476
+ assert_equal @graph_a.edges.size + 1, after_graph.edges.size
477
+ end
478
+
479
+ def test_simurate_2
480
+ after_graph = @graph_a.simulate("BAModel", round: 1, edge_size: 2)
481
+ assert_equal @graph_a.vertices.size + 1, after_graph.vertices.size
482
+ assert_equal @graph_a.edges.size + 2, after_graph.edges.size
483
+ end
484
+
485
+ def test_simurate_3
486
+ after_graph = @graph_a.simulate("BAModel", round: 2, edge_size: 2)
487
+ assert_equal @graph_a.vertices.size + 2, after_graph.vertices.size
488
+ assert_equal @graph_a.edges.size + 4, after_graph.edges.size
489
+ end
490
+
491
+ private
492
+
493
+ def make_test_graph
494
+ @graph_a = Rgraphum::Graph.new
495
+ @graph_a.vertices = [
496
+ {:id => 1, :label => "hoge" },
497
+ {:id => 2, :label => "huga" },
498
+ ]
499
+ vertices_a = @graph_a.vertices
500
+ @graph_a.edges << { :id => 1, :source => vertices_a[0], :target => vertices_a[1], :weight => 1}
501
+ @graph_a.edges << { :id => 2, :source => vertices_a[1], :target => vertices_a[0], :weight => 1}
502
+
503
+ @graph_b = Rgraphum::Graph.new
504
+ vertices_b = @graph_b.vertices = [
505
+ {:id => 1, :label => "piyo" },
506
+ {:id => 2, :label => "hogeratte" },
507
+ ]
508
+ vertices_b = @graph_b.vertices
509
+ @graph_b.edges << { :id => 1, :source => vertices_b[0], :target => vertices_b[1], :weight => 2 }
510
+ @graph_b.edges << { :id => 2, :source => vertices_b[1], :target => vertices_b[0], :weight => 2 }
511
+ end
512
+ end
@@ -0,0 +1,145 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'rgraphum'
4
+ require 'test_helper'
5
+
6
+ class RgraphumGremlinTest < MiniTest::Test
7
+ # FIXME
8
+ class Rgraphum::Vertex
9
+ field :name, :age, :lang
10
+ end
11
+
12
+ def setup
13
+ make_gremlin_sample
14
+ end
15
+
16
+ def test_v
17
+ rg_assert_equal ({id:1,name:"marko", age:29}), @graph.v(1)
18
+ rg_assert_equal [{id:1,name:"marko",age:29},{id:2,name:"vadas",age:27},{id:3,name:"lop",lang:"java"}], @graph.v(1,2,3)
19
+ rg_assert_equal [{id:1,name:"marko",age:29},{id:2,name:"vadas",age:27},{id:3,name:"lop",lang:"java"}], @graph.v([1,2,3])
20
+ end
21
+
22
+ def test_e
23
+ assert_equal 10, @graph.e(10).id
24
+ assert_equal [10,11,12], @graph.e(10,11,12).id
25
+ assert_equal [10,11,12], @graph.e([10,11,12]).id
26
+ end
27
+
28
+ def test_addVertex
29
+ g = Rgraphum::Graph.new
30
+ rg_assert_equal({id:0}, g.addVertex())
31
+ rg_assert_equal({id:100}, g.addVertex(100))
32
+
33
+ rg_assert_equal({id:101,name:"stephen"}, g.addVertex(nil,{name:"stephen"}))
34
+ end
35
+
36
+ def test_addEdge
37
+ g = Rgraphum::Graph.new
38
+ v1 = g.addVertex(100)
39
+ v2 = g.addVertex(200)
40
+
41
+ e = g.addEdge(v1,v2,'friend')
42
+ rg_assert_equal v1, e.outV
43
+ rg_assert_equal v2, e.inV
44
+
45
+ e = g.addEdge(1000,v1,v2,'friend')
46
+ rg_assert_equal({:id=>1000, :source=>{:id=>100}, :target=>{:id=>200}, :label=>"friend", :weight=>1}, e)
47
+
48
+ e = g.addEdge(nil,v1,v2,'friend',{weight:0.75})
49
+ rg_assert_equal({:id=>1001, :source=>{:id=>100}, :target=>{:id=>200}, :label=>"friend", :weight=>0.75}, e)
50
+
51
+ end
52
+
53
+ def test_both
54
+ v = @graph.v(4)
55
+ rg_assert_equal [{id:1,name:"marko",age:29},{id:5,name:"ripple",lang:"java"},{id:3,name:"lop",lang:"java"}], v.both
56
+ rg_assert_equal [{id:1,name:"marko",age:29}], v.both('knows')
57
+ rg_assert_equal [{id:1,name:"marko",age:29},{id:5,name:"ripple",lang:"java"},{id:3,name:"lop",lang:"java"}], v.both('knows','created')
58
+ end
59
+
60
+ def test_bothE
61
+ v = @graph.v(4)
62
+ assert_equal [8,10,11], v.bothE.id
63
+ assert_equal [8], v.bothE('knows').id
64
+ assert_equal [8,10,11], v.bothE('knows','created').id
65
+ end
66
+
67
+ def test_outV_inV_both_V
68
+ e = @graph.e(12)
69
+ rg_assert_equal({id:6,name:"peter",age:35}, e.outV)
70
+ rg_assert_equal({id:3,name:"lop",lang:"java"}, e.inV)
71
+ rg_assert_equal [{id:6,name:"peter", age:35},{id:3,name:"lop",lang:"java"}], e.bothV
72
+ end
73
+
74
+ def test_id
75
+ v = @graph.V(:name,"marko")
76
+ assert_equal [1], v.id
77
+
78
+ v[0].id = 2000
79
+ assert_equal [2000], v.id
80
+ end
81
+
82
+ def test_V
83
+ assert_equal [1,2,3,4,5,6], @graph.V.id
84
+ rg_assert_equal [{id:1,name:"marko",age:29}], @graph.V(:name,"marko")
85
+ assert_equal ["marko"], @graph.V(:name,"marko").name
86
+ end
87
+
88
+ def test_E
89
+ assert_equal [7,8,9,10,11,12], @graph.E.id
90
+ assert_equal [0.5,1.0,0.4,1.0,0.4,0.2], @graph.E.weight
91
+ end
92
+
93
+ def test_in_inE
94
+ v = @graph.v(4)
95
+ rg_assert_equal [{id:1,name:"marko",age:29}], v.inE.outV
96
+ rg_assert_equal [{id:1,name:"marko",age:29}], v.in
97
+
98
+ v = @graph.v(3)
99
+ rg_assert_equal [{id:1,name:"marko",age:29},{id:4,name:"josh",age:32},{id:6,name:"peter", age:35}], v.in('created')
100
+ rg_assert_equal [{id:1,name:"marko",age:29},{id:4,name:"josh",age:32},{id:6,name:"peter", age:35}], v.inE('created').outV
101
+ end
102
+
103
+ def test_out_outE
104
+ v = @graph.v(1)
105
+ rg_assert_equal [{id:2,name:"vadas",age:27},{id:4,name:"josh",age:32},{id:3,name:"lop",lang:"java"}], v.outE.inV
106
+ rg_assert_equal [{id:2,name:"vadas",age:27},{id:4,name:"josh",age:32},{id:3,name:"lop",lang:"java"}], v.out
107
+
108
+ rg_assert_equal [{id:2,name:"vadas",age:27},{id:4,name:"josh",age:32}], v.outE('knows').inV
109
+ rg_assert_equal [{id:2,name:"vadas",age:27},{id:4,name:"josh",age:32}], v.out('knows')
110
+ end
111
+
112
+ def test_has
113
+ assert_equal ["marko"], @graph.V.has(:name, "marko").name
114
+ assert_equal [0.5,1.0], @graph.v(1).outE.has(:weight, Rgraphum::T.gte, 0.5 ).weight
115
+ assert_equal ["marko", "vadas", "josh", "peter"], @graph.V.has("age").name
116
+ assert_equal ["lop", "ripple"], @graph.V.has("age", nil ).name
117
+ end
118
+
119
+ def test_has_not
120
+ assert_equal [1.0,0.4], @graph.v(1).outE.hasNot(:weight, Rgraphum::T.eq, 0.5 ).weight
121
+ assert_equal ["marko", "vadas", "josh", "peter"], @graph.V.hasNot("age", nil ).name
122
+ end
123
+
124
+ private
125
+
126
+ def make_gremlin_sample
127
+ @graph = Rgraphum::Graph.new
128
+
129
+ # add vertices
130
+ @graph.vertices << {id:1,name:"marko", age:29 }
131
+ @graph.vertices << {id:2,name:"vadas", age:27 }
132
+ @graph.vertices << {id:3,name:"lop", lang:"java"}
133
+ @graph.vertices << {id:4,name:"josh", age:32 }
134
+ @graph.vertices << {id:5,name:"ripple", lang:"java"}
135
+ @graph.vertices << {id:6,name:"peter", age:35}
136
+
137
+ # add vertices
138
+ @graph.edges << {id:7, label:"knows", weight:0.5,source:1,target:2}
139
+ @graph.edges << {id:8, label:"knows", weight:1.0,source:1,target:4}
140
+ @graph.edges << {id:9, label:"created",weight:0.4,source:1,target:3}
141
+ @graph.edges << {id:10,label:"created",weight:1.0,source:4,target:5}
142
+ @graph.edges << {id:11,label:"created",weight:0.4,source:4,target:3}
143
+ @graph.edges << {id:12,label:"created",weight:0.2,source:6,target:3}
144
+ end
145
+ end
@@ -0,0 +1,20 @@
1
+ {
2
+ "result": [{
3
+ "@type": "d", "@rid": "#-2:0", "@version": 0,
4
+ "in": "#6:0",
5
+ "out": "#6:1",
6
+ "statusIds": "999999999999999999",
7
+ "weight": 1.0,
8
+ "created_at": 1373554121,
9
+ "@fieldTypes": "weight=f,created_at=l"
10
+ }, {
11
+ "@type": "d", "@rid": "#-2:1", "@version": 0,
12
+ "in": "#6:2",
13
+ "out": "#6:1",
14
+ "statusIds": "999999999999999999",
15
+ "weight": 1.0,
16
+ "created_at": 1373553637,
17
+ "@fieldTypes": "weight=f,created_at=l"
18
+ }
19
+ ]
20
+ }