rgraphum 0.0.1.alpha
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +26 -0
- data/GLOSSARIES.md +108 -0
- data/GREMLIN.md +1398 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +136 -0
- data/Rakefile +16 -0
- data/bin/.irbrc +41 -0
- data/bin/rgraphum_console +61 -0
- data/bin/rgraphum_runner +57 -0
- data/examples/ba_model/make.rb +19 -0
- data/examples/ba_model/make_dummy_twitter_rt_data.rb +0 -0
- data/examples/basic/check_modularity.rb +27 -0
- data/examples/basic/make_graph.rb +12 -0
- data/examples/parser/dot.rb +28 -0
- data/examples/sis_model/lifegame.rb +161 -0
- data/graph_struct.jpg +0 -0
- data/lib/rgraphum/analyzer/linear_regression.rb +31 -0
- data/lib/rgraphum/analyzer/meme_tracker.rb +296 -0
- data/lib/rgraphum/analyzer/twitter/rt_at_mark.rb +45 -0
- data/lib/rgraphum/analyzer.rb +8 -0
- data/lib/rgraphum/cluster.rb +67 -0
- data/lib/rgraphum/communities.rb +65 -0
- data/lib/rgraphum/community.rb +86 -0
- data/lib/rgraphum/cosine_similarity_matrix.rb +40 -0
- data/lib/rgraphum/edge.rb +194 -0
- data/lib/rgraphum/edges.rb +161 -0
- data/lib/rgraphum/ext/cosine_similarity_matrix.rb +79 -0
- data/lib/rgraphum/ext/linear_regression.rb +22 -0
- data/lib/rgraphum/ext/tf_idf.rb +52 -0
- data/lib/rgraphum/graph/gremlin.rb +193 -0
- data/lib/rgraphum/graph/math/clustering_coefficient.rb +53 -0
- data/lib/rgraphum/graph/math/community_detection.rb +141 -0
- data/lib/rgraphum/graph/math/degree_distribution.rb +50 -0
- data/lib/rgraphum/graph/math/dijkstra.rb +331 -0
- data/lib/rgraphum/graph/math.rb +45 -0
- data/lib/rgraphum/graph.rb +267 -0
- data/lib/rgraphum/importer.rb +97 -0
- data/lib/rgraphum/marshal.rb +26 -0
- data/lib/rgraphum/motifs.rb +8 -0
- data/lib/rgraphum/parsers/flare.rb +42 -0
- data/lib/rgraphum/parsers/gephi.rb +193 -0
- data/lib/rgraphum/parsers/graphviz.rb +78 -0
- data/lib/rgraphum/parsers/miserables.rb +54 -0
- data/lib/rgraphum/parsers.rb +32 -0
- data/lib/rgraphum/path.rb +37 -0
- data/lib/rgraphum/query.rb +130 -0
- data/lib/rgraphum/rgraphum_array.rb +159 -0
- data/lib/rgraphum/rgraphum_array_dividers.rb +43 -0
- data/lib/rgraphum/rgraphum_random.rb +5 -0
- data/lib/rgraphum/simulator/ba_model.rb +140 -0
- data/lib/rgraphum/simulator/sir_model.rb +178 -0
- data/lib/rgraphum/simulator/sis_model.rb +158 -0
- data/lib/rgraphum/simulator.rb +29 -0
- data/lib/rgraphum/statistic/power_law.rb +9 -0
- data/lib/rgraphum/t.rb +12 -0
- data/lib/rgraphum/tf_idf.rb +27 -0
- data/lib/rgraphum/version.rb +3 -0
- data/lib/rgraphum/vertex.rb +354 -0
- data/lib/rgraphum/vertices.rb +97 -0
- data/lib/rgraphum.rb +38 -0
- data/performance/add-vertices-edges.rb +20 -0
- data/performance/add-vertices.rb +12 -0
- data/performance/build-graph.rb +19 -0
- data/performance/delete-graph.rb +24 -0
- data/performance/delete-vertices.rb +25 -0
- data/performance/refer-graph.rb +23 -0
- data/rgraphum.gemspec +30 -0
- data/test/lib/rgraphum/analyzer/linear_regression_test.rb +20 -0
- data/test/lib/rgraphum/analyzer/meme_tracker_test.rb +383 -0
- data/test/lib/rgraphum/analyzer/twitter/rt_at_mark_test.rb +120 -0
- data/test/lib/rgraphum/array_test.rb +95 -0
- data/test/lib/rgraphum/bubble_test.rb +7 -0
- data/test/lib/rgraphum/communities_test.rb +53 -0
- data/test/lib/rgraphum/cosine_similarity_test.rb +18 -0
- data/test/lib/rgraphum/edge_test.rb +89 -0
- data/test/lib/rgraphum/edges_test.rb +178 -0
- data/test/lib/rgraphum/graph_builder_test.rb +64 -0
- data/test/lib/rgraphum/graph_dup_test.rb +199 -0
- data/test/lib/rgraphum/graph_plus_test.rb +80 -0
- data/test/lib/rgraphum/graph_test.rb +512 -0
- data/test/lib/rgraphum/gremlin_test.rb +145 -0
- data/test/lib/rgraphum/importers/idg_json_edges.json +20 -0
- data/test/lib/rgraphum/importers/idg_json_test.rb +207 -0
- data/test/lib/rgraphum/importers/idg_json_vertices.json +46 -0
- data/test/lib/rgraphum/math/average_distance_matrix_test.rb +142 -0
- data/test/lib/rgraphum/math/clustering_coefficient_test.rb +219 -0
- data/test/lib/rgraphum/math/community_test.rb +78 -0
- data/test/lib/rgraphum/math/degree_distribution_test.rb +40 -0
- data/test/lib/rgraphum/math/dijkstra_test.rb +146 -0
- data/test/lib/rgraphum/math/modularity_test.rb +154 -0
- data/test/lib/rgraphum/math/quick_average_distance_matrix_test.rb +84 -0
- data/test/lib/rgraphum/path_test.rb +44 -0
- data/test/lib/rgraphum/query/enumerable_test.rb +42 -0
- data/test/lib/rgraphum/query/where_operators_test.rb +75 -0
- data/test/lib/rgraphum/query/where_test.rb +59 -0
- data/test/lib/rgraphum/simulator/ba_model_test.rb +75 -0
- data/test/lib/rgraphum/simulator/sir_model_test.rb +513 -0
- data/test/lib/rgraphum/simulator/sis_model_test.rb +478 -0
- data/test/lib/rgraphum/simulator_test.rb +22 -0
- data/test/lib/rgraphum/tf_idf_test.rb +30 -0
- data/test/lib/rgraphum/vertex_test.rb +50 -0
- data/test/lib/rgraphum/vertices_test.rb +180 -0
- data/test/test_helper.rb +98 -0
- data/tmp/.gitkeep +0 -0
- 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
|
+
}
|