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,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