neography 0.0.26 → 0.0.27

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/.travis.yml CHANGED
@@ -1 +1,4 @@
1
- script: "bundle exec rake neo4j:install neo4j:start spec --trace"
1
+ script: "bundle exec rake neo4j:install['enterprise','1.8.M03'] neo4j:start spec --trace"
2
+ language: ruby
3
+ rvm:
4
+ - 1.9.3
data/Gemfile.lock CHANGED
@@ -1,10 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- neography (0.0.20)
5
- crack (= 0.1.8)
6
- httparty (= 0.8.1)
4
+ neography (0.0.26)
5
+ httparty (>= 0.8.1)
7
6
  json
7
+ oj
8
8
  os
9
9
  rake (>= 0.8.7)
10
10
  rubyzip
@@ -12,26 +12,27 @@ PATH
12
12
  GEM
13
13
  remote: http://rubygems.org/
14
14
  specs:
15
- crack (0.1.8)
16
15
  diff-lcs (1.1.3)
17
- httparty (0.8.1)
18
- multi_json
16
+ httparty (0.8.3)
17
+ multi_json (~> 1.0)
19
18
  multi_xml
20
- json (1.6.4)
21
- multi_json (1.0.4)
22
- multi_xml (0.4.1)
19
+ json (1.7.3)
20
+ json (1.7.3-java)
21
+ multi_json (1.3.6)
22
+ multi_xml (0.5.1)
23
23
  net-http-spy (0.2.1)
24
- os (0.9.5)
24
+ oj (1.2.9)
25
+ os (0.9.6)
25
26
  rake (0.8.7)
26
- rspec (2.7.0)
27
- rspec-core (~> 2.7.0)
28
- rspec-expectations (~> 2.7.0)
29
- rspec-mocks (~> 2.7.0)
30
- rspec-core (2.7.1)
31
- rspec-expectations (2.7.0)
32
- diff-lcs (~> 1.1.2)
33
- rspec-mocks (2.7.0)
34
- rubyzip (0.9.5)
27
+ rspec (2.10.0)
28
+ rspec-core (~> 2.10.0)
29
+ rspec-expectations (~> 2.10.0)
30
+ rspec-mocks (~> 2.10.0)
31
+ rspec-core (2.10.1)
32
+ rspec-expectations (2.10.0)
33
+ diff-lcs (~> 1.1.3)
34
+ rspec-mocks (2.10.1)
35
+ rubyzip (0.9.8)
35
36
 
36
37
  PLATFORMS
37
38
  java
data/README.rdoc CHANGED
@@ -6,13 +6,15 @@ Neography is a thin Ruby wrapper to the Neo4j Rest API, for more information:
6
6
 
7
7
  If you want to the full power of Neo4j, you will want to use JRuby and the excellent Neo4j.rb gem at https://github.com/andreasronge/neo4j by Andreas Ronge
8
8
 
9
+ {<img src="https://secure.travis-ci.org/maxdemarzi/neography.png?branch=master" alt="Build Status" />}[http://travis-ci.org/maxdemarzi/neography]
10
+
9
11
  Complement to Neography are the:
10
12
 
11
- * {Neo4j Active Record Adapter}[https://github.com/yournextleap/activerecord-neo4j-adapter] by Nikhil Lanjewar
13
+ * {Neo4j Active Record Adapter}[https://github.com/yournextleap/activerecord-neo4j-adapter] by Nikhil Lanjewar
12
14
  * {Neology}[https://github.com/lordkada/neology] by Carlo Alberto Degli Atti
13
15
  * {Neoid}[https://github.com/elado/neoid] by Elad Ossadon
14
16
 
15
- An alternative is the Architect4r Gem at https://github.com/namxam/architect4r by Maximilian Schulz
17
+ An alternative is the Architect4r Gem at https://github.com/namxam/architect4r by Maximilian Schulz
16
18
 
17
19
  === Neography in the Wild
18
20
 
@@ -46,48 +48,48 @@ in order to access the functionality.
46
48
  os
47
49
  rake
48
50
  json
49
- httparty
51
+ httparty
50
52
 
51
53
  for development:
52
- rspec
53
- net-http-spy
54
+ rspec
55
+ net-http-spy
54
56
 
55
57
  ==== Rails
56
58
 
57
59
  Just add gem 'neography' to your Gemfile and run bundle install.
58
60
 
59
61
  The following tasks will be available to you:
60
-
62
+
61
63
  rake neo4j:install # Install Neo4j to the neo4j directory under your project
62
64
  rake neo4j:install[community,1.6.M03] # Install Neo4j Community edition, version 1.6.M03
63
- rake neo4j:install[advanced,1.5] # Install Neo4j Advanced edition, version 1.5
65
+ rake neo4j:install[advanced,1.5] # Install Neo4j Advanced edition, version 1.5
64
66
  rake neo4j:install[enterprise,1.5] # Install Neo4j Enterprise edition, version 1.5
65
67
  rake neo4j:start # Start Neo4j
66
68
  rake neo4j:stop # Stop Neo4j
67
69
  rake neo4j:restart # Restart Neo4j
68
- rake neo4j:reset_yes_i_am_sure # Wipe your Neo4j Database
70
+ rake neo4j:reset_yes_i_am_sure # Wipe your Neo4j Database
69
71
 
70
72
  Windows users will need to run in a command prompt with Administrative Privileges
71
- in order to install Neo4j as a Service.
73
+ in order to install Neo4j as a Service.
72
74
 
73
75
  If you are not using Rails, then add:
74
76
 
75
77
  require 'neography/tasks'
76
78
 
77
- to your Rakefile to have access to these tasks.
79
+ to your Rakefile to have access to these tasks.
78
80
 
79
81
  rake neo4j:install requires wget to be installed. It will download and install Neo4j into a neo4j directory in your project regardless of what version you choose.
80
82
 
81
83
 
82
84
  === Documentation
83
85
 
84
- @neo = Neography::Rest.new({:protocol => 'http://',
85
- :server => 'localhost',
86
- :port => 7474,
87
- :directory => '', # use '/<my directory>' or leave out for default
88
- :authentication => 'basic', # 'basic', 'digest' or leave out for default
89
- :username => 'your username', #leave out for default
90
- :password => 'your password', #leave out for default
86
+ @neo = Neography::Rest.new({:protocol => 'http://',
87
+ :server => 'localhost',
88
+ :port => 7474,
89
+ :directory => '', # use '/<my directory>' or leave out for default
90
+ :authentication => 'basic', # 'basic', 'digest' or leave out for default
91
+ :username => 'your username', #leave out for default
92
+ :password => 'your password', #leave out for default
91
93
  :log_file => 'neography.log',
92
94
  :log_enabled => false,
93
95
  :max_threads => 20,
@@ -101,12 +103,12 @@ Quick initializer (assumes basic authorization if username is given):
101
103
 
102
104
  To Use:
103
105
 
104
- @neo = Neography::Rest.new # Inialize using all default parameters
106
+ @neo = Neography::Rest.new # Inialize using all default parameters
105
107
 
106
108
  @neo.get_root # Get the root node
107
109
  @neo.create_node # Create an empty node
108
110
  @neo.create_node("age" => 31, "name" => "Max") # Create a node with some properties
109
- @neo.create_unique_node(index_name, key, unique_value, # Create a unique node
111
+ @neo.create_unique_node(index_name, key, unique_value, # Create a unique node
110
112
  {"age" => 31, "name" => "Max"}) # this needs an existing index
111
113
 
112
114
  @neo.get_node(node2) # Get a node and its properties
@@ -122,7 +124,7 @@ To Use:
122
124
  @neo.remove_node_properties(node1, ["weight","age"]) # Remove multiple properties of a node
123
125
 
124
126
  @neo.create_relationship("friends", node1, node2) # Create a relationship between node1 and node2
125
- @neo.create_unique_relationship(index_name, key, value, # Create a unique relationship between nodes
127
+ @neo.create_unique_relationship(index_name, key, value, # Create a unique relationship between nodes
126
128
  "friends", new_node1, new_node2) # this needs an existing index
127
129
 
128
130
  @neo.get_relationship(rel1) # Get a relationship
@@ -148,7 +150,9 @@ To Use:
148
150
  @neo.remove_node_from_index(index, node1) # removes a node from the index
149
151
  @neo.get_node_index(index, key, value) # exact query of the node index with the given key/value pair
150
152
  @neo.find_node_index(index, key, value) # advanced query of the node index with the given key/value pair
151
- @neo.find_node_index(index, query ) # advanced query of the node index with the given query
153
+ @neo.find_node_index(index, query) # advanced query of the node index with the given query
154
+ @neo.get_node_auto_index(key, value) # exact query of the node auto index with the given key/value pair
155
+ @neo.find_node_auto_index(query) # advanced query of the node auto index with the given query
152
156
  @neo.list_relationship_indexes # gives names and query templates for relationship indices
153
157
  @neo.create_relationship_index(name, "fulltext", provider) # creates a relationship index with "fulltext" option
154
158
  @neo.add_relationship_to_index(index, key, value, rel1) # adds a relationship to the index with the given key/value pair
@@ -158,12 +162,14 @@ To Use:
158
162
  @neo.get_relationship_index(index, key, value) # exact query of the relationship index with the given key/value pair
159
163
  @neo.find_relationship_index(index, key, value) # advanced query of the relationship index with the given key/value pair
160
164
  @neo.find_relationship_index(index, query) # advanced query of the relationship index with the given query
165
+ @neo.get_relationship_auto_index(key, value) # exact query of the relationship auto index with the given key/value pair
166
+ @neo.find_relationship_auto_index(query) # advanced query of the relationship auto index with the given query
161
167
  @neo.execute_script("g.v(0)") # sends a Groovy script (through the Gremlin plugin)
162
168
  @neo.execute_script("g.v(id)", {:id => 3}) # sends a parameterized Groovy script (optimized for repeated calls)
163
169
  @neo.execute_query("start n=node(0) return n") # sends a Cypher query (through the Cypher plugin)
164
170
  @neo.execute_query("start n=node(id) return n", {:id => 3}) # sends a parameterized Cypher query (optimized for repeated calls)
165
171
 
166
- @neo.get_path(node1, node2, relationships, depth=4, algorithm="shortestPath") # finds the shortest path between two nodes
172
+ @neo.get_path(node1, node2, relationships, depth=4, algorithm="shortestPath") # finds the shortest path between two nodes
167
173
  @neo.get_paths(node1, node2, relationships, depth=3, algorithm="allPaths") # finds all paths between two nodes
168
174
  @neo.get_shortest_weighted_path(node1, node2, relationships, # find the shortest path between two nodes
169
175
  weight_attr='weight', depth=2, # accounting for weight in the relationships
@@ -174,26 +180,26 @@ To Use:
174
180
  {"order" => "breadth first", # "breadth first" or "depth first" traversal order
175
181
  "uniqueness" => "node global", # See Uniqueness in API documentation for options.
176
182
  "relationships" => [{"type"=> "roommates", # A hash containg a description of the traversal
177
- "direction" => "all"}, # two relationships.
178
- {"type"=> "friends", #
179
- "direction" => "out"}], #
183
+ "direction" => "all"}, # two relationships.
184
+ {"type"=> "friends", #
185
+ "direction" => "out"}], #
180
186
  "prune evaluator" => {"language" => "javascript", # A prune evaluator (when to stop traversing)
181
187
  "body" => "position.endNode().getProperty('age') < 21;"},
182
188
  "return filter" => {"language" => "builtin", # "all" or "all but start node"
183
189
  "name" => "all"},
184
- "depth" => 4})
190
+ "depth" => 4})
185
191
 
186
- # "depth" is a short-hand way of specifying a prune evaluator which prunes after a certain depth.
192
+ # "depth" is a short-hand way of specifying a prune evaluator which prunes after a certain depth.
187
193
  # If not specified a depth of 1 is used and if a "prune evaluator" is specified instead of a depth, no depth limit is set.
188
194
 
189
195
  @neo.batch [:get_node, node1], [:get_node, node2] # Gets two nodes in a batch
190
- @neo.batch [:create_node, {"name" => "Max"}],
196
+ @neo.batch [:create_node, {"name" => "Max"}],
191
197
  [:create_node, {"name" => "Marc"}] # Creates two nodes in a batch
192
- @neo.batch [:set_node_property, node1, {"name" => "Tom"}],
198
+ @neo.batch [:set_node_property, node1, {"name" => "Tom"}],
193
199
  [:set_node_property, node2, {"name" => "Jerry"}] # Sets the property of two nodes
194
- @neo.batch [:create_unique_node, index_name, key, value,
200
+ @neo.batch [:create_unique_node, index_name, key, value,
195
201
  {"age" => 33, "name" => "Max"}] # Creates a unique node
196
- @neo.batch [:get_node_relationships, node1, "out",
202
+ @neo.batch [:get_node_relationships, node1, "out",
197
203
  [:get_node_relationships, node2, "out"] # Get node relationships in a batch
198
204
  @neo.batch [:get_relationship, rel1],
199
205
  [:get_relationship, rel2] # Gets two relationships in a batch
@@ -201,23 +207,24 @@ To Use:
201
207
  node1, node2, {:since => "high school"}],
202
208
  [:create_relationship, "friends",
203
209
  node1, node3, {:since => "college"}] # Creates two relationships in a batch
204
- @neo.batch [:create_unique_relationship, index_name,
210
+ @neo.batch [:create_unique_relationship, index_name,
205
211
  key, value, "friends", node1, node2] # Creates a unique relationship
206
212
  @neo.batch [:get_node_index, index_name, key, value] # Get node index
207
213
  @neo.batch [:get_relationship_index, index_name, key, value] # Get relationship index
208
214
 
209
- @neo.batch [:create_node, {"name" => "Max"}],
215
+ @neo.batch [:create_node, {"name" => "Max"}],
210
216
  [:create_node, {"name" => "Marc"}], # Creates two nodes and index them
211
217
  [:add_node_to_index, "test_node_index", key, value, "{0}"],
212
218
  [:add_node_to_index, "test_node_index", key, value, "{1}"],
213
219
  [:create_relationship, "friends", # and create a relationship for those
214
220
  "{0}", "{1}", {:since => "college"}], # newly created nodes
215
- [:add_relationship_to_index,
221
+ [:add_relationship_to_index,
216
222
  "test_relationship_index", key, value, "{4}"] # and index the new relationship
217
223
 
218
- @neo.batch *[[:create_node, {"name" => "Max"}],
224
+ @neo.batch *[[:create_node, {"name" => "Max"}],
219
225
  [:create_node, {"name" => "Marc"}]] # Use the Splat (*) with Arrays of Arrays
220
226
 
227
+
221
228
  See http://docs.neo4j.org/chunked/milestone/rest-api-batch-ops.html for Neo4j Batch operations documentation.
222
229
 
223
230
 
@@ -234,7 +241,7 @@ Experimental:
234
241
  {"age" => 24, "name" => "Alex"}) # Create two nodes with properties threaded
235
242
  nodes = @neo.get_nodes([17,86,397,33]) # Get four nodes by their id
236
243
 
237
- one_set_nodes = @neo.create_nodes(3)
244
+ one_set_nodes = @neo.create_nodes(3)
238
245
  another_node = @neo.create_node("age" => 31, "name" => "Max")
239
246
  nodes = @neo.get_nodes([one_set_nodes, another_node]) # Get four nodes
240
247
 
@@ -272,7 +279,7 @@ The Neo4j ID is available by using node.neo_id .
272
279
  n1.weight = 190 # Add a node property as a method
273
280
  n1[:name] = nil # Delete a node property using [:key] = nil
274
281
  n1.name = nil # Delete a node property by setting it to nil
275
-
282
+
276
283
  n2 = Neography::Node.create
277
284
  new_rel = Neography::Relationship.create(:family, n1, n2) # Create a relationship from my_node to node2
278
285
  new_rel.start_node # Get the start/from node of a relationship
@@ -317,13 +324,13 @@ The Neo4j ID is available by using node.neo_id .
317
324
  n1.rels(:friends).outgoing # Get outgoing friends relationships
318
325
  n1.rels(:friends).incoming # Get incoming friends relationships
319
326
  n1.rels(:friends,:work) # Get friends and work relationships
320
- n1.rels(:friends,:work).outgoing # Get outgoing friends and work relationships
321
-
327
+ n1.rels(:friends,:work).outgoing # Get outgoing friends and work relationships
328
+
322
329
  n1.all_paths_to(n2).incoming(:friends).depth(4) # Gets all paths of a specified type
323
330
  n1.all_simple_paths_to(n2).incoming(:friends).depth(4) # for the relationships defined
324
- n1.all_shortest_paths_to(n2).incoming(:friends).depth(4) # at a maximum depth
331
+ n1.all_shortest_paths_to(n2).incoming(:friends).depth(4) # at a maximum depth
325
332
  n1.path_to(n2).incoming(:friends).depth(4) # Same as above, but just one path.
326
- n1.simple_path_to(n2).incoming(:friends).depth(4)
333
+ n1.simple_path_to(n2).incoming(:friends).depth(4)
327
334
  n1.shortest_path_to(n2).incoming(:friends).depth(4)
328
335
 
329
336
  n1.shortest_path_to(n2).incoming(:friends).depth(4).rels # Gets just relationships in path
@@ -350,9 +357,9 @@ Phase 2 way of doing these:
350
357
 
351
358
  === Testing
352
359
 
353
- To run testing locally you will need to have two instances of the server running. There is some
354
- good advice on how to set up the a second instance on the
355
- {neo4j site}[http://docs.neo4j.org/chunked/stable/server-installation.html#_multiple_server_instances_on_one_machine].
360
+ To run testing locally you will need to have two instances of the server running. There is some
361
+ good advice on how to set up the a second instance on the
362
+ {neo4j site}[http://docs.neo4j.org/chunked/stable/server-installation.html#_multiple_server_instances_on_one_machine].
356
363
  Connect to the second instance in your testing environment, for example:
357
364
 
358
365
  if Rails.env.development?
@@ -361,8 +368,8 @@ Connect to the second instance in your testing environment, for example:
361
368
  @neo = Neography::Rest.new({:port => 7475})
362
369
  end
363
370
 
364
- Install the test-delete-db-extension plugin, as mentioned in the neo4j.org docs, if you want to use
365
- the Rest clean_database method to empty your database between tests. In Rspec, for example,
371
+ Install the test-delete-db-extension plugin, as mentioned in the neo4j.org docs, if you want to use
372
+ the Rest clean_database method to empty your database between tests. In Rspec, for example,
366
373
  put this in your spec_helper.rb:
367
374
 
368
375
  config.before(:each) do
@@ -15,6 +15,6 @@ module Neography
15
15
  @authentication = {}
16
16
  @username = nil
17
17
  @password = nil
18
- @parser = {:parser => CrackParser}
18
+ @parser = {:parser => OjParser}
19
19
  end
20
20
  end
@@ -0,0 +1,8 @@
1
+ class OjParser < HTTParty::Parser
2
+
3
+ protected
4
+ def json
5
+ #Oj::Doc.parse(body)
6
+ Oj.load(body)
7
+ end
8
+ end
@@ -291,6 +291,18 @@ module Neography
291
291
  index
292
292
  end
293
293
 
294
+ def get_node_auto_index(key, value)
295
+ index = get("/index/auto/node/#{key}/#{value}") || Array.new
296
+ return nil if index.empty?
297
+ index
298
+ end
299
+
300
+ def find_node_auto_index(query)
301
+ index = get("/index/auto/node/?query=#{query}") || Array.new
302
+ return nil if index.empty?
303
+ index
304
+ end
305
+
294
306
  def find_node_index(*args)
295
307
  case args.size
296
308
  when 3 then index = get("/index/node/#{args[0]}/#{args[1]}?query=#{args[2]}") || Array.new
@@ -342,6 +354,18 @@ module Neography
342
354
  index
343
355
  end
344
356
 
357
+ def get_relationship_auto_index(key, value)
358
+ index = get("/index/auto/relationship/#{key}/#{value}") || Array.new
359
+ return nil if index.empty?
360
+ index
361
+ end
362
+
363
+ def find_relationship_auto_index(query)
364
+ index = get("/index/auto/relationship/?query=#{query}") || Array.new
365
+ return nil if index.empty?
366
+ index
367
+ end
368
+
345
369
  def traverse(id, return_type, description)
346
370
  options = { :body => {"order" => get_order(description["order"]),
347
371
  "uniqueness" => get_uniqueness(description["uniqueness"]),
@@ -368,7 +392,7 @@ module Neography
368
392
  end
369
393
 
370
394
  def execute_query(query, params = {})
371
- options = { :body => {:query => query, :params => params}.to_json, :headers => {'Content-Type' => 'application/json'} }
395
+ options = { :body => {:query => query, :params => params}.to_json, :headers => {'Content-Type' => 'application/json', 'Accept' => 'application/json;stream=true'} }
372
396
  result = post(@cypher_path, options)
373
397
  end
374
398
 
@@ -383,10 +407,19 @@ module Neography
383
407
  Array(args).each_with_index do |c,i|
384
408
  batch << {:id => i}.merge(get_batch(c))
385
409
  end
386
- options = { :body => batch.to_json, :headers => {'Content-Type' => 'application/json'} }
410
+ options = { :body => batch.to_json, :headers => {'Content-Type' => 'application/json', 'Accept' => 'application/json;stream=true'} }
387
411
  post("/batch", options)
388
412
  end
389
413
 
414
+ def batch_not_streaming(*args)
415
+ batch = []
416
+ Array(args).each_with_index do |c,i|
417
+ batch << {:id => i}.merge(get_batch(c))
418
+ end
419
+ options = { :body => batch.to_json, :headers => {'Content-Type' => 'application/json'} }
420
+ post("/batch", options)
421
+ end
422
+
390
423
  # For testing (use a separate neo4j instance)
391
424
  # call this before each test or spec
392
425
  def clean_database(sanity_check = "not_really")
@@ -432,6 +465,14 @@ module Neography
432
465
  {:method => "GET", :to => "/index/relationship/#{args[1]}/#{args[2]}/#{args[3]}"}
433
466
  when :get_node_relationships
434
467
  {:method => "GET", :to => "/node/#{get_id(args[1])}/relationships/#{args[2] || 'all'}"}
468
+ when :execute_script
469
+ {:method => "POST", :to => @gremlin_path, :body => {:script => args[1], :params => args[2]}}
470
+ when :execute_query
471
+ if args[2]
472
+ {:method => "POST", :to => @cypher_path, :body => {:query => args[1], :params => args[2]}}
473
+ else
474
+ {:method => "POST", :to => @cypher_path, :body => {:query => args[1]}}
475
+ end
435
476
  else
436
477
  raise "Unknown option #{args[0]}"
437
478
  end
@@ -1,3 +1,3 @@
1
1
  module Neography
2
- VERSION = "0.0.26"
2
+ VERSION = "0.0.28"
3
3
  end
data/lib/neography.rb CHANGED
@@ -16,15 +16,16 @@ end
16
16
  DIRECTIONS = ["incoming", "in", "outgoing", "out", "all", "both"]
17
17
 
18
18
  require 'cgi'
19
- require 'crack'
20
19
  require 'httparty'
21
20
  require 'json'
21
+ require 'oj'
22
22
  require 'logger'
23
23
  require 'ostruct'
24
24
  require 'os'
25
25
  require 'zip/zipfilesystem'
26
26
 
27
- require 'neography/crack_parser'
27
+ require 'neography/oj_parser'
28
+
28
29
  require 'neography/config'
29
30
  require 'neography/rest'
30
31
  require 'neography/neography'
data/neography.gemspec CHANGED
@@ -22,10 +22,10 @@ Gem::Specification.new do |s|
22
22
  s.add_development_dependency "rspec"
23
23
  s.add_development_dependency "net-http-spy", "0.2.1"
24
24
  s.add_development_dependency "rake", "~> 0.8.7"
25
- s.add_dependency "crack", "0.1.8"
26
- s.add_dependency "httparty", "0.8.1"
25
+ s.add_dependency "httparty", ">= 0.8.1"
27
26
  s.add_dependency "rake", ">= 0.8.7"
28
27
  s.add_dependency "json"
29
28
  s.add_dependency "os"
30
29
  s.add_dependency "rubyzip"
30
+ s.add_dependency "oj"
31
31
  end
@@ -202,7 +202,6 @@ describe Neography::Rest do
202
202
  existing_index.first["self"].should == new_node["self"]
203
203
  @neo.remove_node_from_index(index_name, key, value, new_node)
204
204
  end
205
- end
206
205
 
207
206
  it "can get a node index" do
208
207
  index_name = generate_text(6)
@@ -235,6 +234,41 @@ describe Neography::Rest do
235
234
  batch_result.first["body"].first["end"].split('/').last.should == node2["self"].split('/').last
236
235
  end
237
236
 
237
+ it "can batch gremlin" do
238
+ batch_result = @neo.batch [:execute_script, "g.v(0)"]
239
+ batch_result.first.should have_key("id")
240
+ batch_result.first.should have_key("from")
241
+ batch_result.first["body"]["self"].split('/').last.should == "0"
242
+ end
243
+
244
+ it "can batch gremlin with parameters" do
245
+ new_node = @neo.create_node
246
+ id = new_node["self"].split('/').last
247
+ batch_result = @neo.batch [:execute_script, "g.v(id)", {:id => id.to_i}]
248
+ batch_result.first.should have_key("id")
249
+ batch_result.first.should have_key("from")
250
+ batch_result.first["body"]["self"].split('/').last.should == id
251
+ end
252
+
253
+ it "can batch cypher" do
254
+ batch_result = @neo.batch [:execute_query, "start n=node(0) return n"]
255
+ batch_result.first.should have_key("id")
256
+ batch_result.first.should have_key("from")
257
+ batch_result.first["body"]["data"][0][0]["self"].split('/').last.should == "0"
258
+ end
259
+
260
+ it "can batch cypher with parameters" do
261
+ new_node = @neo.create_node
262
+ id = new_node["self"].split('/').last
263
+ batch_result = @neo.batch [:execute_query, "start n=node({id}) return n", {:id => id.to_i}]
264
+ batch_result.first.should have_key("id")
265
+ batch_result.first.should have_key("from")
266
+ batch_result.first["body"]["data"][0][0]["self"].split('/').last.should == id
267
+ end
268
+
269
+
270
+ end
271
+
238
272
  describe "referenced batch" do
239
273
  it "can create a relationship from two newly created nodes" do
240
274
  batch_result = @neo.batch [:create_node, {"name" => "Max"}], [:create_node, {"name" => "Marc"}], [:create_relationship, "friends", "{0}", "{1}", {:since => "high school"}]
@@ -329,6 +363,26 @@ describe Neography::Rest do
329
363
  batch_result.first["body"][1]["self"].should == new_relationship2["self"]
330
364
  end
331
365
 
366
+ it "can create a relationship from a unique node" do
367
+
368
+ require 'net-http-spy'
369
+ Net::HTTP.http_logger_options = {:verbose => true} # see everything
370
+
371
+ batch_result = @neo.batch [:create_node, {:street1=>"94437 Kemmer Crossing", :street2=>"Apt. 333", :city=>"Abshireton", :state=>"AA", :zip=>"65820", :_type=>"Address", :created_at=>1335269478}],
372
+ [:add_node_to_index, "person_ssn", "ssn", "000-00-0001", "{0}"],
373
+ [:create_unique_node, "person", "ssn", "000-00-0001", {:first_name=>"Jane", :last_name=>"Doe", :ssn=>"000-00-0001", :_type=>"Person", :created_at=>1335269478}],
374
+ [:create_relationship, "has", "{0}", "{2}", {}]
375
+ puts batch_result.inspect
376
+
377
+
378
+ batch_result = @neo.batch [:create_unique_node, "person", "ssn", "000-00-0001", {:first_name=>"Jane", :last_name=>"Doe", :ssn=>"000-00-0001", :_type=>"Person", :created_at=>1335269478}],
379
+ [:add_node_to_index, "person_ssn", "ssn", "000-00-0001", "{0}"],
380
+ [:create_node, {:street1=>"94437 Kemmer Crossing", :street2=>"Apt. 333", :city=>"Abshireton", :state=>"AA", :zip=>"65820", :_type=>"Address", :created_at=>1335269478}],
381
+ [:create_relationship, "has", "{0}", "{2}", {}]
382
+
383
+ puts batch_result.inspect
384
+ end
385
+
332
386
  end
333
387
 
334
388
  end
@@ -293,5 +293,24 @@ describe Neography::Rest do
293
293
 
294
294
  end
295
295
 
296
+ describe "auto indexes" do
297
+
298
+ it "can get a node from an automatic index" do
299
+ pending
300
+ end
301
+
302
+ it "can query a node from an automatic index" do
303
+ pending
304
+ end
305
+
306
+ it "can get a relationship from an automatic index" do
307
+ pending
308
+ end
309
+
310
+ it "can query a relationship from an automatic index" do
311
+ pending
312
+ end
313
+
314
+ end
296
315
 
297
316
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: neography
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.26
4
+ version: 0.0.27
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-19 00:00:00.000000000Z
12
+ date: 2012-06-19 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &83777960 !ruby/object:Gem::Requirement
16
+ requirement: &77647920 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *83777960
24
+ version_requirements: *77647920
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: net-http-spy
27
- requirement: &83776860 !ruby/object:Gem::Requirement
27
+ requirement: &77647650 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - =
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 0.2.1
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *83776860
35
+ version_requirements: *77647650
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rake
38
- requirement: &83775270 !ruby/object:Gem::Requirement
38
+ requirement: &77647390 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,32 +43,21 @@ dependencies:
43
43
  version: 0.8.7
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *83775270
47
- - !ruby/object:Gem::Dependency
48
- name: crack
49
- requirement: &83773650 !ruby/object:Gem::Requirement
50
- none: false
51
- requirements:
52
- - - =
53
- - !ruby/object:Gem::Version
54
- version: 0.1.8
55
- type: :runtime
56
- prerelease: false
57
- version_requirements: *83773650
46
+ version_requirements: *77647390
58
47
  - !ruby/object:Gem::Dependency
59
48
  name: httparty
60
- requirement: &83772560 !ruby/object:Gem::Requirement
49
+ requirement: &77647160 !ruby/object:Gem::Requirement
61
50
  none: false
62
51
  requirements:
63
- - - =
52
+ - - ! '>='
64
53
  - !ruby/object:Gem::Version
65
54
  version: 0.8.1
66
55
  type: :runtime
67
56
  prerelease: false
68
- version_requirements: *83772560
57
+ version_requirements: *77647160
69
58
  - !ruby/object:Gem::Dependency
70
59
  name: rake
71
- requirement: &83771310 !ruby/object:Gem::Requirement
60
+ requirement: &77646900 !ruby/object:Gem::Requirement
72
61
  none: false
73
62
  requirements:
74
63
  - - ! '>='
@@ -76,10 +65,10 @@ dependencies:
76
65
  version: 0.8.7
77
66
  type: :runtime
78
67
  prerelease: false
79
- version_requirements: *83771310
68
+ version_requirements: *77646900
80
69
  - !ruby/object:Gem::Dependency
81
70
  name: json
82
- requirement: &83712670 !ruby/object:Gem::Requirement
71
+ requirement: &77646700 !ruby/object:Gem::Requirement
83
72
  none: false
84
73
  requirements:
85
74
  - - ! '>='
@@ -87,10 +76,10 @@ dependencies:
87
76
  version: '0'
88
77
  type: :runtime
89
78
  prerelease: false
90
- version_requirements: *83712670
79
+ version_requirements: *77646700
91
80
  - !ruby/object:Gem::Dependency
92
81
  name: os
93
- requirement: &83711580 !ruby/object:Gem::Requirement
82
+ requirement: &77646470 !ruby/object:Gem::Requirement
94
83
  none: false
95
84
  requirements:
96
85
  - - ! '>='
@@ -98,10 +87,21 @@ dependencies:
98
87
  version: '0'
99
88
  type: :runtime
100
89
  prerelease: false
101
- version_requirements: *83711580
90
+ version_requirements: *77646470
102
91
  - !ruby/object:Gem::Dependency
103
92
  name: rubyzip
104
- requirement: &83710400 !ruby/object:Gem::Requirement
93
+ requirement: &77646260 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ type: :runtime
100
+ prerelease: false
101
+ version_requirements: *77646260
102
+ - !ruby/object:Gem::Dependency
103
+ name: oj
104
+ requirement: &77646020 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,7 +109,7 @@ dependencies:
109
109
  version: '0'
110
110
  type: :runtime
111
111
  prerelease: false
112
- version_requirements: *83710400
112
+ version_requirements: *77646020
113
113
  description: A Ruby wrapper to the Neo4j Rest API see http://components.neo4j.org/neo4j-rest/
114
114
  for more details.
115
115
  email: maxdemarzi@gmail.com
@@ -135,7 +135,6 @@ files:
135
135
  - examples/traversal_example2.rb
136
136
  - lib/neography.rb
137
137
  - lib/neography/config.rb
138
- - lib/neography/crack_parser.rb
139
138
  - lib/neography/equal.rb
140
139
  - lib/neography/index.rb
141
140
  - lib/neography/neography.rb
@@ -143,6 +142,7 @@ files:
143
142
  - lib/neography/node_path.rb
144
143
  - lib/neography/node_relationship.rb
145
144
  - lib/neography/node_traverser.rb
145
+ - lib/neography/oj_parser.rb
146
146
  - lib/neography/path_traverser.rb
147
147
  - lib/neography/property.rb
148
148
  - lib/neography/property_container.rb
@@ -1,7 +0,0 @@
1
- class CrackParser < HTTParty::Parser
2
-
3
- protected
4
- def json
5
- Crack::JSON.parse(body)
6
- end
7
- end