neography-ajaycb 0.0.21
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.
- data/.gitignore +5 -0
- data/.project +12 -0
- data/.travis.yml +1 -0
- data/CONTRIBUTORS +12 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +39 -0
- data/LICENSE +19 -0
- data/README.rdoc +350 -0
- data/Rakefile +15 -0
- data/examples/facebook.rb +40 -0
- data/examples/facebook_v2.rb +25 -0
- data/examples/greatest.rb +43 -0
- data/examples/linkedin.rb +39 -0
- data/examples/linkedin_v2.rb +22 -0
- data/examples/traversal_example1.rb +65 -0
- data/examples/traversal_example2.rb +54 -0
- data/lib/neography.rb +46 -0
- data/lib/neography/config.rb +17 -0
- data/lib/neography/equal.rb +21 -0
- data/lib/neography/index.rb +13 -0
- data/lib/neography/neography.rb +10 -0
- data/lib/neography/node.rb +45 -0
- data/lib/neography/node_path.rb +29 -0
- data/lib/neography/node_relationship.rb +35 -0
- data/lib/neography/node_traverser.rb +142 -0
- data/lib/neography/path_traverser.rb +94 -0
- data/lib/neography/property.rb +53 -0
- data/lib/neography/property_container.rb +17 -0
- data/lib/neography/railtie.rb +8 -0
- data/lib/neography/relationship.rb +68 -0
- data/lib/neography/relationship_traverser.rb +80 -0
- data/lib/neography/rest.rb +534 -0
- data/lib/neography/tasks.rb +131 -0
- data/lib/neography/version.rb +3 -0
- data/neography.gemspec +29 -0
- data/spec/integration/authorization_spec.rb +48 -0
- data/spec/integration/index_spec.rb +32 -0
- data/spec/integration/neography_spec.rb +10 -0
- data/spec/integration/node_path_spec.rb +222 -0
- data/spec/integration/node_relationship_spec.rb +374 -0
- data/spec/integration/node_spec.rb +215 -0
- data/spec/integration/relationship_spec.rb +37 -0
- data/spec/integration/rest_batch_spec.rb +221 -0
- data/spec/integration/rest_bulk_spec.rb +106 -0
- data/spec/integration/rest_experimental_spec.rb +22 -0
- data/spec/integration/rest_gremlin_fail_spec.rb +46 -0
- data/spec/integration/rest_index_spec.rb +297 -0
- data/spec/integration/rest_node_spec.rb +232 -0
- data/spec/integration/rest_path_spec.rb +209 -0
- data/spec/integration/rest_plugin_spec.rb +67 -0
- data/spec/integration/rest_relationship_spec.rb +327 -0
- data/spec/integration/rest_traverse_spec.rb +149 -0
- data/spec/spec_helper.rb +18 -0
- metadata +222 -0
@@ -0,0 +1,80 @@
|
|
1
|
+
module Neography
|
2
|
+
class RelationshipTraverser
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
def initialize(node, types, direction)
|
6
|
+
@node = node
|
7
|
+
@types = [types]
|
8
|
+
@direction = direction
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_s
|
12
|
+
if @types.size == 1 && !@types.empty?
|
13
|
+
"#{self.class} [type: #{@type} dir:#{@direction}]"
|
14
|
+
elsif !@types.empty?
|
15
|
+
"#{self.class} [types: #{@types.join(',')} dir:#{@direction}]"
|
16
|
+
else
|
17
|
+
"#{self.class} [types: ANY dir:#{@direction}]"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def each
|
22
|
+
iterator.each do |i|
|
23
|
+
rel = Neography::Relationship.new(i, @node.neo_server)
|
24
|
+
rel.start_node = Neography::Node.load(rel.start_node, @node.neo_server)
|
25
|
+
rel.end_node = Neography::Node.load(rel.end_node, @node.neo_server)
|
26
|
+
|
27
|
+
yield rel if match_to_other?(rel)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def empty?
|
32
|
+
first == nil
|
33
|
+
end
|
34
|
+
|
35
|
+
def iterator
|
36
|
+
Array(@node.neo_server.get_node_relationships(@node, @direction, @types))
|
37
|
+
end
|
38
|
+
|
39
|
+
def match_to_other?(rel)
|
40
|
+
if @to_other.nil?
|
41
|
+
true
|
42
|
+
elsif @direction == :outgoing
|
43
|
+
rel.end_node == @to_other
|
44
|
+
elsif @direction == :incoming
|
45
|
+
rel.start_node == @to_other
|
46
|
+
else
|
47
|
+
rel.start_node == @to_other || rel.end_node == @to_other
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def to_other(to_other)
|
52
|
+
@to_other = to_other
|
53
|
+
self
|
54
|
+
end
|
55
|
+
|
56
|
+
def del
|
57
|
+
each { |rel| @node.neo_server.delete_relationship(rel) }
|
58
|
+
end
|
59
|
+
|
60
|
+
def size
|
61
|
+
[*self].size
|
62
|
+
end
|
63
|
+
|
64
|
+
def both
|
65
|
+
@direction = :both
|
66
|
+
self
|
67
|
+
end
|
68
|
+
|
69
|
+
def incoming
|
70
|
+
@direction = :incoming
|
71
|
+
self
|
72
|
+
end
|
73
|
+
|
74
|
+
def outgoing
|
75
|
+
@direction = :outgoing
|
76
|
+
self
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,534 @@
|
|
1
|
+
module Neography
|
2
|
+
class Rest
|
3
|
+
include HTTParty
|
4
|
+
|
5
|
+
attr_accessor :protocol, :server, :port, :directory, :log_file, :log_enabled, :logger, :max_threads, :authentication, :username, :password
|
6
|
+
|
7
|
+
def initialize(options=ENV['NEO4J_URL'] || {})
|
8
|
+
init = {:protocol => Neography::Config.protocol,
|
9
|
+
:server => Neography::Config.server,
|
10
|
+
:port => Neography::Config.port,
|
11
|
+
:directory => Neography::Config.directory,
|
12
|
+
:log_file => Neography::Config.log_file,
|
13
|
+
:log_enabled => Neography::Config.log_enabled,
|
14
|
+
:max_threads => Neography::Config.max_threads,
|
15
|
+
:authentication => Neography::Config.authentication,
|
16
|
+
:username => Neography::Config.username,
|
17
|
+
:password => Neography::Config.password}
|
18
|
+
|
19
|
+
unless options.respond_to?(:each_pair)
|
20
|
+
url = URI.parse(options)
|
21
|
+
options = Hash.new
|
22
|
+
options[:protocol] = url.scheme + "://"
|
23
|
+
options[:server] = url.host
|
24
|
+
options[:port] = url.port
|
25
|
+
options[:directory] = url.path
|
26
|
+
options[:username] = url.user
|
27
|
+
options[:password] = url.password
|
28
|
+
options[:authentication] = 'basic' unless url.user.nil?
|
29
|
+
end
|
30
|
+
|
31
|
+
init.merge!(options)
|
32
|
+
|
33
|
+
@protocol = init[:protocol]
|
34
|
+
@server = init[:server]
|
35
|
+
@port = init[:port]
|
36
|
+
@directory = init[:directory]
|
37
|
+
@log_file = init[:log_file]
|
38
|
+
@log_enabled = init[:log_enabled]
|
39
|
+
@logger = Logger.new(@log_file) if @log_enabled
|
40
|
+
@max_threads = init[:max_threads]
|
41
|
+
@authentication = Hash.new
|
42
|
+
@authentication = {"#{init[:authentication]}_auth".to_sym => {:username => init[:username], :password => init[:password]}} unless init[:authentication].empty?
|
43
|
+
end
|
44
|
+
|
45
|
+
def configure(protocol, server, port, directory)
|
46
|
+
@protocol = protocol
|
47
|
+
@server = server
|
48
|
+
@port = port
|
49
|
+
@directory = directory
|
50
|
+
end
|
51
|
+
|
52
|
+
def configuration
|
53
|
+
@protocol + @server + ':' + @port.to_s + @directory + "/db/data"
|
54
|
+
end
|
55
|
+
|
56
|
+
def get_root
|
57
|
+
get("/node/#{get_id(get('/')["reference_node"])}")
|
58
|
+
end
|
59
|
+
|
60
|
+
def create_node(*args)
|
61
|
+
if args[0].respond_to?(:each_pair) && args[0]
|
62
|
+
options = { :body => args[0].delete_if { |k, v| v.nil? }.to_json, :headers => {'Content-Type' => 'application/json'} }
|
63
|
+
post("/node", options)
|
64
|
+
else
|
65
|
+
post("/node")
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def create_nodes(nodes)
|
70
|
+
nodes = Array.new(nodes) if nodes.kind_of? Fixnum
|
71
|
+
created_nodes = Array.new
|
72
|
+
nodes.each do |node|
|
73
|
+
created_nodes << create_node(node)
|
74
|
+
end
|
75
|
+
created_nodes
|
76
|
+
end
|
77
|
+
|
78
|
+
def create_nodes_threaded(nodes)
|
79
|
+
nodes = Array.new(nodes) if nodes.kind_of? Fixnum
|
80
|
+
|
81
|
+
node_queue = Queue.new
|
82
|
+
thread_pool = []
|
83
|
+
responses = Queue.new
|
84
|
+
|
85
|
+
nodes.each do |node|
|
86
|
+
node_queue.push node
|
87
|
+
end
|
88
|
+
|
89
|
+
[nodes.size, @max_threads].min.times do
|
90
|
+
thread_pool << Thread.new do
|
91
|
+
until node_queue.empty? do
|
92
|
+
node = node_queue.pop
|
93
|
+
if node.respond_to?(:each_pair)
|
94
|
+
responses.push( post("/node", { :body => node.to_json, :headers => {'Content-Type' => 'application/json'} } ) )
|
95
|
+
else
|
96
|
+
responses.push( post("/node") )
|
97
|
+
end
|
98
|
+
end
|
99
|
+
self.join
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
created_nodes = Array.new
|
104
|
+
|
105
|
+
while created_nodes.size < nodes.size
|
106
|
+
created_nodes << responses.pop
|
107
|
+
end
|
108
|
+
created_nodes
|
109
|
+
end
|
110
|
+
|
111
|
+
# This is not yet implemented in the REST API
|
112
|
+
#
|
113
|
+
# def get_all_node
|
114
|
+
# puts "get all nodes"
|
115
|
+
# get("/nodes/")
|
116
|
+
# end
|
117
|
+
|
118
|
+
def get_node(id)
|
119
|
+
get("/node/#{get_id(id)}")
|
120
|
+
end
|
121
|
+
|
122
|
+
def get_nodes(*nodes)
|
123
|
+
gotten_nodes = Array.new
|
124
|
+
Array(nodes).flatten.each do |node|
|
125
|
+
gotten_nodes << get_node(node)
|
126
|
+
end
|
127
|
+
gotten_nodes
|
128
|
+
end
|
129
|
+
|
130
|
+
def reset_node_properties(id, properties)
|
131
|
+
options = { :body => properties.to_json, :headers => {'Content-Type' => 'application/json'} }
|
132
|
+
put("/node/#{get_id(id)}/properties", options)
|
133
|
+
end
|
134
|
+
|
135
|
+
def get_node_properties(id, properties = nil)
|
136
|
+
if properties.nil?
|
137
|
+
get("/node/#{get_id(id)}/properties")
|
138
|
+
else
|
139
|
+
node_properties = Hash.new
|
140
|
+
Array(properties).each do |property|
|
141
|
+
value = get("/node/#{get_id(id)}/properties/#{property}")
|
142
|
+
node_properties[property] = value unless value.nil?
|
143
|
+
end
|
144
|
+
return nil if node_properties.empty?
|
145
|
+
node_properties
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def remove_node_properties(id, properties = nil)
|
150
|
+
if properties.nil?
|
151
|
+
delete("/node/#{get_id(id)}/properties")
|
152
|
+
else
|
153
|
+
Array(properties).each do |property|
|
154
|
+
delete("/node/#{get_id(id)}/properties/#{property}")
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def set_node_properties(id, properties)
|
160
|
+
properties.each do |key, value|
|
161
|
+
options = { :body => value.to_json, :headers => {'Content-Type' => 'application/json'} }
|
162
|
+
put("/node/#{get_id(id)}/properties/#{key}", options)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def delete_node(id)
|
167
|
+
delete("/node/#{get_id(id)}")
|
168
|
+
end
|
169
|
+
|
170
|
+
def create_relationship(type, from, to, props = nil)
|
171
|
+
options = { :body => {:to => self.configuration + "/node/#{get_id(to)}", :data => props, :type => type }.to_json, :headers => {'Content-Type' => 'application/json'} }
|
172
|
+
post("/node/#{get_id(from)}/relationships", options)
|
173
|
+
end
|
174
|
+
|
175
|
+
def create_unique_relationship(index, key, value, type, from, to)
|
176
|
+
body = {:key=>key,:value=>value, :type => type }
|
177
|
+
body[:start] = self.configuration + "/node/#{get_id(from)}"
|
178
|
+
body[:end] = self.configuration + "/node/#{get_id(to)}"
|
179
|
+
options = { :body => body.to_json, :headers => {'Content-Type' => 'application/json'} }
|
180
|
+
post("/index/relationship/#{index}?unique", options)
|
181
|
+
end
|
182
|
+
|
183
|
+
def get_relationship(id)
|
184
|
+
get("/relationship/#{get_id(id)}")
|
185
|
+
end
|
186
|
+
|
187
|
+
def get_relationship_start_node(rel)
|
188
|
+
get_node(rel["start"])
|
189
|
+
end
|
190
|
+
|
191
|
+
def get_relationship_end_node(rel)
|
192
|
+
get_node(rel["end"])
|
193
|
+
end
|
194
|
+
|
195
|
+
def reset_relationship_properties(id, properties)
|
196
|
+
options = { :body => properties.to_json, :headers => {'Content-Type' => 'application/json'} }
|
197
|
+
put("/relationship/#{get_id(id)}/properties", options)
|
198
|
+
end
|
199
|
+
|
200
|
+
def get_relationship_properties(id, properties = nil)
|
201
|
+
if properties.nil?
|
202
|
+
get("/relationship/#{get_id(id)}/properties")
|
203
|
+
else
|
204
|
+
relationship_properties = Hash.new
|
205
|
+
Array(properties).each do |property|
|
206
|
+
value = get("/relationship/#{get_id(id)}/properties/#{property}")
|
207
|
+
relationship_properties[property] = value unless value.nil?
|
208
|
+
end
|
209
|
+
return nil if relationship_properties.empty?
|
210
|
+
relationship_properties
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
def remove_relationship_properties(id, properties = nil)
|
215
|
+
if properties.nil?
|
216
|
+
delete("/relationship/#{get_id(id)}/properties")
|
217
|
+
else
|
218
|
+
Array(properties).each do |property|
|
219
|
+
delete("/relationship/#{get_id(id)}/properties/#{property}")
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
def set_relationship_properties(id, properties)
|
225
|
+
properties.each do |key, value|
|
226
|
+
options = { :body => value.to_json, :headers => {'Content-Type' => 'application/json'} }
|
227
|
+
put("/relationship/#{get_id(id)}/properties/#{key}", options)
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
def delete_relationship(id)
|
232
|
+
delete("/relationship/#{get_id(id)}")
|
233
|
+
end
|
234
|
+
|
235
|
+
def get_node_relationships(id, dir=nil, types=nil)
|
236
|
+
dir = get_dir(dir)
|
237
|
+
|
238
|
+
if types.nil?
|
239
|
+
node_relationships = get("/node/#{get_id(id)}/relationships/#{dir}") || Array.new
|
240
|
+
else
|
241
|
+
node_relationships = get("/node/#{get_id(id)}/relationships/#{dir}/#{Array(types).join('&')}") || Array.new
|
242
|
+
end
|
243
|
+
return nil if node_relationships.empty?
|
244
|
+
node_relationships
|
245
|
+
end
|
246
|
+
|
247
|
+
def delete_node!(id)
|
248
|
+
relationships = get_node_relationships(get_id(id))
|
249
|
+
relationships.each { |r| delete_relationship(r["self"].split('/').last) } unless relationships.nil?
|
250
|
+
delete("/node/#{get_id(id)}")
|
251
|
+
end
|
252
|
+
|
253
|
+
def list_node_indexes
|
254
|
+
get("/index/node")
|
255
|
+
end
|
256
|
+
|
257
|
+
def create_node_index(name, type = "exact", provider = "lucene")
|
258
|
+
options = { :body => ({:name => name, :config => {:type => type, :provider => provider}}).to_json, :headers => {'Content-Type' => 'application/json'} }
|
259
|
+
post("/index/node", options)
|
260
|
+
end
|
261
|
+
|
262
|
+
def add_node_to_index(index, key, value, id)
|
263
|
+
options = { :body => ({:uri => self.configuration + "/node/#{get_id(id)}", :key => key, :value => value }).to_json, :headers => {'Content-Type' => 'application/json'} }
|
264
|
+
post("/index/node/#{index}", options)
|
265
|
+
end
|
266
|
+
|
267
|
+
def create_unique_node(index, key, value, props={})
|
268
|
+
options = { :body => ({:properties=>props, :key => key, :value => value }).to_json, :headers => {'Content-Type' => 'application/json'} }
|
269
|
+
post("/index/node/#{index}?unique", options)
|
270
|
+
end
|
271
|
+
|
272
|
+
def remove_node_from_index(*args)
|
273
|
+
case args.size
|
274
|
+
when 4 then delete("/index/node/#{args[0]}/#{args[1]}/#{args[2]}/#{get_id(args[3])}")
|
275
|
+
when 3 then delete("/index/node/#{args[0]}/#{args[1]}/#{get_id(args[2])}")
|
276
|
+
when 2 then delete("/index/node/#{args[0]}/#{get_id(args[1])}")
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
def get_node_index(index, key, value)
|
281
|
+
index = get("/index/node/#{index}/#{key}/#{value}") || Array.new
|
282
|
+
return nil if index.empty?
|
283
|
+
index
|
284
|
+
end
|
285
|
+
|
286
|
+
def find_node_index(*args)
|
287
|
+
case args.size
|
288
|
+
when 3 then index = get("/index/node/#{args[0]}/#{args[1]}?query=#{args[2]}") || Array.new
|
289
|
+
when 2 then index = get("/index/node/#{args[0]}?query=#{args[1]}") || Array.new
|
290
|
+
end
|
291
|
+
return nil if index.empty?
|
292
|
+
index
|
293
|
+
end
|
294
|
+
|
295
|
+
alias_method :list_indexes, :list_node_indexes
|
296
|
+
alias_method :add_to_index, :add_node_to_index
|
297
|
+
alias_method :remove_from_index, :remove_node_from_index
|
298
|
+
alias_method :get_index, :get_node_index
|
299
|
+
|
300
|
+
def list_relationship_indexes
|
301
|
+
get("/index/relationship")
|
302
|
+
end
|
303
|
+
|
304
|
+
def create_relationship_index(name, type = "exact", provider = "lucene")
|
305
|
+
options = { :body => ({:name => name, :config => {:type => type, :provider => provider}}).to_json, :headers => {'Content-Type' => 'application/json'} }
|
306
|
+
post("/index/relationship", options)
|
307
|
+
end
|
308
|
+
|
309
|
+
def add_relationship_to_index(index, key, value, id)
|
310
|
+
options = { :body => ({:uri => self.configuration + "/relationship/#{get_id(id)}", :key => key, :value => value}).to_json, :headers => {'Content-Type' => 'application/json'} }
|
311
|
+
post("/index/relationship/#{index}", options)
|
312
|
+
end
|
313
|
+
|
314
|
+
def remove_relationship_from_index(*args)
|
315
|
+
case args.size
|
316
|
+
when 4 then delete("/index/relationship/#{args[0]}/#{args[1]}/#{args[2]}/#{get_id(args[3])}")
|
317
|
+
when 3 then delete("/index/relationship/#{args[0]}/#{args[1]}/#{get_id(args[2])}")
|
318
|
+
when 2 then delete("/index/relationship/#{args[0]}/#{get_id(args[1])}")
|
319
|
+
end
|
320
|
+
end
|
321
|
+
|
322
|
+
def get_relationship_index(index, key, value)
|
323
|
+
index = get("/index/relationship/#{index}/#{key}/#{value}") || Array.new
|
324
|
+
return nil if index.empty?
|
325
|
+
index
|
326
|
+
end
|
327
|
+
|
328
|
+
def find_relationship_index(*args)
|
329
|
+
case args.size
|
330
|
+
when 3 then index = get("/index/relationship/#{args[0]}/#{args[1]}?query=#{args[2]}") || Array.new
|
331
|
+
when 2 then index = get("/index/relationship/#{args[0]}?query=#{args[1]}") || Array.new
|
332
|
+
end
|
333
|
+
return nil if index.empty?
|
334
|
+
index
|
335
|
+
end
|
336
|
+
|
337
|
+
def traverse(id, return_type, description)
|
338
|
+
options = { :body => {"order" => get_order(description["order"]),
|
339
|
+
"uniqueness" => get_uniqueness(description["uniqueness"]),
|
340
|
+
"relationships" => description["relationships"],
|
341
|
+
"prune_evaluator" => description["prune evaluator"],
|
342
|
+
"return_filter" => description["return filter"],
|
343
|
+
"max_depth" => get_depth(description["depth"]), }.to_json, :headers => {'Content-Type' => 'application/json'} }
|
344
|
+
traversal = post("/node/#{get_id(id)}/traverse/#{get_type(return_type)}", options) || Array.new
|
345
|
+
end
|
346
|
+
|
347
|
+
def get_path(from, to, relationships, depth=1, algorithm="shortestPath")
|
348
|
+
options = { :body => {"to" => self.configuration + "/node/#{get_id(to)}", "relationships" => relationships, "max_depth" => depth, "algorithm" => get_algorithm(algorithm) }.to_json, :headers => {'Content-Type' => 'application/json'} }
|
349
|
+
path = post("/node/#{get_id(from)}/path", options) || Hash.new
|
350
|
+
end
|
351
|
+
|
352
|
+
def get_paths(from, to, relationships, depth=1, algorithm="allPaths")
|
353
|
+
options = { :body => {"to" => self.configuration + "/node/#{get_id(to)}", "relationships" => relationships, "max_depth" => depth, "algorithm" => get_algorithm(algorithm) }.to_json, :headers => {'Content-Type' => 'application/json'} }
|
354
|
+
paths = post("/node/#{get_id(from)}/paths", options) || Array.new
|
355
|
+
end
|
356
|
+
|
357
|
+
def execute_query(query, params = {})
|
358
|
+
options = { :body => {:query => query, :params => params}.to_json, :headers => {'Content-Type' => 'application/json'} }
|
359
|
+
result = post("/ext/CypherPlugin/graphdb/execute_query", options)
|
360
|
+
end
|
361
|
+
|
362
|
+
def execute_script(script, params = {})
|
363
|
+
options = { :body => {:script => script, :params => params}.to_json , :headers => {'Content-Type' => 'application/json'} }
|
364
|
+
result = post("/ext/GremlinPlugin/graphdb/execute_script", options)
|
365
|
+
result == "null" ? nil : result
|
366
|
+
end
|
367
|
+
|
368
|
+
def batch(*args)
|
369
|
+
batch = []
|
370
|
+
Array(args).each_with_index do |c,i|
|
371
|
+
batch << {:id => i}.merge(get_batch(c))
|
372
|
+
end
|
373
|
+
options = { :body => batch.to_json, :headers => {'Content-Type' => 'application/json'} }
|
374
|
+
post("/batch", options)
|
375
|
+
end
|
376
|
+
|
377
|
+
private
|
378
|
+
|
379
|
+
def get_batch(args)
|
380
|
+
case args[0]
|
381
|
+
when :get_node
|
382
|
+
{:method => "GET", :to => "/node/#{get_id(args[1])}"}
|
383
|
+
when :create_node
|
384
|
+
{:method => "POST", :to => "/node/", :body => args[1]}
|
385
|
+
when :set_node_property
|
386
|
+
{:method => "PUT", :to => "/node/#{get_id(args[1])}/properties/#{args[2].keys.first}", :body => args[2].values.first}
|
387
|
+
when :reset_node_properties
|
388
|
+
{:method => "PUT", :to => "/node/#{get_id(args[1])}/properties", :body => args[2]}
|
389
|
+
when :get_relationship
|
390
|
+
{:method => "GET", :to => "/relationship/#{get_id(args[1])}"}
|
391
|
+
when :create_relationship
|
392
|
+
{:method => "POST", :to => (args[2].is_a?(String) && args[2].start_with?("{") ? "" : "/node/") + "#{get_id(args[2])}/relationships", :body => {:to => (args[3].is_a?(String) && args[3].start_with?("{") ? "" : "/node/") + "#{get_id(args[3])}", :type => args[1], :data => args[4] } }
|
393
|
+
when :set_relationship_property
|
394
|
+
{:method => "PUT", :to => "/relationship/#{get_id(args[1])}/properties/#{args[2].keys.first}", :body => args[2].values.first}
|
395
|
+
when :reset_relationship_properties
|
396
|
+
{:method => "PUT", :to => "/relationship/#{get_id(args[1])}/properties", :body => args[2]}
|
397
|
+
when :add_node_to_index
|
398
|
+
{:method => "POST", :to => "/index/node/#{args[1]}", :body => {:uri => (args[4].is_a?(String) && args[4].start_with?("{") ? "" : "/node/") + "#{get_id(args[4])}", :key => args[2], :value => args[3] } }
|
399
|
+
when :add_relationship_to_index
|
400
|
+
{:method => "POST", :to => "/index/relationship/#{args[1]}", :body => {:uri => (args[4].is_a?(String) && args[4].start_with?("{") ? "" : "/relationship/") + "#{get_id(args[4])}", :key => args[2], :value => args[3] } }
|
401
|
+
end
|
402
|
+
end
|
403
|
+
|
404
|
+
def evaluate_response(response)
|
405
|
+
code = response.code
|
406
|
+
body = response.body
|
407
|
+
case code
|
408
|
+
when 200
|
409
|
+
@logger.debug "OK" if @log_enabled
|
410
|
+
response.parsed_response
|
411
|
+
when 201
|
412
|
+
@logger.debug "OK, created #{body}" if @log_enabled
|
413
|
+
response.parsed_response
|
414
|
+
when 204
|
415
|
+
@logger.debug "OK, no content returned" if @log_enabled
|
416
|
+
nil
|
417
|
+
when 400
|
418
|
+
@logger.error "Invalid data sent #{body}" if @log_enabled
|
419
|
+
nil
|
420
|
+
when 404
|
421
|
+
@logger.error "#{body}" if @log_enabled
|
422
|
+
nil
|
423
|
+
when 409
|
424
|
+
@logger.error "Node could not be deleted (still has relationships?)" if @log_enabled
|
425
|
+
nil
|
426
|
+
end
|
427
|
+
end
|
428
|
+
|
429
|
+
def get(path,options={})
|
430
|
+
@logger.debug "GET #{path} #{options.to_json}" if @log_enabled
|
431
|
+
evaluate_response(HTTParty.get(configuration + URI.encode(path), options.merge!(@authentication)))
|
432
|
+
end
|
433
|
+
|
434
|
+
def post(path,options={})
|
435
|
+
@logger.debug "POST #{path} #{options.to_json}" if @log_enabled
|
436
|
+
evaluate_response(HTTParty.post(configuration + URI.encode(path), options.merge!(@authentication)))
|
437
|
+
end
|
438
|
+
|
439
|
+
def put(path,options={})
|
440
|
+
@logger.debug "PUT #{path} #{options.to_json}" if @log_enabled
|
441
|
+
evaluate_response(HTTParty.put(configuration + URI.encode(path), options.merge!(@authentication)))
|
442
|
+
end
|
443
|
+
|
444
|
+
def delete(path,options={})
|
445
|
+
@logger.debug "DELETE #{path} #{options.to_json}" if @log_enabled
|
446
|
+
evaluate_response(HTTParty.delete(configuration + URI.encode(path), options.merge!(@authentication)))
|
447
|
+
end
|
448
|
+
|
449
|
+
def get_id(id)
|
450
|
+
case id
|
451
|
+
when Array
|
452
|
+
get_id(id.first)
|
453
|
+
when Hash
|
454
|
+
id["self"].split('/').last
|
455
|
+
when String
|
456
|
+
id.split('/').last
|
457
|
+
when Neography::Node, Neography::Relationship
|
458
|
+
id.neo_id
|
459
|
+
else
|
460
|
+
id
|
461
|
+
end
|
462
|
+
end
|
463
|
+
|
464
|
+
def get_dir(dir)
|
465
|
+
case dir
|
466
|
+
when :incoming, "incoming", :in, "in"
|
467
|
+
"in"
|
468
|
+
when :outgoing, "outgoing", :out, "out"
|
469
|
+
"out"
|
470
|
+
else
|
471
|
+
"all"
|
472
|
+
end
|
473
|
+
end
|
474
|
+
|
475
|
+
def get_algorithm(algorithm)
|
476
|
+
case algorithm
|
477
|
+
when :shortest, "shortest", :shortestPath, "shortestPath", :short, "short"
|
478
|
+
"shortestPath"
|
479
|
+
when :allSimplePaths, "allSimplePaths", :simple, "simple"
|
480
|
+
"allSimplePaths"
|
481
|
+
else
|
482
|
+
"allPaths"
|
483
|
+
end
|
484
|
+
end
|
485
|
+
|
486
|
+
def get_order(order)
|
487
|
+
case order
|
488
|
+
when :breadth, "breadth", "breadth first", "breadthFirst", :wide, "wide"
|
489
|
+
"breadth first"
|
490
|
+
else
|
491
|
+
"depth first"
|
492
|
+
end
|
493
|
+
end
|
494
|
+
|
495
|
+
def get_type(type)
|
496
|
+
case type
|
497
|
+
when :relationship, "relationship", :relationships, "relationships"
|
498
|
+
"relationship"
|
499
|
+
when :path, "path", :paths, "paths"
|
500
|
+
"path"
|
501
|
+
when :fullpath, "fullpath", :fullpaths, "fullpaths"
|
502
|
+
"fullpath"
|
503
|
+
else
|
504
|
+
"node"
|
505
|
+
end
|
506
|
+
end
|
507
|
+
|
508
|
+
def get_uniqueness(uniqueness)
|
509
|
+
case uniqueness
|
510
|
+
when :nodeglobal, "node global", "nodeglobal", "node_global"
|
511
|
+
"node global"
|
512
|
+
when :nodepath, "node path", "nodepath", "node_path"
|
513
|
+
"node path"
|
514
|
+
when :noderecent, "node recent", "noderecent", "node_recent"
|
515
|
+
"node recent"
|
516
|
+
when :relationshipglobal, "relationship global", "relationshipglobal", "relationship_global"
|
517
|
+
"relationship global"
|
518
|
+
when :relationshippath, "relationship path", "relationshippath", "relationship_path"
|
519
|
+
"relationship path"
|
520
|
+
when :relationshiprecent, "relationship recent", "relationshiprecent", "relationship_recent"
|
521
|
+
"relationship recent"
|
522
|
+
else
|
523
|
+
"none"
|
524
|
+
end
|
525
|
+
end
|
526
|
+
|
527
|
+
def get_depth(depth)
|
528
|
+
return nil if depth.nil?
|
529
|
+
return 1 if depth.to_i == 0
|
530
|
+
depth.to_i
|
531
|
+
end
|
532
|
+
|
533
|
+
end
|
534
|
+
end
|