neo4j 1.0.0.beta.9 → 1.0.0.beta.10
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +5 -1971
- data/lib/neo4j/mapping/class_methods/relationship.rb +2 -2
- data/lib/neo4j/mapping/decl_relationship_dsl.rb +6 -1
- data/lib/neo4j/mapping/has_n.rb +17 -1
- data/lib/neo4j/node_traverser.rb +14 -1
- data/lib/neo4j/rails/model.rb +127 -31
- data/lib/neo4j/rails/tx_methods.rb +11 -0
- data/lib/neo4j/rails/value.rb +44 -1
- data/lib/neo4j/version.rb +1 -1
- data/lib/neo4j.rb +1 -0
- metadata +4 -59
- data/lib/neo4j.old/batch_inserter.rb +0 -144
- data/lib/neo4j.old/config.rb +0 -138
- data/lib/neo4j.old/event_handler.rb +0 -73
- data/lib/neo4j.old/extensions/activemodel.rb +0 -158
- data/lib/neo4j.old/extensions/aggregate/aggregate_enum.rb +0 -40
- data/lib/neo4j.old/extensions/aggregate/ext/node_mixin.rb +0 -69
- data/lib/neo4j.old/extensions/aggregate/node_aggregate.rb +0 -8
- data/lib/neo4j.old/extensions/aggregate/node_aggregate_mixin.rb +0 -331
- data/lib/neo4j.old/extensions/aggregate/node_aggregator.rb +0 -216
- data/lib/neo4j.old/extensions/aggregate/node_group.rb +0 -43
- data/lib/neo4j.old/extensions/aggregate/prop_group.rb +0 -30
- data/lib/neo4j.old/extensions/aggregate/property_enum.rb +0 -24
- data/lib/neo4j.old/extensions/aggregate/props_aggregate.rb +0 -8
- data/lib/neo4j.old/extensions/aggregate/props_aggregate_mixin.rb +0 -31
- data/lib/neo4j.old/extensions/aggregate/props_aggregator.rb +0 -80
- data/lib/neo4j.old/extensions/aggregate.rb +0 -12
- data/lib/neo4j.old/extensions/find_path.rb +0 -117
- data/lib/neo4j.old/extensions/graph_algo/all_simple_paths.rb +0 -133
- data/lib/neo4j.old/extensions/graph_algo/neo4j-graph-algo-0.3.jar +0 -0
- data/lib/neo4j.old/extensions/graph_algo.rb +0 -1
- data/lib/neo4j.old/extensions/reindexer.rb +0 -104
- data/lib/neo4j.old/extensions/rest/rest.rb +0 -336
- data/lib/neo4j.old/extensions/rest/rest_mixin.rb +0 -193
- data/lib/neo4j.old/extensions/rest/server.rb +0 -50
- data/lib/neo4j.old/extensions/rest/stubs.rb +0 -141
- data/lib/neo4j.old/extensions/rest.rb +0 -21
- data/lib/neo4j.old/extensions/rest_master.rb +0 -34
- data/lib/neo4j.old/extensions/rest_slave.rb +0 -31
- data/lib/neo4j.old/extensions/tx_tracker.rb +0 -392
- data/lib/neo4j.old/indexer.rb +0 -187
- data/lib/neo4j.old/jars/geronimo-jta_1.1_spec-1.1.1.jar +0 -0
- data/lib/neo4j.old/jars/neo4j-kernel-1.0.jar +0 -0
- data/lib/neo4j.old/jars.rb +0 -6
- data/lib/neo4j.old/mixins/java_list_mixin.rb +0 -139
- data/lib/neo4j.old/mixins/java_node_mixin.rb +0 -205
- data/lib/neo4j.old/mixins/java_property_mixin.rb +0 -169
- data/lib/neo4j.old/mixins/java_relationship_mixin.rb +0 -60
- data/lib/neo4j.old/mixins/migration_mixin.rb +0 -157
- data/lib/neo4j.old/mixins/node_mixin.rb +0 -249
- data/lib/neo4j.old/mixins/property_class_methods.rb +0 -265
- data/lib/neo4j.old/mixins/rel_class_methods.rb +0 -167
- data/lib/neo4j.old/mixins/relationship_mixin.rb +0 -103
- data/lib/neo4j.old/neo.rb +0 -247
- data/lib/neo4j.old/node.rb +0 -49
- data/lib/neo4j.old/reference_node.rb +0 -15
- data/lib/neo4j.old/relationship.rb +0 -85
- data/lib/neo4j.old/relationships/decl_relationship_dsl.rb +0 -164
- data/lib/neo4j.old/relationships/has_list.rb +0 -101
- data/lib/neo4j.old/relationships/has_n.rb +0 -129
- data/lib/neo4j.old/relationships/node_traverser.rb +0 -138
- data/lib/neo4j.old/relationships/relationship_dsl.rb +0 -149
- data/lib/neo4j.old/relationships/traversal_position.rb +0 -50
- data/lib/neo4j.old/relationships/wrappers.rb +0 -51
- data/lib/neo4j.old/search_result.rb +0 -72
- data/lib/neo4j.old/transaction.rb +0 -254
- data/lib/neo4j.old/version.rb +0 -3
@@ -35,7 +35,7 @@ module Neo4j::Mapping
|
|
35
35
|
Neo4j::Mapping::HasN.new(self, dsl).rels
|
36
36
|
end}, __FILE__, __LINE__)
|
37
37
|
|
38
|
-
_decl_rels[rel_type.to_sym] = Neo4j::Mapping::DeclRelationshipDsl.new(rel_type, params)
|
38
|
+
_decl_rels[rel_type.to_sym] = Neo4j::Mapping::DeclRelationshipDsl.new(rel_type, false, params)
|
39
39
|
end
|
40
40
|
|
41
41
|
|
@@ -84,7 +84,7 @@ module Neo4j::Mapping
|
|
84
84
|
[*r][0]
|
85
85
|
end}, __FILE__, __LINE__)
|
86
86
|
|
87
|
-
_decl_rels[rel_type.to_sym] = Neo4j::Mapping::DeclRelationshipDsl.new(rel_type, params)
|
87
|
+
_decl_rels[rel_type.to_sym] = Neo4j::Mapping::DeclRelationshipDsl.new(rel_type, true, params)
|
88
88
|
end
|
89
89
|
|
90
90
|
end
|
@@ -35,15 +35,20 @@ module Neo4j::Mapping
|
|
35
35
|
attr_reader :to_type, :to_class, :cascade_delete_prop_name, :counter, :rel_id, :direction
|
36
36
|
CASCADE_DELETE_PROP_NAMES = {:outgoing => :_cascade_delete_outgoing, :incoming => :_cascade_delete_incoming}
|
37
37
|
|
38
|
-
def initialize(rel_id, params)
|
38
|
+
def initialize(rel_id, has_one, params)
|
39
39
|
@direction = :outgoing
|
40
40
|
@rel_id = rel_id
|
41
41
|
@to_type = rel_id
|
42
|
+
@has_one = has_one
|
42
43
|
@namespace_type = rel_id
|
43
44
|
@cascade_delete_prop_name = CASCADE_DELETE_PROP_NAMES[params[:cascade_delete]]
|
44
45
|
@counter = params[:counter] == true
|
45
46
|
end
|
46
47
|
|
48
|
+
def has_one?
|
49
|
+
@has_one
|
50
|
+
end
|
51
|
+
|
47
52
|
# If a counter was specified in the dsl for counting number of nodes in this relationship.
|
48
53
|
#
|
49
54
|
def counter?
|
data/lib/neo4j/mapping/has_n.rb
CHANGED
@@ -24,6 +24,22 @@ module Neo4j
|
|
24
24
|
@traverser = Neo4j::NodeTraverser.new(node._java_node, @dsl.namespace_type, @direction)
|
25
25
|
end
|
26
26
|
|
27
|
+
def size
|
28
|
+
[*self].size
|
29
|
+
end
|
30
|
+
|
31
|
+
alias_method :length, :size
|
32
|
+
|
33
|
+
def [](index)
|
34
|
+
each_with_index {|node,i| break node if index == i}
|
35
|
+
end
|
36
|
+
|
37
|
+
# Pretend we are an array - this is neccessarly for Rails actionpack/actionview/formhelper to work with this
|
38
|
+
def is_a?(type)
|
39
|
+
# ActionView requires this for nested attributes to work
|
40
|
+
return true if Array == type
|
41
|
+
super
|
42
|
+
end
|
27
43
|
|
28
44
|
# Returns the relationships instead of the nodes.
|
29
45
|
#
|
@@ -43,7 +59,7 @@ module Neo4j
|
|
43
59
|
# morpheus.friends.depth(3).each { ... }
|
44
60
|
#
|
45
61
|
# ==== Arguments
|
46
|
-
# d
|
62
|
+
# d:: the depth or :all if traversing to the end of the network (symbol or fixnum)
|
47
63
|
# ==== Return
|
48
64
|
# self
|
49
65
|
#
|
data/lib/neo4j/node_traverser.rb
CHANGED
@@ -51,6 +51,9 @@ module Neo4j
|
|
51
51
|
end
|
52
52
|
|
53
53
|
|
54
|
+
def to_s
|
55
|
+
"NodeTraverser [from: #{@from.neo_id} depth: #{@depth} type: #{@type} dir:#{@dir}"
|
56
|
+
end
|
54
57
|
|
55
58
|
def <<(other_node)
|
56
59
|
new(other_node)
|
@@ -118,10 +121,20 @@ module Neo4j
|
|
118
121
|
[*self].size
|
119
122
|
end
|
120
123
|
|
124
|
+
alias_method :length, :size
|
125
|
+
|
126
|
+
def [](index)
|
127
|
+
each_with_index {|node,i| break node if index == i}
|
128
|
+
end
|
129
|
+
|
130
|
+
def empty?
|
131
|
+
first == nil
|
132
|
+
end
|
133
|
+
|
121
134
|
def each
|
122
135
|
iter = iterator
|
123
136
|
while (iter.hasNext) do
|
124
|
-
yield
|
137
|
+
yield iter.next.wrapper
|
125
138
|
end
|
126
139
|
end
|
127
140
|
|
data/lib/neo4j/rails/model.rb
CHANGED
@@ -7,6 +7,8 @@ class Neo4j::Model
|
|
7
7
|
extend ActiveModel::Naming
|
8
8
|
extend ActiveModel::Callbacks
|
9
9
|
extend Neo4j::Validations::ClassMethods
|
10
|
+
extend Neo4j::TxMethods
|
11
|
+
|
10
12
|
define_model_callbacks :create, :save, :update, :destroy
|
11
13
|
|
12
14
|
|
@@ -39,7 +41,7 @@ class Neo4j::Model
|
|
39
41
|
# --------------------------------------
|
40
42
|
|
41
43
|
def id
|
42
|
-
|
44
|
+
neo_id.nil? ? nil : neo_id.to_s
|
43
45
|
end
|
44
46
|
|
45
47
|
def to_param
|
@@ -83,7 +85,7 @@ class Neo4j::Model
|
|
83
85
|
|
84
86
|
|
85
87
|
def read_attribute_for_validation(key)
|
86
|
-
respond_to?(key)? send(key) : self[key]
|
88
|
+
respond_to?(key) ? send(key) : self[key]
|
87
89
|
end
|
88
90
|
|
89
91
|
def attributes=(values)
|
@@ -98,26 +100,63 @@ class Neo4j::Model
|
|
98
100
|
|
99
101
|
|
100
102
|
# Updates this resource with all the attributes from the passed-in Hash and requests that the record be saved.
|
101
|
-
# If the saving fails because of a connection or remote service error, an exception will be raised.
|
102
103
|
# If saving fails because the resource is invalid then false will be returned.
|
103
104
|
def update_attributes(attributes)
|
104
|
-
Neo4j::Rails::Transaction.running? ? update_attributes_in_tx(attributes) : Neo4j::Rails::Transaction.run { update_attributes_in_tx(attributes) }
|
105
|
-
end
|
106
|
-
|
107
|
-
def update_attributes_in_tx(attributes)
|
108
105
|
self.attributes=attributes
|
109
106
|
save
|
110
107
|
end
|
111
108
|
|
112
109
|
def update_attributes!(attributes)
|
113
|
-
Neo4j::Rails::Transaction.running? ? update_attributes_in_tx!(attributes) : Neo4j::Rails::Transaction.run { update_attributes_in_tx!(attributes) }
|
114
|
-
end
|
115
|
-
|
116
|
-
def update_attributes_in_tx!(attributes)
|
117
110
|
self.attributes=attributes
|
118
111
|
save!
|
119
112
|
end
|
120
113
|
|
114
|
+
def update_nested_attributes(rel_type, clazz, has_one, attr, options)
|
115
|
+
allow_destroy,reject_if = [options[:allow_destroy], options[:reject_if]] if options
|
116
|
+
|
117
|
+
if new?
|
118
|
+
# We are updating a node that was created with the 'new' method.
|
119
|
+
# The relationship will only be kept in the Value object.
|
120
|
+
outgoing(rel_type)<<clazz.new(attr) unless reject_if?(reject_if,attr)
|
121
|
+
else
|
122
|
+
# We have a node that was created with the #create method - has real Neo4j relationships
|
123
|
+
# does it exist ?
|
124
|
+
found = if has_one
|
125
|
+
# id == nil that means we have a has_one relationship
|
126
|
+
outgoing(rel_type).first
|
127
|
+
else
|
128
|
+
# do we have an ID ?
|
129
|
+
id = attr[:id]
|
130
|
+
# this is a has_n relationship, find which one we want to update
|
131
|
+
id && outgoing(rel_type).find { |n| n.id == id }
|
132
|
+
end
|
133
|
+
|
134
|
+
# Check if we want to destroy not found nodes (e.g. {..., :_destroy => '1' } ?
|
135
|
+
destroy = attr[:_destroy]
|
136
|
+
if found
|
137
|
+
if destroy
|
138
|
+
found.destroy if allow_destroy
|
139
|
+
else
|
140
|
+
found.update_attributes_in_tx(attr) # it already exist, so update that one
|
141
|
+
end
|
142
|
+
elsif !destroy && !reject_if?(reject_if,attr)
|
143
|
+
new_node = clazz.new(attr)
|
144
|
+
saved = new_node.save
|
145
|
+
outgoing(rel_type) << new_node if saved
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
def reject_if?(proc_or_symbol, attr)
|
151
|
+
return false if proc_or_symbol.nil?
|
152
|
+
if proc_or_symbol.is_a?(Symbol)
|
153
|
+
meth = method(proc_or_symbol)
|
154
|
+
meth.arity == 0 ? meth.call : meth.call(attr)
|
155
|
+
else
|
156
|
+
proc_or_symbol.call(attr)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
121
160
|
def delete
|
122
161
|
super
|
123
162
|
@_deleted = true
|
@@ -125,13 +164,10 @@ class Neo4j::Model
|
|
125
164
|
end
|
126
165
|
|
127
166
|
def save
|
128
|
-
|
167
|
+
valid = valid?
|
168
|
+
if valid
|
129
169
|
# if we are trying to save a value then we should create a real node
|
130
|
-
|
131
|
-
_run_save_callbacks { save_in_tx }
|
132
|
-
else
|
133
|
-
Neo4j::Rails::Transaction.run { _run_save_callbacks { save_in_tx } }
|
134
|
-
end
|
170
|
+
valid = _run_save_callbacks { create_or_update_node }
|
135
171
|
@_created_record = false
|
136
172
|
true
|
137
173
|
else
|
@@ -140,12 +176,14 @@ class Neo4j::Model
|
|
140
176
|
Neo4j::Rails::Transaction.fail if Neo4j::Rails::Transaction.running? && !_java_node.kind_of?(Neo4j::Value)
|
141
177
|
false
|
142
178
|
end
|
179
|
+
valid
|
143
180
|
end
|
144
181
|
|
145
|
-
def
|
146
|
-
|
182
|
+
def create_or_update_node
|
183
|
+
valid = true
|
147
184
|
if _java_node.kind_of?(Neo4j::Value)
|
148
185
|
node = Neo4j::Node.new(props)
|
186
|
+
valid = _java_node.save_nested(node)
|
149
187
|
init_on_load(node)
|
150
188
|
init_on_create
|
151
189
|
end
|
@@ -155,6 +193,7 @@ class Neo4j::Model
|
|
155
193
|
else
|
156
194
|
_run_update_callbacks { clear_changes }
|
157
195
|
end
|
196
|
+
valid
|
158
197
|
end
|
159
198
|
|
160
199
|
def clear_changes
|
@@ -178,7 +217,11 @@ class Neo4j::Model
|
|
178
217
|
# Returns true if this object hasn’t been saved yet — that is, a record for the object doesn’t exist yet; otherwise, returns false.
|
179
218
|
def new_record?()
|
180
219
|
# it is new if the model has been created with either the new or create method
|
181
|
-
|
220
|
+
new? || @_created_record == true
|
221
|
+
end
|
222
|
+
|
223
|
+
def new?
|
224
|
+
_java_node.kind_of?(Neo4j::Value)
|
182
225
|
end
|
183
226
|
|
184
227
|
def del
|
@@ -187,29 +230,53 @@ class Neo4j::Model
|
|
187
230
|
end
|
188
231
|
|
189
232
|
def destroy
|
190
|
-
|
233
|
+
_run_update_callbacks { del }
|
191
234
|
end
|
192
235
|
|
193
236
|
def destroyed?()
|
194
237
|
@_deleted
|
195
238
|
end
|
196
239
|
|
240
|
+
tx_methods :destroy, :create_or_update_node, :update_attributes, :update_attributes!
|
197
241
|
|
198
242
|
# --------------------------------------
|
199
243
|
# Class Methods
|
200
244
|
# --------------------------------------
|
201
245
|
|
202
246
|
class << self
|
247
|
+
extend Neo4j::TxMethods
|
248
|
+
|
203
249
|
# returns a value object instead of creating a new node
|
204
250
|
def new(*args)
|
205
251
|
value = Neo4j::Value.new
|
206
252
|
wrapped = self.orig_new
|
207
253
|
wrapped.init_on_load(value)
|
208
254
|
wrapped.attributes=args[0] if args[0].respond_to?(:each_pair)
|
255
|
+
|
256
|
+
wrapped.class._decl_rels.each_pair do |field, dsl|
|
257
|
+
|
258
|
+
meta = class << wrapped;
|
259
|
+
self;
|
260
|
+
end
|
261
|
+
|
262
|
+
wrapped.class._decl_rels.each_pair do |field, dsl|
|
263
|
+
meta.send(:define_method, field) do
|
264
|
+
if new?
|
265
|
+
value.outgoing(dsl.namespace_type)
|
266
|
+
else
|
267
|
+
self.outgoing(dsl.namespace_type)
|
268
|
+
end
|
269
|
+
end if dsl.direction == :outgoing
|
270
|
+
|
271
|
+
meta.send(:define_method, field) do
|
272
|
+
raise "NOT IMPLEMENTED #{field} (incoming relationship) FOR #new method, please create a new model with the create method instead"
|
273
|
+
end if dsl.direction == :incoming
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
209
277
|
wrapped
|
210
278
|
end
|
211
279
|
|
212
|
-
|
213
280
|
# Handle Model.find(params[:id])
|
214
281
|
def find(*args)
|
215
282
|
if args.length == 1 && String === args[0] && args[0].to_i != 0
|
@@ -236,26 +303,55 @@ class Neo4j::Model
|
|
236
303
|
alias_method :_orig_create, :create
|
237
304
|
|
238
305
|
def create(*)
|
239
|
-
|
240
|
-
end
|
241
|
-
|
242
|
-
def create!(*args)
|
243
|
-
Neo4j::Rails::Transaction.running? ? create_in_tx!(_orig_create(*args)) : Neo4j::Rails::Transaction.run { create_in_tx!(_orig_create(*args)) }
|
244
|
-
end
|
245
|
-
|
246
|
-
def create_in_tx(model)
|
306
|
+
model = super
|
247
307
|
model.save
|
248
308
|
model
|
249
309
|
end
|
250
310
|
|
251
|
-
def
|
311
|
+
def create!(*args)
|
312
|
+
model = _orig_create(*args)
|
252
313
|
model.save!
|
253
314
|
model
|
254
315
|
end
|
255
316
|
|
317
|
+
tx_methods :create, :create!
|
318
|
+
|
319
|
+
|
256
320
|
def transaction(&block)
|
257
321
|
Neo4j::Rails::Transaction.run &block
|
258
322
|
end
|
323
|
+
|
324
|
+
def accepts_nested_attributes_for(*attr_names)
|
325
|
+
options = attr_names.pop if attr_names[-1].is_a?(Hash)
|
326
|
+
|
327
|
+
attr_names.each do |association_name|
|
328
|
+
rel = self._decl_rels[association_name.to_sym]
|
329
|
+
raise "No relationship declared with has_n or has_one with type #{association_name}" unless rel
|
330
|
+
to_class = rel.to_class
|
331
|
+
raise "Can't use accepts_nested_attributes_for(#{association_name}) since it has not defined which class it has a relationship to, use has_n(#{association_name}).to(MyOtherClass)" unless to_class
|
332
|
+
type = rel.namespace_type
|
333
|
+
has_one = rel.has_one?
|
334
|
+
|
335
|
+
send(:define_method, "#{association_name}_attributes=") do |attributes|
|
336
|
+
if has_one
|
337
|
+
update_nested_attributes(type, to_class, true, attributes, options)
|
338
|
+
else
|
339
|
+
if attributes.is_a?(Array)
|
340
|
+
attributes.each do |attr|
|
341
|
+
update_nested_attributes(type, to_class, false, attr, options)
|
342
|
+
end
|
343
|
+
else
|
344
|
+
attributes.each_value do |attr|
|
345
|
+
update_nested_attributes(type, to_class, false, attr, options)
|
346
|
+
end
|
347
|
+
end
|
348
|
+
end
|
349
|
+
end
|
350
|
+
tx_methods("#{association_name}_attributes=")
|
351
|
+
end
|
352
|
+
end
|
353
|
+
|
259
354
|
end
|
260
355
|
|
261
356
|
end
|
357
|
+
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Neo4j::TxMethods
|
2
|
+
def tx_methods(*methods)
|
3
|
+
methods.each do |method|
|
4
|
+
tx_method = "#{method}_in_tx"
|
5
|
+
send(:alias_method, tx_method, method)
|
6
|
+
send(:define_method, method) do |*args|
|
7
|
+
Neo4j::Rails::Transaction.running? ? send(tx_method, *args) : Neo4j::Rails::Transaction.run { send(tx_method, *args) }
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
data/lib/neo4j/rails/value.rb
CHANGED
@@ -10,6 +10,7 @@ module Neo4j
|
|
10
10
|
if args[0].respond_to?(:each_pair)
|
11
11
|
args[0].each_pair { |k, v| set_property(k.to_s, v) }
|
12
12
|
end
|
13
|
+
@rels = {} # a hash of all relationship with key type
|
13
14
|
end
|
14
15
|
|
15
16
|
# override Neo4j::Property#props
|
@@ -38,6 +39,48 @@ module Neo4j
|
|
38
39
|
@props.delete(key)
|
39
40
|
end
|
40
41
|
|
41
|
-
|
42
|
+
def outgoing(type)
|
43
|
+
@rels[type.to_sym] ||= OutgoingRels.new
|
44
|
+
end
|
45
|
+
|
46
|
+
def save_nested(root_node)
|
47
|
+
valid = true
|
48
|
+
@rels.each_pair do |type, rel|
|
49
|
+
rel.each do |new_node|
|
50
|
+
if new_node.save
|
51
|
+
root_node.outgoing(type) << new_node
|
52
|
+
else
|
53
|
+
valid = false
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
valid
|
58
|
+
end
|
59
|
+
|
60
|
+
class OutgoingRels
|
61
|
+
include Enumerable
|
62
|
+
def initialize
|
63
|
+
@nodes = []
|
64
|
+
end
|
65
|
+
|
66
|
+
def <<(other)
|
67
|
+
@nodes << other
|
68
|
+
end
|
42
69
|
|
70
|
+
def each
|
71
|
+
@nodes.each {|n| yield n}
|
72
|
+
end
|
73
|
+
|
74
|
+
def empty?
|
75
|
+
@nodes.empty?
|
76
|
+
end
|
77
|
+
|
78
|
+
def is_a?(type)
|
79
|
+
# ActionView requires this for nested attributes to work
|
80
|
+
return true if Array == type
|
81
|
+
super
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
43
86
|
end
|
data/lib/neo4j/version.rb
CHANGED
data/lib/neo4j.rb
CHANGED
metadata
CHANGED
@@ -7,8 +7,8 @@ version: !ruby/object:Gem::Version
|
|
7
7
|
- 0
|
8
8
|
- 0
|
9
9
|
- beta
|
10
|
-
-
|
11
|
-
version: 1.0.0.beta.
|
10
|
+
- 10
|
11
|
+
version: 1.0.0.beta.10
|
12
12
|
platform: ruby
|
13
13
|
authors:
|
14
14
|
- Andreas Ronge
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-10-
|
19
|
+
date: 2010-10-08 00:00:00 +02:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -101,62 +101,6 @@ extra_rdoc_files:
|
|
101
101
|
- README.rdoc
|
102
102
|
files:
|
103
103
|
- lib/neo4j.rb
|
104
|
-
- lib/neo4j.old/reference_node.rb
|
105
|
-
- lib/neo4j.old/event_handler.rb
|
106
|
-
- lib/neo4j.old/indexer.rb
|
107
|
-
- lib/neo4j.old/search_result.rb
|
108
|
-
- lib/neo4j.old/config.rb
|
109
|
-
- lib/neo4j.old/neo.rb
|
110
|
-
- lib/neo4j.old/transaction.rb
|
111
|
-
- lib/neo4j.old/node.rb
|
112
|
-
- lib/neo4j.old/jars.rb
|
113
|
-
- lib/neo4j.old/batch_inserter.rb
|
114
|
-
- lib/neo4j.old/version.rb
|
115
|
-
- lib/neo4j.old/relationship.rb
|
116
|
-
- lib/neo4j.old/relationships/node_traverser.rb
|
117
|
-
- lib/neo4j.old/relationships/decl_relationship_dsl.rb
|
118
|
-
- lib/neo4j.old/relationships/wrappers.rb
|
119
|
-
- lib/neo4j.old/relationships/has_n.rb
|
120
|
-
- lib/neo4j.old/relationships/relationship_dsl.rb
|
121
|
-
- lib/neo4j.old/relationships/has_list.rb
|
122
|
-
- lib/neo4j.old/relationships/traversal_position.rb
|
123
|
-
- lib/neo4j.old/mixins/java_node_mixin.rb
|
124
|
-
- lib/neo4j.old/mixins/java_relationship_mixin.rb
|
125
|
-
- lib/neo4j.old/mixins/migration_mixin.rb
|
126
|
-
- lib/neo4j.old/mixins/node_mixin.rb
|
127
|
-
- lib/neo4j.old/mixins/java_property_mixin.rb
|
128
|
-
- lib/neo4j.old/mixins/java_list_mixin.rb
|
129
|
-
- lib/neo4j.old/mixins/relationship_mixin.rb
|
130
|
-
- lib/neo4j.old/mixins/rel_class_methods.rb
|
131
|
-
- lib/neo4j.old/mixins/property_class_methods.rb
|
132
|
-
- lib/neo4j.old/jars/neo4j-kernel-1.0.jar
|
133
|
-
- lib/neo4j.old/jars/geronimo-jta_1.1_spec-1.1.1.jar
|
134
|
-
- lib/neo4j.old/extensions/aggregate.rb
|
135
|
-
- lib/neo4j.old/extensions/find_path.rb
|
136
|
-
- lib/neo4j.old/extensions/reindexer.rb
|
137
|
-
- lib/neo4j.old/extensions/graph_algo.rb
|
138
|
-
- lib/neo4j.old/extensions/rest.rb
|
139
|
-
- lib/neo4j.old/extensions/tx_tracker.rb
|
140
|
-
- lib/neo4j.old/extensions/rest_slave.rb
|
141
|
-
- lib/neo4j.old/extensions/activemodel.rb
|
142
|
-
- lib/neo4j.old/extensions/rest_master.rb
|
143
|
-
- lib/neo4j.old/extensions/rest/server.rb
|
144
|
-
- lib/neo4j.old/extensions/rest/rest.rb
|
145
|
-
- lib/neo4j.old/extensions/rest/rest_mixin.rb
|
146
|
-
- lib/neo4j.old/extensions/rest/stubs.rb
|
147
|
-
- lib/neo4j.old/extensions/graph_algo/neo4j-graph-algo-0.3.jar
|
148
|
-
- lib/neo4j.old/extensions/graph_algo/all_simple_paths.rb
|
149
|
-
- lib/neo4j.old/extensions/aggregate/node_aggregate.rb
|
150
|
-
- lib/neo4j.old/extensions/aggregate/node_aggregate_mixin.rb
|
151
|
-
- lib/neo4j.old/extensions/aggregate/props_aggregator.rb
|
152
|
-
- lib/neo4j.old/extensions/aggregate/prop_group.rb
|
153
|
-
- lib/neo4j.old/extensions/aggregate/node_aggregator.rb
|
154
|
-
- lib/neo4j.old/extensions/aggregate/props_aggregate.rb
|
155
|
-
- lib/neo4j.old/extensions/aggregate/props_aggregate_mixin.rb
|
156
|
-
- lib/neo4j.old/extensions/aggregate/property_enum.rb
|
157
|
-
- lib/neo4j.old/extensions/aggregate/aggregate_enum.rb
|
158
|
-
- lib/neo4j.old/extensions/aggregate/node_group.rb
|
159
|
-
- lib/neo4j.old/extensions/aggregate/ext/node_mixin.rb
|
160
104
|
- lib/neo4j/event_handler.rb
|
161
105
|
- lib/neo4j/node_traverser.rb
|
162
106
|
- lib/neo4j/relationship_traverser.rb
|
@@ -179,6 +123,7 @@ files:
|
|
179
123
|
- lib/neo4j/rails/railtie.rb
|
180
124
|
- lib/neo4j/rails/lucene_connection_closer.rb
|
181
125
|
- lib/neo4j/rails/transaction.rb
|
126
|
+
- lib/neo4j/rails/tx_methods.rb
|
182
127
|
- lib/neo4j/rails/value.rb
|
183
128
|
- lib/neo4j/rails/validations/uniqueness.rb
|
184
129
|
- lib/neo4j/jars/lucene-core-3.0.1.jar
|
@@ -1,144 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
|
3
|
-
class BatchItem # :nodoc:
|
4
|
-
attr_accessor :_wrapper, :neo_id
|
5
|
-
|
6
|
-
include Neo4j::JavaPropertyMixin
|
7
|
-
|
8
|
-
def initialize(neo_id, inserter)
|
9
|
-
@neo_id = neo_id
|
10
|
-
@inserter = inserter
|
11
|
-
end
|
12
|
-
|
13
|
-
def getId(); neo_id end
|
14
|
-
|
15
|
-
def has_property?(key)
|
16
|
-
props.include?(key.to_s)
|
17
|
-
end
|
18
|
-
|
19
|
-
def get_property(key)
|
20
|
-
props[key]
|
21
|
-
end
|
22
|
-
|
23
|
-
def props
|
24
|
-
# not sure why I have to do it like this, Strange why I can't use the Java Hash ?
|
25
|
-
# gets java.lang.UnsupportedOperationException: null, in java/util/AbstractMap.java:186:in `put'
|
26
|
-
java_props = @inserter.getNodeProperties(neo_id)
|
27
|
-
ruby_props = {}
|
28
|
-
java_props.keySet().each{|k| ruby_props[k] = java_props[k]}
|
29
|
-
ruby_props
|
30
|
-
end
|
31
|
-
|
32
|
-
|
33
|
-
def setProperty(key, value)
|
34
|
-
ruby_props = props
|
35
|
-
ruby_props[key.to_s] = value
|
36
|
-
@inserter.setNodeProperties(neo_id, ruby_props)
|
37
|
-
|
38
|
-
if (wrapper_class and key[0, 1] != '_') # do not want events on internal properties
|
39
|
-
wrapper_class.indexer.on_property_changed(wrapper, key)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
# Neo4j has a batch insert mode that drops support for transactions and concurrency in favor of insertion speed.
|
45
|
-
# This is useful when you have a big dataset that needs to be loaded once. In our experience, the batch inserter will
|
46
|
-
# typically inject data around five times faster than running in normal transactional mode.
|
47
|
-
#
|
48
|
-
# === Usage
|
49
|
-
#
|
50
|
-
# The initialize method takes a code block that will use the BatchInserter.
|
51
|
-
#
|
52
|
-
# Neo4j::BatchInserter.new do |b|
|
53
|
-
# a = Neo4j::Node.new :name => 'a'
|
54
|
-
# b = Neo4j::Node.new :name => 'b'
|
55
|
-
# c = Foo.new :key1 => 'val1', :key2 => 'val2'
|
56
|
-
# c[:name] = "c"
|
57
|
-
# Neo4j::Relationship.new(:friend, a, b, :since => '2001-01-01')
|
58
|
-
# Neo4j::Relationship.new(:friend, Neo4j.ref_node, c, :since => '2001-01-01')
|
59
|
-
# end
|
60
|
-
#
|
61
|
-
# After the code block the normal creation for nodes and relationship will be used.
|
62
|
-
# Traversals inside the batch inserter block is not possible.
|
63
|
-
# The BatchInserter can be used together with Neo4j Migrations (see Neo4j#migration)
|
64
|
-
#
|
65
|
-
class BatchInserter
|
66
|
-
|
67
|
-
# See class description for usage.
|
68
|
-
#
|
69
|
-
# === Parameters
|
70
|
-
# storage_path:: optional, the location of the neo4j dabase on file system, default Neo4j::Config[:storage_path]
|
71
|
-
# db_version:: optional, sets version number on reference node, default nil -> do not set this property
|
72
|
-
def initialize(storage_path = Neo4j::Config[:storage_path], db_version=nil) # :yields: batch_inserter
|
73
|
-
# create the batch inserter
|
74
|
-
inserter = org.neo4j.kernel.impl.batchinsert.BatchInserterImpl.new(storage_path)
|
75
|
-
|
76
|
-
# save original methods
|
77
|
-
create_node_meth = Neo4j.method(:create_node)
|
78
|
-
create_rel_meth = Neo4j.method(:create_rel)
|
79
|
-
ref_node_meth = Neo4j.method(:ref_node)
|
80
|
-
instance_meth = Neo4j.method(:instance)
|
81
|
-
|
82
|
-
# replace methods
|
83
|
-
neo4j_meta = (class << Neo4j; self; end)
|
84
|
-
neo4j_meta.instance_eval do
|
85
|
-
define_method(:create_node) do |props|
|
86
|
-
props ||= {}
|
87
|
-
id = inserter.createNode(props.keys.inject({}) {|hash, key| hash[key.to_s] = props[key]; hash})
|
88
|
-
BatchItem.new(id, inserter)
|
89
|
-
end
|
90
|
-
define_method(:create_rel) do |type, from_node, to_node, props|
|
91
|
-
props = Hash[*props.map{|k, v| [k.to_s, v]}.flatten] if props
|
92
|
-
java_type = org.neo4j.graphdb.DynamicRelationshipType.withName(type.to_s)
|
93
|
-
id = inserter.createRelationship(from_node.neo_id, to_node.neo_id, java_type, props)
|
94
|
-
BatchItem.new(id, inserter)
|
95
|
-
end
|
96
|
-
define_method(:ref_node) do
|
97
|
-
BatchItem.new(inserter.getReferenceNode, inserter)
|
98
|
-
end
|
99
|
-
define_method(:instance) do
|
100
|
-
Neo4j::BatchInstance.new
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
begin
|
105
|
-
yield inserter
|
106
|
-
Neo4j.ref_node[:db_version] = db_version if db_version
|
107
|
-
ensure
|
108
|
-
inserter.shutdown
|
109
|
-
# restore old methods
|
110
|
-
neo4j_meta.instance_eval do
|
111
|
-
define_method(:create_node, create_node_meth)
|
112
|
-
define_method(:create_rel, create_rel_meth)
|
113
|
-
define_method(:ref_node, ref_node_meth)
|
114
|
-
define_method(:instance, instance_meth)
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
# This method is used if the batch inserter is used from the Migration API.
|
120
|
-
#
|
121
|
-
# === Parameters
|
122
|
-
# context:: the context on which the batch inserter code block is evaluated in, not used.
|
123
|
-
# version:: optional, if given then will set the property db_version on the context
|
124
|
-
def self.execute(context, version=nil, &block)
|
125
|
-
# Neo4j must not be running while using batch inserter, stop it just in case ...
|
126
|
-
Neo4j::Transaction.finish
|
127
|
-
Neo4j.stop
|
128
|
-
|
129
|
-
BatchInserter.new(Neo4j::Config[:storage_path], version, &block)
|
130
|
-
|
131
|
-
Neo4j.start
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
# Used instead of Neo4j.instance object - will happily accept any methods - like transaction methods.
|
136
|
-
class BatchInstance # :nodoc:
|
137
|
-
def method_missing(m, *args, &block)
|
138
|
-
return BatchInstance.new
|
139
|
-
end
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
|
144
|
-
|