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,194 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ def Rgraphum::Edge(hash_or_edge)
4
+ if hash_or_edge.instance_of?(Rgraphum::Edge)
5
+ hash_or_edge
6
+ else
7
+ Rgraphum::Edge.new(hash_or_edge)
8
+ end
9
+ end
10
+
11
+ class Rgraphum::Edge #< Hash
12
+ attr_accessor :graph
13
+ # attr_accessor :vertex
14
+
15
+ def initialize(fields={})
16
+ unless fields[:source] && fields[:target]
17
+ raise ArgumentError, "Edge.new: :source and :target options are required"
18
+ end
19
+
20
+ self.source = fields.delete(:source)
21
+ self.target = fields.delete(:target)
22
+
23
+ unknown_fields = fields.keys - @@field_names
24
+ unless unknown_fields.empty?
25
+ raise ArgumentError, "No such field(s) in Vertex: #{unknown_fields.join(', ')}"
26
+ end
27
+ fields.each do |name, value|
28
+ self.send("#{name}=", value)
29
+ end
30
+
31
+ self.weight ||= 1
32
+ end
33
+
34
+ # Gremlin: outV
35
+ #
36
+ # Get both outgoing tail vertex of the edge.
37
+ #
38
+ # gremlin> e = g.e(12)
39
+ # ==>e[12][6-created->3]
40
+ # gremlin> e.outV
41
+ # ==>v[6]
42
+ # gremlin> e.inV
43
+ # ==>v[3]
44
+ # gremlin> e.bothV
45
+ # ==>v[6]
46
+ # ==>v[3]
47
+ #
48
+ def outV
49
+ self.source
50
+ end
51
+ alias :out_v :outV
52
+
53
+ # Gremlin: inV
54
+ #
55
+ # Get both incoming head vertex of the edge.
56
+ #
57
+ # gremlin> e = g.e(12)
58
+ # ==>e[12][6-created->3]
59
+ # gremlin> e.outV
60
+ # ==>v[6]
61
+ # gremlin> e.inV
62
+ # ==>v[3]
63
+ # gremlin> e.bothV
64
+ # ==>v[6]
65
+ # ==>v[3]
66
+ #
67
+ def inV
68
+ self.target
69
+ end
70
+ alias :in_v :inV
71
+
72
+ # Gremlin: bothV
73
+ #
74
+ # Get both incoming and outgoing vertices of the edge.
75
+ #
76
+ # gremlin> e = g.e(12)
77
+ # ==>e[12][6-created->3]
78
+ # gremlin> e.outV
79
+ # ==>v[6]
80
+ # gremlin> e.inV
81
+ # ==>v[3]
82
+ # gremlin> e.bothV
83
+ # ==>v[6]
84
+ # ==>v[3]
85
+ #
86
+ def bothV
87
+ [outV, inV]
88
+ end
89
+ alias :both_v :bothV
90
+
91
+
92
+ # Non-Gremlin methods
93
+
94
+
95
+ # def id
96
+ # self[:id]
97
+ # end
98
+
99
+ def update_vertices(vertices)
100
+ self.source = find_vertex(:source, vertices)
101
+ self.target = find_vertex(:target, vertices)
102
+ end
103
+
104
+ def find_vertex(syn, vertices)
105
+ vertex = self[syn]
106
+ if vertex.instance_of?(Rgraphum::Vertex) and vertex.graph.equal?(@graph)
107
+ vertex
108
+ else
109
+ vertex = vertices.find_by_id(vertex)
110
+ end
111
+
112
+ unless vertex
113
+ p "edge has no #{syn}" if Rgraphum.verbose?
114
+ end
115
+ vertex
116
+ end
117
+
118
+ # accessors
119
+
120
+ # attr_accessor :id
121
+ # attr_accessor :source, :target
122
+ # attr_accessor :start, :end
123
+ # attr_accessor :label
124
+ # attr_accessor :weight
125
+ # attr_accessor :attvalues
126
+
127
+ def [](key)
128
+ send(key)
129
+ end
130
+
131
+ def []=(key, value)
132
+ send("#{key}=")
133
+ end
134
+
135
+ def ==(other)
136
+ if other.is_a?(Rgraphum::Edge)
137
+ return false unless id == other.id
138
+ else
139
+ return id == other
140
+ end
141
+ return false unless source == other.source
142
+ return false unless target == other.target
143
+ true
144
+ end
145
+
146
+ def to_hash
147
+ hash = {}
148
+ @@field_names.each do |name|
149
+ value = instance_variable_get("@#{name}")
150
+ if value
151
+ if value.respond_to?(:to_hash)
152
+ hash[name] = value.to_hash
153
+ else
154
+ hash[name] = value
155
+ end
156
+ end
157
+ end
158
+ hash
159
+ end
160
+
161
+ def to_s
162
+ to_hash.to_s
163
+ end
164
+
165
+ # FIXME
166
+ def self.field(*field_names)
167
+ @@field_names ||= []
168
+ field_names = [field_names] unless field_names.is_a?(Array)
169
+ field_names.each do |field_name|
170
+ @@field_names << field_name.to_sym
171
+ class_eval <<-EOT, __FILE__, __LINE__ + 1
172
+ def #{field_name}
173
+ # self[:#{field_name}]
174
+ @#{field_name}
175
+ end
176
+ def #{field_name}=(rhs)
177
+ # self[:#{field_name}] = rhs if respond_to?(:[]=) # FIXME
178
+ @#{field_name} = rhs
179
+ end
180
+ EOT
181
+ end
182
+ end
183
+
184
+ def self.has_field?(field_name)
185
+ @@field_names.include?(field_name.to_sym)
186
+ end
187
+
188
+ field :id
189
+ field :source, :target
190
+ field :start, :end
191
+ field :label
192
+ field :weight
193
+ field :attvalues
194
+ end
@@ -0,0 +1,161 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ def Rgraphum::Edges(array)
4
+ if array.instance_of?(Rgraphum::Edges)
5
+ array
6
+ else
7
+ Rgraphum::Edges.new(array)
8
+ end
9
+ end
10
+
11
+ class Rgraphum::Edges < Rgraphum::RgraphumArray
12
+ include Rgraphum::RgraphumArrayDividers
13
+
14
+ attr_accessor :vertex
15
+
16
+ # Gremlin: outV
17
+ #
18
+ # Get both outgoing tail vertex of the edge.
19
+ #
20
+ # gremlin> e = g.e(12)
21
+ # ==>e[12][6-created->3]
22
+ # gremlin> e.outV
23
+ # ==>v[6]
24
+ # gremlin> e.inV
25
+ # ==>v[3]
26
+ # gremlin> e.bothV
27
+ # ==>v[6]
28
+ # ==>v[3]
29
+ #
30
+ def outV
31
+ self.map{ |edge| edge.source }
32
+ end
33
+ alias :out_v :outV
34
+
35
+ # Gremlin: inV
36
+ #
37
+ # Get both incoming head vertex of the edge.
38
+ #
39
+ # gremlin> e = g.e(12)
40
+ # ==>e[12][6-created->3]
41
+ # gremlin> e.outV
42
+ # ==>v[6]
43
+ # gremlin> e.inV
44
+ # ==>v[3]
45
+ # gremlin> e.bothV
46
+ # ==>v[6]
47
+ # ==>v[3]
48
+ #
49
+ def inV
50
+ self.map{ |edge| edge.target }
51
+ end
52
+ alias :in_v :inV
53
+
54
+
55
+ # Non-Gremlin methods
56
+
57
+
58
+ def initialize(edge_hashes=[])
59
+ super()
60
+ @id_edge_map = {}
61
+ edge_hashes.each do |edge_hash|
62
+ self << edge_hash
63
+ end
64
+ end
65
+
66
+ def find_by_id(edge_id)
67
+ if edge_id.is_a?(Rgraphum::Edge)
68
+ id = edge_id.id
69
+ else
70
+ id = edge_id
71
+ end
72
+ @id_edge_map[id]
73
+ end
74
+
75
+ def find_vertex(vertex)
76
+ vertices = @graph.vertices
77
+
78
+ if vertex.is_a?(Rgraphum::Vertex) and vertex.graph.equal?(@graph)
79
+ vertex
80
+ else
81
+ vertices.find_by_id(vertex)
82
+ end
83
+ end
84
+
85
+ def build(edge_or_hash, recursive=true)
86
+ if @vertex and @vertex.graph
87
+ if recursive
88
+ edge = @vertex.graph.edges.build(edge_or_hash, false)
89
+ else
90
+ edge = edge_or_hash
91
+ original_push_1 edge
92
+ end
93
+ else
94
+ edge = Rgraphum::Edge(edge_or_hash)
95
+ if @graph
96
+ source_vertex = find_vertex(edge.source)
97
+ target_vertex = find_vertex(edge.target)
98
+ raise ArgumentError, "Source vertex is required" unless source_vertex
99
+ raise ArgumentError, "Target vertex is required" unless target_vertex
100
+ edge.source = source_vertex
101
+ edge.target = target_vertex
102
+
103
+ edge.id = new_id(edge.id)
104
+ edge.graph = @graph
105
+ edge.source.edges.build(edge, false)
106
+ edge.target.edges.build(edge, false)
107
+ end
108
+ original_push_1 edge
109
+ end
110
+
111
+ @id_edge_map[edge.id] = edge
112
+
113
+ edge
114
+ end
115
+
116
+ alias :original_push_1 :<<
117
+ def <<(edge_or_hash)
118
+ build(edge_or_hash)
119
+ self
120
+ end
121
+
122
+ alias :original_push_m :push
123
+ def push(*edge_hashes)
124
+ edge_hashes.each do |edge_hash|
125
+ build(edge_hash)
126
+ end
127
+ self
128
+ end
129
+
130
+ # Called from delete_if, reject! and reject
131
+ def delete(edge_or_id, recursive=true)
132
+ id = edge_or_id.id rescue edge_or_id
133
+ target_edge = find_by_id(id)
134
+
135
+ return edge_or_id unless target_edge
136
+ deleted_edge = super(target_edge)
137
+
138
+ if @vertex and @vertex.graph
139
+ if recursive
140
+ @vertex.graph.edges.delete(target_edge, false)
141
+ end
142
+ else
143
+ if @graph
144
+ target_edge.source.edges.delete(target_edge, false)
145
+ target_edge.target.edges.delete(target_edge, false)
146
+ end
147
+ end
148
+ @id_edge_map.delete id
149
+
150
+ deleted_edge
151
+ end
152
+
153
+ # def weights
154
+ # self.map{ |edge| edge.weight }
155
+ # end
156
+
157
+ protected :original_push_1
158
+ protected :original_push_m
159
+
160
+ private
161
+ end
@@ -0,0 +1,79 @@
1
+ class CosineSimilarityMatrix
2
+
3
+ inline do |builder|
4
+ builder.include "<math.h>"
5
+ builder.add_compile_flags "-fopenmp"
6
+ builder.c <<-EOF
7
+
8
+ VALUE c_similarity( VALUE ary ){
9
+ int i,j,k;
10
+
11
+ int m = RARRAY_LEN(ary);
12
+ int n = RARRAY_LEN(rb_ary_entry(ary,0));
13
+
14
+ float **val;
15
+ float *s;
16
+
17
+ float dot_ab = 0.0;
18
+ float sq_sum_a = 0.0;
19
+ float sq_sum_b = 0.0;
20
+ VALUE sim_ary = rb_ary_new();
21
+ VALUE sim = rb_ary_new();
22
+
23
+ // float val[m][n];
24
+ val = malloc(sizeof(float *) * m);
25
+ for (i=0;i<m;i++){
26
+ val[i] = malloc(sizeof(float) * n);
27
+ }
28
+
29
+ // float s[m][n];
30
+ s = malloc( sizeof(float) * m * m);
31
+
32
+ // init
33
+ for( i=0; i<m; i++){
34
+ for( j=0; j<n; j++){
35
+ val[i][j] = NUM2DBL( rb_ary_entry(rb_ary_entry(ary,i),j) );
36
+ }
37
+ }
38
+
39
+
40
+ for( i=0; i<m; i++){
41
+ for( j=0; j<m; j++){
42
+ if( i == j ){
43
+ s[i*m + j] = 1.0;
44
+ } else if( i > j ){
45
+ s[i*m + j] = s[j*m + i];
46
+ } else {
47
+ dot_ab = 0.0;
48
+ sq_sum_a = 0.0;
49
+ sq_sum_b = 0.0;
50
+
51
+ for( k=0; k<n; k++){
52
+ dot_ab += ( val[i][k] * val[j][k] );
53
+ sq_sum_a += ( val[i][k] * val[i][k] );
54
+ sq_sum_b += ( val[j][k] * val[j][k] );
55
+ }
56
+ s[i*m + j] = dot_ab / ( sqrt( sq_sum_a * sq_sum_b) );
57
+
58
+ }
59
+ }
60
+ }
61
+
62
+ for( i=0; i<m; i++){
63
+ sim = rb_ary_new();
64
+ for( j=0; j<m; j++){
65
+ rb_ary_push( sim, DBL2NUM(s[i*m + j] ));
66
+ }
67
+ rb_ary_push( sim_ary, sim );
68
+ }
69
+
70
+ free(val);
71
+ free(s);
72
+
73
+ return sim_ary;
74
+ }
75
+
76
+ EOF
77
+ end
78
+ end
79
+
@@ -0,0 +1,22 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ #require 'numru/lapack'
4
+
5
+ class Rgraphum::Analyzer::LinearRegression
6
+ def analyze(x_array, y_array, degree=1, round=5)
7
+
8
+ nrow = x_array.size
9
+ nx = NArray.to_na(x_array)
10
+ nxm = NMatrix.sfloat(nrow,degree + 1)
11
+
12
+ (degree + 1).times.each do |d|
13
+ nxm[(degree - d) * nrow] = nx ** d
14
+ end
15
+
16
+ ny = NArray.to_na([y_array])
17
+ s, rank, work, info, b = NumRu::Lapack.dgelsd(nxm, ny, 0)
18
+
19
+ b.to_a[0].map { |n| n.round(round) }
20
+
21
+ end
22
+ end
@@ -0,0 +1,52 @@
1
+ # encoding: utf-8
2
+
3
+ require 'matrix'
4
+ require 'inline'
5
+
6
+ class TfIdf
7
+
8
+ inline do |builder|
9
+ builder.include "<math.h>"
10
+ builder.add_compile_flags "-fopenmp"
11
+ builder.c <<-EOF
12
+
13
+ VALUE tf_idf( VALUE ary ){
14
+ int i,j,k;
15
+ int m = RARRAY_LEN(ary);
16
+ int n = RARRAY_LEN(rb_ary_entry(ary,0));
17
+
18
+ float words_amount;
19
+ float non_word;
20
+ float idfT;
21
+
22
+ VALUE tf_idf = rb_ary_new();
23
+ VALUE tf_idf_ary = rb_ary_new();
24
+
25
+ /* tf-idf and output*/
26
+ for( i=0; i<m; i++){
27
+
28
+ /* tf base */
29
+ words_amount = 0.0;
30
+ for( j=0; j<n; j++){
31
+ words_amount = words_amount + FIX2INT( rb_ary_entry(rb_ary_entry(ary,i),j) );
32
+ }
33
+
34
+ tf_idf = rb_ary_new();
35
+ for( j=0; j<n; j++){
36
+ non_word = 0.0;
37
+ for( k=0; k<m; k++){
38
+ if( FIX2INT( rb_ary_entry(rb_ary_entry(ary,k),j)) == 0 ){
39
+ non_word = non_word + 1;
40
+ }
41
+ }
42
+ idfT = log( m / ( m - non_word ) );
43
+ rb_ary_push( tf_idf, DBL2NUM( ( FIX2INT(rb_ary_entry(rb_ary_entry(ary,i),j)) / words_amount ) * idfT ));
44
+ }
45
+ rb_ary_push( tf_idf_ary, tf_idf );
46
+ }
47
+
48
+ return tf_idf_ary;
49
+ }
50
+ EOF
51
+ end
52
+ end
@@ -0,0 +1,193 @@
1
+ # -*- coding: utf-8 -*-
2
+ class Rgraphum::Graph
3
+ end
4
+
5
+ module Rgraphum::Graph::Gremlin
6
+
7
+ # Gremlin: Graph.v
8
+ #
9
+ # Get a vertex or set of vertices by providing one or more vertex identifiers.
10
+ # The identifiers must be the identifiers assigned by the underlying graph implementation.
11
+ #
12
+ # gremlin> g.v(1)
13
+ # ==>v[1]
14
+ # gremlin> g.v(1,2,3)
15
+ # ==>v[1]
16
+ # ==>v[2]
17
+ # ==>v[3]
18
+ # gremlin> ids = [1,2,3]
19
+ # ==>1
20
+ # ==>2
21
+ # ==>3
22
+ # gremlin> g.v(ids.toArray())
23
+ # ==>v[1]
24
+ # ==>v[2]
25
+ # ==>v[3]
26
+ #
27
+ # @param [Array] ids
28
+ def v(*ids)
29
+ ids = ids.flatten
30
+
31
+ return @vertices.find_by_id(ids[0]) if ids.size == 1
32
+
33
+ new_vertices = Rgraphum::Vertices.new
34
+ ids.each do |id|
35
+ new_vertices << @vertices.find_by_id(id)
36
+ end
37
+
38
+ new_vertices
39
+ end
40
+
41
+ # Gremlin: Graph.e
42
+ #
43
+ # Get an edge or set of edges by providing one or more edge identifiers.
44
+ # The identifiers must be the identifiers assigned by the underlying graph implementation.
45
+ #
46
+ # gremlin> g.e(10)
47
+ # ==>e[10][4-created->5]
48
+ # gremlin> g.e(10,11,12)
49
+ # ==>e[10][4-created->5]
50
+ # ==>e[11][4-created->3]
51
+ # ==>e[12][6-created->3]
52
+ # gremlin> ids = [10,11,12]
53
+ # ==>10
54
+ # ==>11
55
+ # ==>12
56
+ # gremlin> g.e(ids.toArray())
57
+ # ==>e[10][4-created->5]
58
+ # ==>e[11][4-created->3]
59
+ # ==>e[12][6-created->3]
60
+ #
61
+ # @param [Array] ids
62
+ def e(*ids)
63
+ ids = ids.flatten
64
+
65
+ return @edges.find_by_id(ids[0]) if ids.size == 1
66
+
67
+ new_edges = Rgraphum::Edges.new
68
+ ids.each do |id|
69
+ new_edges << @edges.find_by_id(id)
70
+ end
71
+
72
+ new_edges
73
+ end
74
+
75
+ # Gremlin: V
76
+ #
77
+ # The vertex iterator for the graph.
78
+ # Utilize this to iterate through all the vertices in the graph.
79
+ # Use with care on large graphs unless used in combination with a key index lookup.
80
+ #
81
+ # gremlin> g.V
82
+ # ==>v[3]
83
+ # ==>v[2]
84
+ # ==>v[1]
85
+ # ==>v[6]
86
+ # ==>v[5]
87
+ # ==>v[4]
88
+ # gremlin> g.V("name", "marko")
89
+ # ==>v[1]
90
+ # gremlin> g.V("name", "marko").name
91
+ # ==>marko
92
+ #
93
+ # @param [String] key
94
+ # @param [String] value
95
+ def V(key=nil,value=nil)
96
+ if key
97
+ @vertices.where( { key => value } ).all
98
+ else
99
+ @vertices
100
+ end
101
+ end
102
+
103
+
104
+ # Gremlin: E
105
+ #
106
+ # The edge iterator for the graph.
107
+ # Utilize this to iterate through all the edges in the graph.
108
+ # Use with care on large graphs.
109
+ #
110
+ # gremlin> g.E
111
+ # ==>e[10][4-created->5]
112
+ # ==>e[7][1-knows->2]
113
+ # ==>e[9][1-created->3]
114
+ # ==>e[8][1-knows->4]
115
+ # ==>e[11][4-created->3]
116
+ # ==>e[12][6-created->3]
117
+ # gremlin> g.E.weight
118
+ # ==>1.0
119
+ # ==>0.5
120
+ # ==>0.4
121
+ # ==>1.0
122
+ # ==>0.4
123
+ # ==>0.2
124
+ #
125
+ def E(key=nil,value=nil)
126
+ if key
127
+ @edges.find_all {|edge| vertex.send(key) == value }
128
+ else
129
+ @edges
130
+ end
131
+ end
132
+
133
+ # Gremlin: Graph.addVertex
134
+ #
135
+ # Adds a vertex to the graph.
136
+ # Note that most graph implementations ignore the identifier supplied to addVertex.
137
+ #
138
+ # gremlin> g = new TinkerGraph()
139
+ # ==>tinkergraph[vertices:0 edges:0]
140
+ # gremlin> g.addVertex()
141
+ # ==>v[0]
142
+ # gremlin> g.addVertex(100)
143
+ # ==>v[100]
144
+ # gremlin> g.addVertex(null,[name:"stephen"])
145
+ # ==>v[1]
146
+ #
147
+ def addVertex(id=nil, vertex=nil)
148
+ vertex ||= Rgraphum::Vertex.new(id: id)
149
+ vertex = Rgraphum::Vertex.new(vertex) unless vertex.is_a?(Rgraphum::Vertex) # FIXME
150
+ @vertices << vertex
151
+ @vertices[-1]
152
+ end
153
+ alias :add_vertex :addVertex
154
+
155
+ # Gremlin: Graph.addEdge
156
+ #
157
+ # Adds an edge to the graph.
158
+ # Note that most graph implementations ignore the identifier supplied to addEdge.
159
+ #
160
+ # gremlin> g = new TinkerGraph()
161
+ # ==>tinkergraph[vertices:0 edges:0]
162
+ # gremlin> v1 = g.addVertex(100)
163
+ # ==>v[100]
164
+ # gremlin> v2 = g.addVertex(200)
165
+ # ==>v[200]
166
+ # gremlin> g.addEdge(v1,v2,'friend')
167
+ # ==>e[0][100-friend->200]
168
+ # gremlin> g.addEdge(1000,v1,v2,'buddy')
169
+ # ==>e[1000][100-buddy->200]
170
+ # gremlin> g.addEdge(null,v1,v2,'pal',[weight:0.75f])
171
+ # ==>e[1][100-pal->200]
172
+ #
173
+ def addEdge( *params )
174
+ if params.size == 3
175
+ source = params[0]; target = params[1]; label = params[2]
176
+ @edges << Rgraphum::Edge.new(source: source, target: target, label: label)
177
+ @edges[-1]
178
+ elsif params.size == 4
179
+ id = params[0]; source = params[1]; target = params[2]; label = params[3]
180
+ @edges.build(id: id, source: source, target: target, label: label)
181
+ elsif params.size == 5
182
+ edge_hash = {}
183
+ edge_hash[:id] = params[0];
184
+ edge_hash[:source] = params[1];
185
+ edge_hash[:target] = params[2];
186
+ edge_hash[:label] = params[3];
187
+ edge_hash.merge!(params[4])
188
+ @edges.build(edge_hash)
189
+ end
190
+ end
191
+ alias :add_edge :addEdge
192
+
193
+ end