neography 1.3.14 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/lib/neography/rest.rb +29 -472
  3. data/lib/neography/rest/batch.rb +80 -87
  4. data/lib/neography/rest/clean.rb +8 -10
  5. data/lib/neography/rest/constraints.rb +15 -25
  6. data/lib/neography/rest/cypher.rb +2 -6
  7. data/lib/neography/rest/extensions.rb +4 -8
  8. data/lib/neography/rest/gremlin.rb +2 -6
  9. data/lib/neography/rest/helpers.rb +58 -0
  10. data/lib/neography/rest/node_auto_indexes.rb +54 -8
  11. data/lib/neography/rest/node_indexes.rb +92 -17
  12. data/lib/neography/rest/node_labels.rb +15 -26
  13. data/lib/neography/rest/node_paths.rb +8 -16
  14. data/lib/neography/rest/node_properties.rb +45 -4
  15. data/lib/neography/rest/node_relationships.rb +8 -17
  16. data/lib/neography/rest/node_traversal.rb +7 -63
  17. data/lib/neography/rest/nodes.rb +21 -29
  18. data/lib/neography/rest/other_node_relationships.rb +6 -13
  19. data/lib/neography/rest/relationship_auto_indexes.rb +54 -8
  20. data/lib/neography/rest/relationship_indexes.rb +104 -14
  21. data/lib/neography/rest/relationship_properties.rb +45 -4
  22. data/lib/neography/rest/relationship_types.rb +4 -11
  23. data/lib/neography/rest/relationships.rb +6 -13
  24. data/lib/neography/rest/schema_indexes.rb +8 -16
  25. data/lib/neography/rest/spatial.rb +16 -33
  26. data/lib/neography/rest/transactions.rb +25 -26
  27. data/lib/neography/tasks.rb +2 -2
  28. data/lib/neography/version.rb +1 -1
  29. data/spec/unit/rest/batch_spec.rb +49 -50
  30. data/spec/unit/rest/clean_spec.rb +3 -4
  31. data/spec/unit/rest/constraints_spec.rb +12 -13
  32. data/spec/unit/rest/cypher_spec.rb +3 -4
  33. data/spec/unit/rest/extensions_spec.rb +5 -6
  34. data/spec/unit/rest/gremlin_spec.rb +5 -6
  35. data/spec/unit/rest/helpers_spec.rb +124 -0
  36. data/spec/unit/rest/labels_spec.rb +21 -22
  37. data/spec/unit/rest/node_auto_indexes_spec.rb +23 -24
  38. data/spec/unit/rest/node_indexes_spec.rb +42 -43
  39. data/spec/unit/rest/node_paths_spec.rb +10 -13
  40. data/spec/unit/rest/node_properties_spec.rb +22 -23
  41. data/spec/unit/rest/node_relationships_spec.rb +18 -39
  42. data/spec/unit/rest/node_traversal_spec.rb +4 -97
  43. data/spec/unit/rest/nodes_spec.rb +47 -48
  44. data/spec/unit/rest/relationship_auto_indexes_spec.rb +23 -24
  45. data/spec/unit/rest/relationship_indexes_spec.rb +42 -43
  46. data/spec/unit/rest/relationship_properties_spec.rb +22 -23
  47. data/spec/unit/rest/relationship_types_spec.rb +3 -4
  48. data/spec/unit/rest/relationships_spec.rb +5 -6
  49. data/spec/unit/rest/schema_index_spec.rb +7 -8
  50. data/spec/unit/rest/transactions_spec.rb +10 -11
  51. metadata +27 -31
  52. data/lib/neography/rest/auto_indexes.rb +0 -64
  53. data/lib/neography/rest/indexes.rb +0 -102
  54. data/lib/neography/rest/paths.rb +0 -46
  55. data/lib/neography/rest/properties.rb +0 -56
  56. data/spec/unit/rest/paths_spec.rb +0 -69
@@ -1,13 +1,9 @@
1
1
  module Neography
2
2
  class Rest
3
- class Cypher
3
+ module Cypher
4
4
  include Neography::Rest::Helpers
5
5
 
6
- def initialize(connection)
7
- @connection ||= connection
8
- end
9
-
10
- def query(query, parameters = {}, cypher_options = nil)
6
+ def execute_query(query, parameters = {}, cypher_options = nil)
11
7
  options = {
12
8
  :body => {
13
9
  :query => query,
@@ -1,17 +1,13 @@
1
1
  module Neography
2
2
  class Rest
3
- class Extensions
3
+ module Extensions
4
4
  include Neography::Rest::Helpers
5
-
6
- def initialize(connection)
7
- @connection ||= connection
8
- end
9
-
10
- def get(path)
5
+
6
+ def get_extension(path)
11
7
  @connection.get(path)
12
8
  end
13
9
 
14
- def post(path, body = {}, headers = nil)
10
+ def post_extension(path, body = {}, headers = nil)
15
11
  options = {
16
12
  :body => headers.nil? ? body.to_json : body,
17
13
  :headers => headers || json_content_type.merge({'Accept' => 'application/json;stream=true'})
@@ -1,13 +1,9 @@
1
1
  module Neography
2
2
  class Rest
3
- class Gremlin
3
+ module Gremlin
4
4
  include Neography::Rest::Helpers
5
5
 
6
- def initialize(connection)
7
- @connection ||= connection
8
- end
9
-
10
- def execute(script, parameters = {})
6
+ def execute_script(script, parameters = {})
11
7
  options = {
12
8
  :body => {
13
9
  :script => script,
@@ -32,6 +32,64 @@ module Neography
32
32
  end
33
33
  end
34
34
 
35
+ def encode(value)
36
+ CGI.escape(value.to_s).gsub("+", "%20")
37
+ end
38
+
39
+ def escape(value)
40
+ if value.class == String
41
+ "%22"+encode(value.to_s)+"%22";
42
+ else
43
+ encode(value.to_s)
44
+ end
45
+ end
46
+
47
+ def parse_order(order)
48
+ case order
49
+ when :breadth, "breadth", "breadth first", "breadthFirst", :wide, "wide"
50
+ "breadth first"
51
+ else
52
+ "depth first"
53
+ end
54
+ end
55
+
56
+ def parse_uniqueness(uniqueness)
57
+ case uniqueness
58
+ when :nodeglobal, "node global", "nodeglobal", "node_global"
59
+ "node global"
60
+ when :nodepath, "node path", "nodepath", "node_path"
61
+ "node path"
62
+ when :noderecent, "node recent", "noderecent", "node_recent"
63
+ "node recent"
64
+ when :relationshipglobal, "relationship global", "relationshipglobal", "relationship_global"
65
+ "relationship global"
66
+ when :relationshippath, "relationship path", "relationshippath", "relationship_path"
67
+ "relationship path"
68
+ when :relationshiprecent, "relationship recent", "relationshiprecent", "relationship_recent"
69
+ "relationship recent"
70
+ else
71
+ "none"
72
+ end
73
+ end
74
+
75
+ def parse_depth(depth)
76
+ return nil if depth.nil?
77
+ return 1 if depth.to_i == 0
78
+ depth.to_i
79
+ end
80
+
81
+ def parse_type(type)
82
+ case type
83
+ when :relationship, "relationship", :relationships, "relationships"
84
+ "relationship"
85
+ when :path, "path", :paths, "paths"
86
+ "path"
87
+ when :fullpath, "fullpath", :fullpaths, "fullpaths"
88
+ "fullpath"
89
+ else
90
+ "node"
91
+ end
92
+ end
35
93
 
36
94
  end
37
95
  end
@@ -1,13 +1,59 @@
1
1
  module Neography
2
2
  class Rest
3
- class NodeAutoIndexes < AutoIndexes
4
- extend Neography::Rest::Paths
5
-
6
- add_path :key_value, "/index/auto/node/:key/:value"
7
- add_path :query_index, "/index/auto/node/?query=:query"
8
- add_path :index_status, "/index/auto/node/status"
9
- add_path :index_properties, "/index/auto/node/properties"
10
- add_path :index_property, "/index/auto/node/properties/:property"
3
+ module NodeAutoIndexes
4
+
5
+ def get_node_auto_index(key, value)
6
+ index = @connection.get("/index/auto/node/%{key}/%{value}" % {:key => key, :value => encode(value)}) || []
7
+ return nil if index.empty?
8
+ index
9
+ end
10
+
11
+ def find_node_auto_index(key_or_query, value = nil)
12
+ if value
13
+ index = find_node_auto_index_by_value(key_or_query, value)
14
+ else
15
+ index = query_node_auto_index(key_or_query)
16
+ end
17
+ return nil if index.empty?
18
+ index
19
+ end
20
+
21
+ def find_node_auto_index_by_value(key, value)
22
+ @connection.get("/index/auto/node/%{key}/%{value}" % {:key => key, :value => encode(value)}) || []
23
+ end
24
+
25
+ def query_node_auto_index(query_expression)
26
+ @connection.get("/index/auto/node/?query=%{query}" % {:query => query_expression}) || []
27
+ end
28
+
29
+ def get_node_auto_index_status
30
+ @connection.get("/index/auto/node/status")
31
+ end
32
+
33
+ def set_node_auto_index_status(value = true)
34
+ options = {
35
+ :body => value.to_json,
36
+ :headers => json_content_type
37
+ }
38
+ @connection.put("/index/auto/node/status", options)
39
+ end
40
+
41
+ def get_node_auto_index_properties
42
+ @connection.get("/index/auto/node/properties")
43
+ end
44
+
45
+ def add_node_auto_index_property(property)
46
+ options = {
47
+ :body => property,
48
+ :headers => json_content_type
49
+ }
50
+ @connection.post("/index/auto/node/properties", options)
51
+ end
52
+
53
+ def remove_node_auto_index_property(property)
54
+ @connection.delete("/index/auto/node/properties/%{property}" % {:property => property})
55
+ end
56
+
11
57
 
12
58
  end
13
59
  end
@@ -1,24 +1,99 @@
1
1
  module Neography
2
2
  class Rest
3
- class NodeIndexes < Indexes
4
- extend Neography::Rest::Paths
3
+ module NodeIndexes
5
4
  include Neography::Rest::Helpers
6
5
 
7
- add_path :all, "/index/node"
8
- add_path :base, "/index/node/:index"
9
- add_path :unique, "/index/node/:index?unique"
10
- add_path :uniqueness, "/index/node/:index?uniqueness=:function"
11
- add_path :id, "/index/node/:index/:id"
12
- add_path :key, "/index/node/:index/:key/:id"
13
- add_path :value, "/index/node/:index/:key/:value/:id"
14
- add_path :key_value, "/index/node/:index/:key/:value"
15
- add_path :query, "/index/node/:index?query=:query"
6
+ def list_node_indexes
7
+ @connection.get("/index/node")
8
+ end
9
+
10
+ def create_node_index(name, type = "exact", provider = "lucene", extra_config = nil)
11
+ config = {
12
+ :type => type,
13
+ :provider => provider
14
+ }
15
+ config.merge!(extra_config) unless extra_config.nil?
16
+ options = {
17
+ :body => (
18
+ { :name => name,
19
+ :config => config
20
+ }
21
+ ).to_json,
22
+ :headers => json_content_type
23
+ }
24
+ @connection.post("/index/node", options)
25
+ end
26
+
27
+ def create_node_auto_index(type = "exact", provider = "lucene")
28
+ create_node_index("node_auto_index", type, provider)
29
+ end
30
+
31
+ def add_node_to_index(index, key, value, id, unique = false)
32
+ options = {
33
+ :body => (
34
+ { :uri => @connection.configuration + "/node/#{get_id(id)}",
35
+ :key => key,
36
+ :value => value
37
+ }
38
+ ).to_json,
39
+ :headers => json_content_type
40
+ }
41
+ path = unique ? "/index/node/%{index}?unique" % {:index => index} : "/index/node/%{index}" % {:index => index}
42
+ @connection.post(path, options)
43
+ end
44
+
45
+ def get_node_index(index, key, value)
46
+ index = @connection.get("/index/node/%{index}/%{key}/%{value}" % {:index => index, :key => key, :value => encode(value)}) || []
47
+ return nil if index.empty?
48
+ index
49
+ end
50
+
51
+ def find_node_index(index, key_or_query, value = nil)
52
+ if value
53
+ index = find_node_index_by_key_value(index, key_or_query, value)
54
+ else
55
+ index = find_node_index_by_query(index, key_or_query)
56
+ end
57
+ return nil if index.empty?
58
+ index
59
+ end
60
+
61
+ def find_node_index_by_key_value(index, key, value)
62
+ @connection.get("/index/node/%{index}/%{key}/%{value}" % {:index => index, :key => key, :value => encode(value)}) || []
63
+ end
64
+
65
+ def find_node_index_by_query(index, query)
66
+ @connection.get("/index/node/%{index}?query=%{query}" % {:index => index, :query => encode(query)}) || []
67
+ end
68
+
69
+ # Mimick original neography API in Rest class.
70
+ def remove_node_from_index(index, id_or_key, id_or_value = nil, id = nil)
71
+ if id
72
+ remove_node_index_by_value(index, id, id_or_key, id_or_value)
73
+ elsif id_or_value
74
+ remove_node_index_by_key(index, id_or_value, id_or_key)
75
+ else
76
+ remove_node_index_by_id(index, id_or_key)
77
+ end
78
+ end
79
+
80
+ def remove_node_index_by_id(index, id)
81
+ @connection.delete("/index/node/%{index}/%{id}" % {:index => index, :id => get_id(id)})
82
+ end
83
+
84
+ def remove_node_index_by_key(index, id, key)
85
+ @connection.delete("/index/node/%{index}/%{key}/%{id}" % {:index => index, :id => get_id(id), :key => key})
86
+ end
87
+
88
+ def remove_node_index_by_value(index, id, key, value)
89
+ @connection.delete("/index/node/%{index}/%{key}/%{value}/%{id}" % {:index => index, :id => get_id(id), :key => key, :value => encode(value)})
90
+ end
16
91
 
17
- def initialize(connection)
18
- super(connection, :node)
92
+ def drop_node_index(index)
93
+ @connection.delete("/index/node/%{index}" % {:index => index})
19
94
  end
20
95
 
21
- def create_unique(index, key, value, properties = {})
96
+ def create_unique_node(index, key, value, properties = {})
22
97
  options = {
23
98
  :body => (
24
99
  { :properties => properties,
@@ -28,10 +103,10 @@ module Neography
28
103
  ).to_json,
29
104
  :headers => json_content_type
30
105
  }
31
- @connection.post(unique_path(:index => index), options)
106
+ @connection.post("/index/node/%{index}?unique" % {:index => index}, options)
32
107
  end
33
108
 
34
- def get_or_create_unique(index, key, value, properties = {})
109
+ def get_or_create_unique_node(index, key, value, properties = {})
35
110
  options = {
36
111
  :body => (
37
112
  { :properties => properties,
@@ -41,7 +116,7 @@ module Neography
41
116
  ).to_json,
42
117
  :headers => json_content_type
43
118
  }
44
- @connection.post(uniqueness_path(:index => index, :function => 'get_or_create'), options)
119
+ @connection.post("/index/node/%{index}?uniqueness=%{function}" % {:index => index, :function => 'get_or_create'}, options)
45
120
 
46
121
  end
47
122
 
@@ -1,57 +1,46 @@
1
1
  module Neography
2
2
  class Rest
3
- class NodeLabels
4
- extend Neography::Rest::Paths
3
+ module NodeLabels
5
4
  include Neography::Rest::Helpers
6
5
 
7
- add_path :base, "/labels"
8
- add_path :node, "/node/:id/labels"
9
- add_path :nodes, "/label/:label/nodes"
10
- add_path :find, "/label/:label/nodes?:property=:value"
11
- add_path :delete, "/node/:id/labels/:label"
12
-
13
- def initialize(connection)
14
- @connection ||= connection
15
- end
16
-
17
- def list
18
- @connection.get(base_path)
6
+ def list_labels
7
+ @connection.get("/labels")
19
8
  end
20
9
 
21
- def get(id)
22
- @connection.get(node_path(:id => get_id(id)))
10
+ def get_node_labels(id)
11
+ @connection.get("/node/%{id}/labels" % {:id => get_id(id)})
23
12
  end
24
13
 
25
- def get_nodes(label)
26
- @connection.get(nodes_path(:label => label))
14
+ def get_nodes_labeled(label)
15
+ @connection.get("/label/%{label}/nodes" % {:label => label})
27
16
  end
28
17
 
29
- def find_nodes(label, hash)
30
- @connection.get(find_path(:label => label, :property => hash.keys.first, :value => hash.values.first))
18
+ def find_nodes_labeled(label, hash)
19
+ @connection.get("/label/%{label}/nodes?%{property}=%{value}" % {:label => label, :property => hash.keys.first, :value => escape(hash.values.first)})
31
20
  end
32
21
 
33
- def add(id, label)
22
+ def add_label(id, label)
34
23
  options = {
35
24
  :body => (
36
25
  label
37
26
  ).to_json,
38
27
  :headers => json_content_type
39
28
  }
40
- @connection.post(node_path(:id => get_id(id)), options)
29
+ @connection.post("/node/%{id}/labels" % {:id => get_id(id)}, options)
41
30
  end
42
31
 
43
- def set(id, label)
32
+ def set_label(id, label)
44
33
  options = {
45
34
  :body => (
46
35
  Array(label)
47
36
  ).to_json,
48
37
  :headers => json_content_type
49
38
  }
50
- @connection.put(node_path(:id => get_id(id)), options)
39
+ @connection.put("/node/%{id}/labels" % {:id => get_id(id)}, options)
51
40
  end
52
41
 
53
- def delete(id, label)
54
- @connection.delete(delete_path(:id => get_id(id), :label => label))
42
+ def delete_label(id, label)
43
+ @connection.delete("/node/%{id}/labels/%{label}" % {:id => get_id(id), :label => label})
55
44
  end
56
45
 
57
46
 
@@ -1,29 +1,21 @@
1
1
  module Neography
2
2
  class Rest
3
- class NodePaths
4
- extend Neography::Rest::Paths
3
+ module NodePaths
5
4
  include Neography::Rest::Helpers
6
-
7
- add_path :base, "/node/:id/path"
8
- add_path :all, "/node/:id/paths"
9
-
10
- def initialize(connection)
11
- @connection ||= connection
12
- end
13
-
14
- def get(from, to, relationships, depth = 1, algorithm = "shortestPath")
5
+
6
+ def get_path(from, to, relationships, depth = 1, algorithm = "shortestPath")
15
7
  options = path_options(to, relationships, depth, algorithm)
16
- @connection.post(base_path(:id => get_id(from)), options) || {}
8
+ @connection.post("/node/%{id}/path" % {:id => get_id(from)}, options) || {}
17
9
  end
18
10
 
19
- def get_all(from, to, relationships, depth = 1, algorithm = "allPaths")
11
+ def get_paths(from, to, relationships, depth = 1, algorithm = "allPaths")
20
12
  options = path_options(to, relationships, depth, algorithm)
21
- @connection.post(all_path(:id => get_id(from)), options) || []
13
+ @connection.post("/node/%{id}/paths" % {:id => get_id(from)}, options) || []
22
14
  end
23
15
 
24
- def shortest_weighted(from, to, relationships, weight_attribute = "weight", depth = 1, algorithm = "dijkstra")
16
+ def get_shortest_weighted_path(from, to, relationships, weight_attribute = "weight", depth = 1, algorithm = "dijkstra")
25
17
  options = path_options(to, relationships, depth, algorithm, { :cost_property => weight_attribute })
26
- @connection.post(all_path(:id => get_id(from)), options) || {}
18
+ @connection.post("/node/%{id}/paths" % {:id => get_id(from)}, options) || {}
27
19
  end
28
20
 
29
21
  private
@@ -1,10 +1,51 @@
1
1
  module Neography
2
2
  class Rest
3
- class NodeProperties < Properties
4
- extend Neography::Rest::Paths
3
+ module NodeProperties
4
+
5
+ def set_node_properties(id, properties)
6
+ properties.each do |property, value|
7
+ options = { :body => value.to_json, :headers => json_content_type }
8
+ @connection.put("/node/%{id}/properties/%{property}" % {:id => get_id(id), :property => property}, options)
9
+ end
10
+ end
11
+
12
+ def reset_node_properties(id, properties)
13
+ options = { :body => properties.to_json, :headers => json_content_type }
14
+ @connection.put("/node/%{id}/properties" % {:id => get_id(id)}, options)
15
+ end
16
+
17
+ def get_node_properties(id, *properties)
18
+ if properties.none?
19
+ @connection.get("/node/%{id}/properties" % {:id => get_id(id)})
20
+ else
21
+ get_each_node_properties(id, *properties)
22
+ end
23
+ end
24
+
25
+ def get_each_node_properties(id, *properties)
26
+ retrieved_properties = properties.flatten.inject({}) do |memo, property|
27
+ value = @connection.get("/node/%{id}/properties/%{property}" % {:id => get_id(id), :property => property})
28
+ memo[property] = value unless value.nil?
29
+ memo
30
+ end
31
+ return nil if retrieved_properties.empty?
32
+ retrieved_properties
33
+ end
34
+
35
+ def remove_node_properties(id, *properties)
36
+ if properties.none?
37
+ @connection.delete("/node/%{id}/properties" % {:id => get_id(id)})
38
+ else
39
+ remove_each_node_properties(id, *properties)
40
+ end
41
+ end
42
+
43
+ def remove_each_node_properties(id, *properties)
44
+ properties.flatten.each do |property|
45
+ @connection.delete("/node/%{id}/properties/%{property}" % {:id => get_id(id), :property => property})
46
+ end
47
+ end
5
48
 
6
- add_path :all, "/node/:id/properties"
7
- add_path :single, "/node/:id/properties/:property"
8
49
 
9
50
  end
10
51
  end