rgraphum 0.0.1.alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ }