neography-down 1.6.4

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.
Files changed (128) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.project +12 -0
  4. data/.rspec +1 -0
  5. data/.travis.yml +4 -0
  6. data/CHANGELOG.md +939 -0
  7. data/CONTRIBUTORS +18 -0
  8. data/Gemfile +4 -0
  9. data/Guardfile +14 -0
  10. data/LICENSE +19 -0
  11. data/README.md +281 -0
  12. data/Rakefile +14 -0
  13. data/examples/facebook.rb +40 -0
  14. data/examples/facebook_v2.rb +25 -0
  15. data/examples/greatest.rb +43 -0
  16. data/examples/linkedin.rb +39 -0
  17. data/examples/linkedin_v2.rb +22 -0
  18. data/examples/traversal_example1.rb +65 -0
  19. data/examples/traversal_example2.rb +54 -0
  20. data/lib/neography.rb +45 -0
  21. data/lib/neography/config.rb +64 -0
  22. data/lib/neography/connection.rb +263 -0
  23. data/lib/neography/equal.rb +21 -0
  24. data/lib/neography/errors.rb +60 -0
  25. data/lib/neography/index.rb +52 -0
  26. data/lib/neography/multi_json_parser.rb +28 -0
  27. data/lib/neography/neography.rb +10 -0
  28. data/lib/neography/node.rb +63 -0
  29. data/lib/neography/node_path.rb +29 -0
  30. data/lib/neography/node_relationship.rb +37 -0
  31. data/lib/neography/node_traverser.rb +146 -0
  32. data/lib/neography/path_traverser.rb +100 -0
  33. data/lib/neography/property.rb +110 -0
  34. data/lib/neography/property_container.rb +28 -0
  35. data/lib/neography/railtie.rb +19 -0
  36. data/lib/neography/relationship.rb +78 -0
  37. data/lib/neography/relationship_traverser.rb +80 -0
  38. data/lib/neography/rest.rb +99 -0
  39. data/lib/neography/rest/batch.rb +414 -0
  40. data/lib/neography/rest/clean.rb +17 -0
  41. data/lib/neography/rest/constraints.rb +38 -0
  42. data/lib/neography/rest/cypher.rb +29 -0
  43. data/lib/neography/rest/extensions.rb +21 -0
  44. data/lib/neography/rest/gremlin.rb +20 -0
  45. data/lib/neography/rest/helpers.rb +96 -0
  46. data/lib/neography/rest/node_auto_indexes.rb +60 -0
  47. data/lib/neography/rest/node_indexes.rb +139 -0
  48. data/lib/neography/rest/node_labels.rb +49 -0
  49. data/lib/neography/rest/node_paths.rb +49 -0
  50. data/lib/neography/rest/node_properties.rb +52 -0
  51. data/lib/neography/rest/node_relationships.rb +33 -0
  52. data/lib/neography/rest/node_traversal.rb +25 -0
  53. data/lib/neography/rest/nodes.rb +94 -0
  54. data/lib/neography/rest/other_node_relationships.rb +38 -0
  55. data/lib/neography/rest/relationship_auto_indexes.rb +60 -0
  56. data/lib/neography/rest/relationship_indexes.rb +142 -0
  57. data/lib/neography/rest/relationship_properties.rb +52 -0
  58. data/lib/neography/rest/relationship_types.rb +11 -0
  59. data/lib/neography/rest/relationships.rb +16 -0
  60. data/lib/neography/rest/schema_indexes.rb +26 -0
  61. data/lib/neography/rest/spatial.rb +137 -0
  62. data/lib/neography/rest/transactions.rb +101 -0
  63. data/lib/neography/tasks.rb +207 -0
  64. data/lib/neography/version.rb +3 -0
  65. data/neography.gemspec +39 -0
  66. data/spec/integration/authorization_spec.rb +40 -0
  67. data/spec/integration/broken_spatial_spec.rb +28 -0
  68. data/spec/integration/index_spec.rb +71 -0
  69. data/spec/integration/neography_spec.rb +10 -0
  70. data/spec/integration/node_encoding_spec.rb +71 -0
  71. data/spec/integration/node_path_spec.rb +222 -0
  72. data/spec/integration/node_relationship_spec.rb +381 -0
  73. data/spec/integration/node_spec.rb +260 -0
  74. data/spec/integration/parsing_spec.rb +13 -0
  75. data/spec/integration/performance_spec.rb +17 -0
  76. data/spec/integration/relationship_spec.rb +37 -0
  77. data/spec/integration/rest_batch_no_streaming_spec.rb +41 -0
  78. data/spec/integration/rest_batch_spec.rb +604 -0
  79. data/spec/integration/rest_batch_streaming_spec.rb +51 -0
  80. data/spec/integration/rest_bulk_spec.rb +106 -0
  81. data/spec/integration/rest_constraints_spec.rb +72 -0
  82. data/spec/integration/rest_experimental_spec.rb +22 -0
  83. data/spec/integration/rest_gremlin_fail_spec.rb +46 -0
  84. data/spec/integration/rest_header_spec.rb +15 -0
  85. data/spec/integration/rest_index_spec.rb +481 -0
  86. data/spec/integration/rest_labels_spec.rb +128 -0
  87. data/spec/integration/rest_node_spec.rb +274 -0
  88. data/spec/integration/rest_other_node_relationship_spec.rb +137 -0
  89. data/spec/integration/rest_path_spec.rb +231 -0
  90. data/spec/integration/rest_plugin_spec.rb +177 -0
  91. data/spec/integration/rest_relationship_spec.rb +354 -0
  92. data/spec/integration/rest_relationship_types_spec.rb +18 -0
  93. data/spec/integration/rest_schema_index_spec.rb +32 -0
  94. data/spec/integration/rest_spatial_spec.rb +166 -0
  95. data/spec/integration/rest_transaction_spec.rb +166 -0
  96. data/spec/integration/rest_traverse_spec.rb +149 -0
  97. data/spec/integration/unmanaged_spec.rb +27 -0
  98. data/spec/matchers.rb +33 -0
  99. data/spec/neography_spec.rb +23 -0
  100. data/spec/spec_helper.rb +44 -0
  101. data/spec/unit/config_spec.rb +135 -0
  102. data/spec/unit/connection_spec.rb +284 -0
  103. data/spec/unit/node_spec.rb +100 -0
  104. data/spec/unit/properties_spec.rb +285 -0
  105. data/spec/unit/relationship_spec.rb +118 -0
  106. data/spec/unit/rest/batch_spec.rb +262 -0
  107. data/spec/unit/rest/clean_spec.rb +16 -0
  108. data/spec/unit/rest/constraints_spec.rb +45 -0
  109. data/spec/unit/rest/cypher_spec.rb +20 -0
  110. data/spec/unit/rest/extensions_spec.rb +28 -0
  111. data/spec/unit/rest/gremlin_spec.rb +25 -0
  112. data/spec/unit/rest/helpers_spec.rb +124 -0
  113. data/spec/unit/rest/labels_spec.rb +77 -0
  114. data/spec/unit/rest/node_auto_indexes_spec.rb +70 -0
  115. data/spec/unit/rest/node_indexes_spec.rb +140 -0
  116. data/spec/unit/rest/node_paths_spec.rb +77 -0
  117. data/spec/unit/rest/node_properties_spec.rb +79 -0
  118. data/spec/unit/rest/node_relationships_spec.rb +57 -0
  119. data/spec/unit/rest/node_traversal_spec.rb +35 -0
  120. data/spec/unit/rest/nodes_spec.rb +187 -0
  121. data/spec/unit/rest/relationship_auto_indexes_spec.rb +66 -0
  122. data/spec/unit/rest/relationship_indexes_spec.rb +132 -0
  123. data/spec/unit/rest/relationship_properties_spec.rb +79 -0
  124. data/spec/unit/rest/relationship_types_spec.rb +15 -0
  125. data/spec/unit/rest/relationships_spec.rb +21 -0
  126. data/spec/unit/rest/schema_index_spec.rb +30 -0
  127. data/spec/unit/rest/transactions_spec.rb +43 -0
  128. metadata +372 -0
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ describe Neography::Rest do
4
+ before(:each) do
5
+ @neo = Neography::Rest.new
6
+ end
7
+
8
+ describe "streaming" do
9
+
10
+ it "can send a 1000 item batch" do
11
+ commands = []
12
+ 1000.times do |x|
13
+ commands << [:create_node, {"name" => "Max " + x.to_s}]
14
+ end
15
+ batch_result = @neo.batch *commands
16
+ expect(batch_result.first["body"]["data"]["name"]).to eq("Max 0")
17
+ expect(batch_result.last["body"]["data"]["name"]).to eq("Max 999")
18
+ end
19
+
20
+ it "can send a 5000 item batch" do
21
+ commands = []
22
+ 5000.times do |x|
23
+ commands << [:get_node, 0]
24
+ end
25
+ batch_result = @neo.batch *commands
26
+ expect(batch_result.first["body"]["self"].split('/').last).to eq("0")
27
+ expect(batch_result.last["body"]["self"].split('/').last).to eq("0")
28
+ end
29
+
30
+ it "can send a 7000 get item batch" do
31
+ commands = []
32
+ 7000.times do |x|
33
+ commands << [:get_node, 0]
34
+ end
35
+ batch_result = @neo.batch *commands
36
+ expect(batch_result.first["body"]["self"].split('/').last).to eq("0")
37
+ expect(batch_result.last["body"]["self"].split('/').last).to eq("0")
38
+ end
39
+
40
+ it "can send a 5000 create item batch" do
41
+ commands = []
42
+ 5000.times do |x|
43
+ commands << [:create_node, {"name" => "Max " + x.to_s}]
44
+ end
45
+ batch_result = @neo.batch *commands
46
+ expect(batch_result.first["body"]["data"]["name"]).to eq("Max 0")
47
+ expect(batch_result.last["body"]["data"]["name"]).to eq("Max 4999")
48
+ end
49
+
50
+ end
51
+ end
@@ -0,0 +1,106 @@
1
+ require 'spec_helper'
2
+
3
+ describe Neography::Rest do
4
+ before(:each) do
5
+ @neo = Neography::Rest.new
6
+ end
7
+
8
+ describe "can create many nodes threaded" do
9
+ it "can create empty nodes threaded" do
10
+ new_nodes = @neo.create_nodes_threaded(2)
11
+ expect(new_nodes).not_to be_nil
12
+ expect(new_nodes.size).to eq(2)
13
+ end
14
+
15
+ it "is faster than non-threaded?" , :slow => true do
16
+ Benchmark.bm do |x|
17
+ x.report("create 500 nodes ") { @not_threaded = @neo.create_nodes(500) }
18
+ x.report("create 500 nodes threaded") { @threaded = @neo.create_nodes_threaded(500) }
19
+ x.report("create 1000 nodes threaded") { @threaded2c = @neo.create_nodes_threaded(1000) }
20
+ end
21
+
22
+ expect(@not_threaded[99]).not_to be_nil
23
+ expect(@threaded[99]).not_to be_nil
24
+ expect(@threaded2c[199]).not_to be_nil
25
+ end
26
+
27
+ end
28
+
29
+ describe "can create many nodes" do
30
+ it "can create empty nodes" do
31
+ new_nodes = @neo.create_nodes(2)
32
+ expect(new_nodes).not_to be_nil
33
+ expect(new_nodes.size).to eq(2)
34
+ end
35
+
36
+ it "can create nodes with one property" do
37
+ new_nodes = @neo.create_nodes([{"name" => "Max"}, {"name" => "Alex"}])
38
+ expect(new_nodes[0]["data"]["name"]).to eq("Max")
39
+ expect(new_nodes[1]["data"]["name"]).to eq("Alex")
40
+ end
41
+
42
+ it "can create nodes with one property that are different" do
43
+ new_nodes = @neo.create_nodes([{"name" => "Max"}, {"age" => 24}])
44
+ expect(new_nodes[0]["data"]["name"]).to eq("Max")
45
+ expect(new_nodes[1]["data"]["age"]).to eq(24)
46
+ end
47
+
48
+ it "can create nodes with more than one property" do
49
+ new_nodes = @neo.create_nodes([{"age" => 31, "name" => "Max"}, {"age" => 24, "name" => "Alex"}])
50
+ expect(new_nodes[0]["data"]["name"]).to eq("Max")
51
+ expect(new_nodes[0]["data"]["age"]).to eq(31)
52
+ expect(new_nodes[1]["data"]["name"]).to eq("Alex")
53
+ expect(new_nodes[1]["data"]["age"]).to eq(24)
54
+ end
55
+
56
+ it "can create nodes with more than one property that are different" do
57
+ new_nodes = @neo.create_nodes([{"age" => 31, "name" => "Max"}, {"height" => "5-11", "weight" => 215}])
58
+ expect(new_nodes[0]["data"]["name"]).to eq("Max")
59
+ expect(new_nodes[0]["data"]["age"]).to eq(31)
60
+ expect(new_nodes[1]["data"]["height"]).to eq("5-11")
61
+ expect(new_nodes[1]["data"]["weight"]).to eq(215)
62
+ end
63
+
64
+ it "is not super slow?" , :slow => true do
65
+ Benchmark.bm do |x|
66
+ x.report( "create 1 node" ) { @neo.create_nodes( 1) }
67
+ x.report( "create 10 nodes") { @neo.create_nodes( 10) }
68
+ x.report("create 100 nodes") { @neo.create_nodes(100) }
69
+ end
70
+ end
71
+ end
72
+
73
+ describe "can get many nodes" do
74
+ it "can get 2 nodes passed in as an array" do
75
+ new_nodes = @neo.create_nodes(2)
76
+ existing_nodes = @neo.get_nodes(new_nodes)
77
+ expect(existing_nodes).not_to be_nil
78
+ expect(existing_nodes.size).to eq(2)
79
+ end
80
+
81
+ it "can get 2 nodes passed in by commas" do
82
+ new_nodes = @neo.create_nodes(2)
83
+ new_node1 = new_nodes[0]["self"].split('/').last
84
+ new_node2 = new_nodes[1]["self"].split('/').last
85
+ existing_nodes = @neo.get_nodes(new_node1, new_node2)
86
+ expect(existing_nodes).not_to be_nil
87
+ expect(existing_nodes.size).to eq(2)
88
+ existing_nodes[0]["self"] == new_node1["self"]
89
+ existing_nodes[1]["self"] == new_node2["self"]
90
+ end
91
+
92
+ it "is not super slow?" , :slow => true do
93
+ one_node = @neo.create_nodes( 1)
94
+ ten_nodes = @neo.create_nodes( 10)
95
+ one_hundred_nodes = @neo.create_nodes(100)
96
+
97
+ Benchmark.bm do |x|
98
+ x.report( "get 1 node ") { @neo.get_nodes(one_node) }
99
+ x.report( "get 10 nodes") { @neo.get_nodes(ten_nodes) }
100
+ x.report("get 100 nodes") { @neo.get_nodes(one_hundred_nodes) }
101
+ end
102
+ end
103
+
104
+ end
105
+
106
+ end
@@ -0,0 +1,72 @@
1
+ require 'spec_helper'
2
+
3
+ describe Neography::Rest do
4
+ before(:each) do
5
+ @neo = Neography::Rest.new
6
+ end
7
+
8
+ describe "create unique constraint" do
9
+ it "can create a unique constraint" do
10
+ label = "User"
11
+ property = "user_id"
12
+ uc = @neo.create_unique_constraint(label, property)
13
+ expect(uc).not_to be_nil
14
+ expect(uc["label"]).to eq(label)
15
+ expect(uc["property_keys"]).to eq([property])
16
+ end
17
+ end
18
+
19
+ describe "get a unique constraint" do
20
+ it "can get a unique constraint" do
21
+ label = "User"
22
+ property = "user_id"
23
+ uc = @neo.get_unique_constraint(label, property)
24
+ expect(uc).not_to be_nil
25
+ expect(uc.first["label"]).to eq(label)
26
+ expect(uc.first["property_keys"]).to eq([property])
27
+ end
28
+ end
29
+
30
+ describe "get unique constraints" do
31
+ it "can get unique constraints for a label" do
32
+ label = "User"
33
+ property = "user_id"
34
+ uc = @neo.get_uniqueness(label)
35
+ expect(uc).not_to be_nil
36
+ expect(uc.first["label"]).to eq(label)
37
+ expect(uc.first["property_keys"]).to eq([property])
38
+ end
39
+ end
40
+
41
+ describe "list constraints" do
42
+ it "can get a list of constraints" do
43
+ label = "User"
44
+ property = "user_id"
45
+ cs = @neo.get_constraints
46
+ expect(cs).not_to be_nil
47
+ expect(cs.first["label"]).to eq(label)
48
+ expect(cs.first["property_keys"]).to eq([property])
49
+ end
50
+
51
+ it "can get a list of constraints for a specifc label" do
52
+ label = "User"
53
+ property = "user_id"
54
+ cs = @neo.get_constraints(label)
55
+ expect(cs).not_to be_nil
56
+ expect(cs.first["label"]).to eq(label)
57
+ expect(cs.first["property_keys"]).to eq([property])
58
+ end
59
+ end
60
+
61
+ describe "drop a constraint" do
62
+ it "can drop a constraint" do
63
+ label = "User"
64
+ property = "user_id"
65
+ uc = @neo.drop_constraint(label, property)
66
+ expect(uc).to be_nil
67
+ cs = @neo.get_constraints(label)
68
+ expect(cs).to be_empty
69
+ end
70
+ end
71
+
72
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe Neography::Rest do
4
+ before(:each) do
5
+ @neo = Neography::Rest.new
6
+ end
7
+
8
+
9
+ describe "get_nodes", :slow => true do
10
+ it "can get nodes that exists" do
11
+ existing_nodes = @neo.get_nodes
12
+ expect(existing_nodes).not_to be_nil
13
+ end
14
+
15
+ it "can get all nodes that exists the ugly way" do
16
+ new_node = @neo.create_node
17
+ last_node_id = new_node["self"].split('/').last.to_i
18
+ existing_nodes = @neo.get_nodes((1..last_node_id).to_a)
19
+ expect(existing_nodes).not_to be_nil
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe Neography::Rest do
4
+ before(:each) do
5
+ @neo = Neography::Rest.new
6
+ end
7
+
8
+ describe "don't break gremlin" do
9
+ it "can handle node and relationship indexes", :gremlin => true do
10
+ new_node1 = @neo.create_node
11
+ new_node2 = @neo.create_node
12
+ new_relationship = @neo.create_relationship("friends", new_node1, new_node2)
13
+ key = generate_text(6)
14
+ value = generate_text
15
+ @neo.add_node_to_index("test_index", key, value, new_node1)
16
+ @neo.add_relationship_to_index("test_index2", key, value, new_relationship)
17
+ end
18
+
19
+ it "gremlin works", :gremlin => true do
20
+ root_node = @neo.execute_script("g.v(0)")
21
+ expect(root_node).to have_key("self")
22
+ expect(root_node["self"].split('/').last).to eq("0")
23
+ end
24
+ end
25
+
26
+
27
+ describe "break gremlin" do
28
+ it "can can't handle node and relationship indexes with the same name", :gremlin => true do
29
+ new_node1 = @neo.create_node
30
+ new_node2 = @neo.create_node
31
+ new_relationship = @neo.create_relationship("friends", new_node1, new_node2)
32
+ key = generate_text(6)
33
+ value = generate_text
34
+ @neo.add_node_to_index("test_index3", key, value, new_node1)
35
+ @neo.add_relationship_to_index("test_index3", key, value, new_relationship)
36
+ end
37
+
38
+ it "gremlin works", :gremlin => true do
39
+ root_node = @neo.execute_script("g.v(0)")
40
+ expect(root_node).to have_key("self")
41
+ expect(root_node["self"].split('/').last).to eq("0")
42
+ end
43
+ end
44
+
45
+
46
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe Neography::Connection do
4
+
5
+ it "should not add a content-type header if there's no existing headers" do
6
+ expect(subject.merge_options({}).keys).to eq([])
7
+ end
8
+
9
+ it "should add a content type if there's existing headers" do
10
+ expect(subject.merge_options({:headers => {'Content-Type' => 'foo/bar'}})[:headers]).to eq(
11
+ {'Content-Type' => "foo/bar", "User-Agent" => "Neography/#{Neography::VERSION}" , "X-Stream"=>true, "max-execution-time"=>6000}
12
+ )
13
+ end
14
+
15
+ end
@@ -0,0 +1,481 @@
1
+ require 'spec_helper'
2
+
3
+ describe Neography::Rest do
4
+ before(:each) do
5
+ @neo = Neography::Rest.new
6
+ end
7
+
8
+ describe "list indexes" do
9
+ it "can get a listing of node indexes" do
10
+ new_node = @neo.create_node
11
+ key = generate_text(6)
12
+ value = generate_text
13
+ @neo.add_node_to_index("test_node_index", key, value, new_node)
14
+ expect(@neo.list_indexes).not_to be_nil
15
+ end
16
+
17
+ it "can get a listing of relationship indexes" do
18
+ new_node1 = @neo.create_node
19
+ new_node2 = @neo.create_node
20
+ new_relationship = @neo.create_relationship("friends", new_node1, new_node2)
21
+ key = generate_text(6)
22
+ value = generate_text
23
+ @neo.add_relationship_to_index("test_relationship_index", key, value, new_relationship)
24
+ expect(@neo.list_relationship_indexes).not_to be_nil
25
+ end
26
+ end
27
+
28
+ describe "create an index" do
29
+ it "can create a node index" do
30
+ name = generate_text(6)
31
+ new_index = @neo.create_node_index(name)
32
+ expect(new_index).not_to be_nil
33
+ expect(new_index["template"]).to eq("#{@neo.configuration}/db/data/index/node/#{name}/{key}/{value}")
34
+ expect(new_index["provider"]).to eq("lucene")
35
+ expect(new_index["type"]).to eq("exact")
36
+ end
37
+
38
+ it "can create a node index with options" do
39
+ name = generate_text(6)
40
+ new_index = @neo.create_node_index(name, "fulltext","lucene")
41
+ expect(new_index).not_to be_nil
42
+ expect(new_index["template"]).to eq("#{@neo.configuration}/db/data/index/node/#{name}/{key}/{value}")
43
+ expect(new_index["provider"]).to eq("lucene")
44
+ expect(new_index["type"]).to eq("fulltext")
45
+ end
46
+
47
+ it "can create a node index with extra configuration options" do
48
+ name = generate_text(6)
49
+ new_index = @neo.create_node_index(name, "fulltext","lucene", extra: 'extra-value')
50
+ expect(new_index).not_to be_nil
51
+ expect(new_index["template"]).to eq("#{@neo.configuration}/db/data/index/node/#{name}/{key}/{value}")
52
+ expect(new_index["provider"]).to eq("lucene")
53
+ expect(new_index["extra"]).to eq("extra-value")
54
+ expect(new_index["type"]).to eq("fulltext")
55
+ end
56
+
57
+ it "can create a relationship index" do
58
+ name = generate_text(6)
59
+ new_index = @neo.create_relationship_index(name)
60
+ expect(new_index).not_to be_nil
61
+ expect(new_index["template"]).to eq("#{@neo.configuration}/db/data/index/relationship/#{name}/{key}/{value}")
62
+ expect(new_index["provider"]).to eq("lucene")
63
+ expect(new_index["type"]).to eq("exact")
64
+ end
65
+
66
+ it "can create a relationship index with options" do
67
+ name = generate_text(6)
68
+ new_index = @neo.create_relationship_index(name, "fulltext","lucene")
69
+ expect(new_index).not_to be_nil
70
+ expect(new_index["template"]).to eq("#{@neo.configuration}/db/data/index/relationship/#{name}/{key}/{value}")
71
+ expect(new_index["provider"]).to eq("lucene")
72
+ expect(new_index["type"]).to eq("fulltext")
73
+ end
74
+
75
+
76
+ end
77
+
78
+ describe "add to index" do
79
+ it "can add a node to an index" do
80
+ new_node = @neo.create_node
81
+ key = generate_text(6)
82
+ value = generate_text
83
+ @neo.add_node_to_index("test_node_index", key, value, new_node)
84
+ new_index = @neo.get_node_index("test_node_index", key, value)
85
+ expect(new_index).not_to be_nil
86
+ @neo.remove_node_from_index("test_node_index", key, value, new_node)
87
+ end
88
+
89
+ it "can add a relationship to an index" do
90
+ new_node1 = @neo.create_node
91
+ new_node2 = @neo.create_node
92
+ new_relationship = @neo.create_relationship("friends", new_node1, new_node2)
93
+ key = generate_text(6)
94
+ value = generate_text
95
+ @neo.add_relationship_to_index("test_relationship_index", key, value, new_relationship)
96
+ new_index = @neo.get_relationship_index("test_relationship_index", key, value)
97
+ expect(new_index).not_to be_nil
98
+ @neo.remove_relationship_from_index("test_relationship_index", key, value, new_relationship)
99
+ end
100
+ end
101
+
102
+ describe "remove from index" do
103
+ it "can remove a node from an index" do
104
+ new_node = @neo.create_node
105
+ key = generate_text(6)
106
+ value = generate_text
107
+ @neo.add_node_to_index("test_node_index", key, value, new_node)
108
+ new_index = @neo.get_node_index("test_node_index", key, value)
109
+ expect(new_index).not_to be_nil
110
+ @neo.remove_node_from_index("test_node_index", key, value, new_node)
111
+ new_index = @neo.get_node_index("test_node_index", key, value)
112
+ expect(new_index).to be_nil
113
+ end
114
+
115
+ it "can remove a node from an index without supplying value" do
116
+ new_node = @neo.create_node
117
+ key = generate_text(6)
118
+ value = generate_text
119
+ @neo.add_node_to_index("test_node_index", key, value, new_node)
120
+ new_index = @neo.get_node_index("test_node_index", key, value)
121
+ expect(new_index).not_to be_nil
122
+ @neo.remove_node_from_index("test_node_index", key, new_node)
123
+ new_index = @neo.get_node_index("test_node_index", key, value)
124
+ expect(new_index).to be_nil
125
+ end
126
+
127
+ it "can remove a node from an index without supplying key nor value" do
128
+ new_node = @neo.create_node
129
+ key = generate_text(6)
130
+ value = generate_text
131
+ @neo.add_node_to_index("test_node_index", key, value, new_node)
132
+ new_index = @neo.get_node_index("test_node_index", key, value)
133
+ expect(new_index).not_to be_nil
134
+ @neo.remove_node_from_index("test_node_index", new_node)
135
+ new_index = @neo.get_node_index("test_node_index", key, value)
136
+ expect(new_index).to be_nil
137
+ end
138
+
139
+ it "can remove a relationship from an index" do
140
+ new_node1 = @neo.create_node
141
+ new_node2 = @neo.create_node
142
+ new_relationship = @neo.create_relationship("friends", new_node1, new_node2)
143
+ key = generate_text(6)
144
+ value = generate_text
145
+ @neo.add_relationship_to_index("test_relationship_index", key, value, new_relationship)
146
+ new_index = @neo.get_relationship_index("test_relationship_index", key, value)
147
+ expect(new_index).not_to be_nil
148
+ @neo.remove_relationship_from_index("test_relationship_index", key, value, new_relationship)
149
+ new_index = @neo.get_relationship_index("test_relationship_index", key, value)
150
+ expect(new_index).to be_nil
151
+ end
152
+
153
+ it "can remove a relationship from an index without supplying value" do
154
+ new_node1 = @neo.create_node
155
+ new_node2 = @neo.create_node
156
+ new_relationship = @neo.create_relationship("friends", new_node1, new_node2)
157
+ key = generate_text(6)
158
+ value = generate_text
159
+ @neo.add_relationship_to_index("test_relationship_index", key, value, new_relationship)
160
+ new_index = @neo.get_relationship_index("test_relationship_index", key, value)
161
+ expect(new_index).not_to be_nil
162
+ @neo.remove_relationship_from_index("test_relationship_index", key, new_relationship)
163
+ new_index = @neo.get_relationship_index("test_relationship_index", key, value)
164
+ expect(new_index).to be_nil
165
+ end
166
+
167
+ it "can remove a relationship from an index without supplying key nor value" do
168
+ new_node1 = @neo.create_node
169
+ new_node2 = @neo.create_node
170
+ new_relationship = @neo.create_relationship("friends", new_node1, new_node2)
171
+ key = generate_text(6)
172
+ value = generate_text
173
+ @neo.add_relationship_to_index("test_relationship_index", key, value, new_relationship)
174
+ new_index = @neo.get_relationship_index("test_relationship_index", key, value)
175
+ expect(new_index).not_to be_nil
176
+ @neo.remove_relationship_from_index("test_relationship_index", new_relationship)
177
+ new_index = @neo.get_relationship_index("test_relationship_index", key, value)
178
+ expect(new_index).to be_nil
179
+ end
180
+
181
+ it "throws an error when there is an empty string in the value when removing a node" do
182
+ new_node = @neo.create_node
183
+ key = generate_text(6)
184
+ value = generate_text
185
+ @neo.add_node_to_index("test_node_index", key, value, new_node)
186
+ new_index = @neo.get_node_index("test_node_index", key, value)
187
+ expect(new_index).not_to be_nil
188
+ expect { @neo.remove_node_from_index("test_node_index", key, "", new_node) }.to raise_error Neography::NeographyError
189
+ end
190
+ end
191
+
192
+ describe "get index" do
193
+ it "can get a node index" do
194
+ new_node = @neo.create_node
195
+ key = generate_text(6)
196
+ value = generate_text
197
+ @neo.add_node_to_index("test_node_index", key, value, new_node)
198
+ new_index = @neo.get_node_index("test_node_index", key, value)
199
+ expect(new_index).not_to be_nil
200
+ @neo.remove_node_from_index("test_node_index", key, value, new_node)
201
+ end
202
+
203
+ it "can get a node index with a space in the value" do
204
+ new_node = @neo.create_node
205
+ key = generate_text(6)
206
+ value = generate_text + " " + generate_text
207
+ @neo.add_node_to_index("test_node_index", key, value, new_node)
208
+ new_index = @neo.get_node_index("test_node_index", key, value)
209
+ expect(new_index).not_to be_nil
210
+ @neo.remove_node_from_index("test_node_index", key, value, new_node)
211
+ end
212
+
213
+ it "can get a node index with a slash in the value" do
214
+ new_node = @neo.create_node
215
+ key = generate_text(6)
216
+ value = generate_text + "/" + generate_text
217
+ @neo.add_node_to_index("test_node_index", key, value, new_node)
218
+ new_index = @neo.get_node_index("test_node_index", key, value)
219
+ expect(new_index).not_to be_nil
220
+ @neo.remove_node_from_index("test_node_index", key, value, new_node)
221
+ end
222
+
223
+ it "can get a relationship index" do
224
+ new_node1 = @neo.create_node
225
+ new_node2 = @neo.create_node
226
+ new_relationship = @neo.create_relationship("friends", new_node1, new_node2)
227
+ key = generate_text(6)
228
+ value = generate_text
229
+ @neo.add_relationship_to_index("test_relationship_index", key, value, new_relationship)
230
+ new_index = @neo.get_relationship_index("test_relationship_index", key, value)
231
+ expect(new_index).not_to be_nil
232
+ @neo.remove_relationship_from_index("test_relationship_index", key, value, new_relationship)
233
+ end
234
+ end
235
+
236
+ describe "query index" do
237
+ it "can query a node index" do
238
+ new_node = @neo.create_node
239
+ key = generate_text(6)
240
+ value = generate_text
241
+ @neo.add_node_to_index("test_node_index", key, value, new_node)
242
+ new_index = @neo.get_node_index("test_node_index", key, value)
243
+ expect(new_index.first["self"]).to eq(new_node["self"])
244
+ @neo.remove_node_from_index("test_node_index", key, value, new_node)
245
+ end
246
+
247
+ it "can find a node index" do
248
+ new_node = @neo.create_node
249
+ key = generate_text(6)
250
+ value = generate_text
251
+ @neo.add_node_to_index("test_node_index", key, value, new_node)
252
+ new_index = @neo.find_node_index("test_node_index", key, value)
253
+ expect(new_index.first["self"]).to eq(new_node["self"])
254
+ @neo.remove_node_from_index("test_node_index", key, value, new_node)
255
+ end
256
+
257
+ it "can find a node index using generic query" do
258
+ new_node = @neo.create_node
259
+ key = generate_text(6)
260
+ value = generate_text
261
+ @neo.add_node_to_index("test_node_index", key, value, new_node)
262
+ new_index = @neo.find_node_index("test_node_index", "#{key}: #{value}")
263
+ expect(new_index.first["self"]).to eq(new_node["self"])
264
+ @neo.remove_node_from_index("test_node_index", key, value, new_node)
265
+ end
266
+
267
+ it "can find a node index with spaces in the value" do
268
+ new_node = @neo.create_node
269
+ key = generate_text(6)
270
+ value = generate_text + ' ' + generate_text
271
+ @neo.add_node_to_index("test_node_index", key, value, new_node)
272
+ new_index = @neo.find_node_index("test_node_index", key, value)
273
+ expect(new_index).not_to be_nil
274
+ expect(new_index.first["self"]).to eq(new_node["self"])
275
+ @neo.remove_node_from_index("test_node_index", key, value, new_node)
276
+ end
277
+
278
+ it "can find a node index with slashes in the value" do
279
+ new_node = @neo.create_node
280
+ key = generate_text(6)
281
+ value = generate_text + '/' + generate_text
282
+ @neo.add_node_to_index("test_node_index", key, value, new_node)
283
+ new_index = @neo.find_node_index("test_node_index", key, value)
284
+ expect(new_index).not_to be_nil
285
+ expect(new_index.first["self"]).to eq(new_node["self"])
286
+ @neo.remove_node_from_index("test_node_index", key, value, new_node)
287
+ end
288
+
289
+ it "can get a relationship index" do
290
+ new_node1 = @neo.create_node
291
+ new_node2 = @neo.create_node
292
+ new_relationship = @neo.create_relationship("friends", new_node1, new_node2)
293
+ key = generate_text(6)
294
+ value = generate_text
295
+ @neo.add_relationship_to_index("test_relationship_index", key, value, new_relationship)
296
+ new_index = @neo.get_relationship_index("test_relationship_index", key, value)
297
+ expect(new_index.first["self"]).to eq(new_relationship["self"])
298
+ @neo.remove_relationship_from_index("test_relationship_index", key, value, new_relationship)
299
+ end
300
+
301
+ it "can get a relationship index with empty spaces" do
302
+ new_node1 = @neo.create_node
303
+ new_node2 = @neo.create_node
304
+ new_relationship = @neo.create_relationship("friends", new_node1, new_node2)
305
+ key = generate_text(6)
306
+ value = generate_text + " " + generate_text
307
+ @neo.add_relationship_to_index("test_relationship_index", key, value, new_relationship)
308
+ new_index = @neo.get_relationship_index("test_relationship_index", key, value)
309
+ expect(new_index.first["self"]).to eq(new_relationship["self"])
310
+ @neo.remove_relationship_from_index("test_relationship_index", key, value, new_relationship)
311
+ end
312
+
313
+ it "can find a relationship index" do
314
+ new_node1 = @neo.create_node
315
+ new_node2 = @neo.create_node
316
+ new_relationship = @neo.create_relationship("friends", new_node1, new_node2)
317
+ key = generate_text(6)
318
+ value = generate_text
319
+ @neo.add_relationship_to_index("test_relationship_index", key, value, new_relationship)
320
+ new_index = @neo.find_relationship_index("test_relationship_index", key, value)
321
+ expect(new_index.first["self"]).to eq(new_relationship["self"])
322
+ @neo.remove_relationship_from_index("test_relationship_index", key, value, new_relationship)
323
+ end
324
+
325
+ it "can find a relationship index using generic query" do
326
+ new_node1 = @neo.create_node
327
+ new_node2 = @neo.create_node
328
+ new_relationship = @neo.create_relationship("friends", new_node1, new_node2)
329
+ key = generate_text(6)
330
+ value = generate_text
331
+ @neo.add_relationship_to_index("test_relationship_index", key, value, new_relationship)
332
+ new_index = @neo.find_relationship_index("test_relationship_index", "#{key}: #{value}")
333
+ expect(new_index.first["self"]).to eq(new_relationship["self"])
334
+ @neo.remove_relationship_from_index("test_relationship_index", key, value, new_relationship)
335
+ end
336
+
337
+ it "can find use the results of a node index" do
338
+ new_node1 = @neo.create_node
339
+ new_node2 = @neo.create_node
340
+ key = generate_text(6)
341
+ value1 = generate_text
342
+ value2 = generate_text
343
+ @neo.add_node_to_index("test_node_index", key, value1, new_node1)
344
+ @neo.add_node_to_index("test_node_index", key, value2, new_node2)
345
+ existing_node1 = @neo.get_node_index("test_node_index", key, value1)
346
+ existing_node2 = @neo.get_node_index("test_node_index", key, value2)
347
+ new_relationship = @neo.create_relationship("friends", existing_node1, existing_node2)
348
+ expect(new_relationship["start"]).not_to be_nil
349
+ expect(new_relationship["start"]).to eq(new_node1["self"])
350
+ expect(new_relationship["end"]).not_to be_nil
351
+ expect(new_relationship["end"]).to eq(new_node2["self"])
352
+ @neo.remove_node_from_index("test_node_index", new_node1)
353
+ @neo.remove_node_from_index("test_node_index", new_node2)
354
+ end
355
+
356
+ end
357
+
358
+ describe "auto indexes" do
359
+
360
+ it "can check the status of node auto index" do
361
+ expect(@neo.get_node_auto_index_status).to satisfy{|status| [true, false].include?(status)}
362
+ end
363
+
364
+ it "can check the status of relationship auto index" do
365
+ expect(@neo.get_relationship_auto_index_status).to satisfy{|status| [true, false].include?(status)}
366
+ end
367
+
368
+ it "can change the node auto index status" do
369
+ @neo.set_node_auto_index_status(true)
370
+ expect(@neo.get_node_auto_index_status).to be true
371
+ end
372
+
373
+ it "can change the relationship auto index status" do
374
+ @neo.set_relationship_auto_index_status(true)
375
+ expect(@neo.get_relationship_auto_index_status).to be true
376
+ end
377
+
378
+ it "can get a list of auto indexed node properties" do
379
+ @neo.set_node_auto_index_status(true)
380
+ @neo.create_node_auto_index
381
+ @neo.add_node_auto_index_property("name")
382
+ expect(@neo.get_node_auto_index_properties).to eq(["name"])
383
+ end
384
+
385
+ it "can get a list of auto indexed relationship properties" do
386
+ @neo.set_relationship_auto_index_status(true)
387
+ @neo.create_relationship_auto_index
388
+ @neo.add_relationship_auto_index_property("weight")
389
+ expect(@neo.get_relationship_auto_index_properties).to eq(["weight"])
390
+ end
391
+
392
+ it "can remove a property from the auto indexed node properties" do
393
+ @neo.add_node_auto_index_property("name")
394
+ @neo.add_node_auto_index_property("label")
395
+ expect(@neo.get_node_auto_index_properties).to eq(["name", "label"])
396
+ @neo.remove_node_auto_index_property("label")
397
+ expect(@neo.get_node_auto_index_properties).to eq(["name"])
398
+ end
399
+
400
+ it "can remove a property from the auto indexed relationship properties" do
401
+ @neo.add_relationship_auto_index_property("weight")
402
+ @neo.add_relationship_auto_index_property("strength")
403
+ expect(@neo.get_relationship_auto_index_properties).to match_array(["weight", "strength"])
404
+ @neo.remove_relationship_auto_index_property("strength")
405
+ expect(@neo.get_relationship_auto_index_properties).to eq(["weight"])
406
+ end
407
+
408
+ it "can get a node from an automatic index" do
409
+ new_node = @neo.create_node("name" => "Max")
410
+ existing_nodes = @neo.get_node_auto_index("name", "Max")
411
+ expect(existing_nodes.collect{|n| n["self"]}.include?(new_node["self"])).to be true
412
+ end
413
+
414
+ it "can query a node from an automatic index using key value" do
415
+ new_node = @neo.create_node("name" => "Max")
416
+ existing_nodes = @neo.find_node_auto_index("name", "Max")
417
+ expect(existing_nodes.collect{|n| n["self"]}.include?(new_node["self"])).to be true
418
+ end
419
+
420
+ it "can query a node from an automatic index" do
421
+ new_node = @neo.create_node("name" => "Max")
422
+ existing_nodes = @neo.find_node_auto_index("name:Max")
423
+ expect(existing_nodes.collect{|n| n["self"]}.include?(new_node["self"])).to be true
424
+ # check that more complex queries are correctly handled
425
+ existing_nodes = @neo.find_node_auto_index("name:Max OR name:Max")
426
+ expect(existing_nodes.collect{|n| n["self"]}.include?(new_node["self"])).to be true
427
+ end
428
+
429
+ it "can get a relationship from an automatic index" do
430
+ new_node1 = @neo.create_node("name" => "Max")
431
+ new_node2 = @neo.create_node("name" => "Peter")
432
+ new_relationship = @neo.create_relationship("friends", new_node1, new_node2, {"weight" => 5})
433
+ existing_rels = @neo.get_relationship_auto_index("weight", 5)
434
+ expect(existing_rels.collect{|n| n["self"]}.include?(new_relationship["self"])).to be true
435
+ end
436
+
437
+ it "can query a relationship from an automatic index using key value" do
438
+ new_node1 = @neo.create_node("name" => "Max")
439
+ new_node2 = @neo.create_node("name" => "Peter")
440
+ new_relationship = @neo.create_relationship("friends", new_node1, new_node2, {"weight" => 5})
441
+ existing_rels = @neo.find_relationship_auto_index("weight", 5)
442
+ expect(existing_rels.collect{|n| n["self"]}.include?(new_relationship["self"])).to be true
443
+ end
444
+
445
+ it "can query a relationship from an automatic index" do
446
+ new_node1 = @neo.create_node("name" => "Max")
447
+ new_node2 = @neo.create_node("name" => "Peter")
448
+ new_relationship = @neo.create_relationship("friends", new_node1, new_node2, {"weight" => 5})
449
+ existing_rels = @neo.find_relationship_auto_index("weight:5")
450
+ expect(existing_rels.collect{|n| n["self"]}.include?(new_relationship["self"])).to be true
451
+ end
452
+
453
+ end
454
+
455
+ describe "drop index" do
456
+ it "can drop a node index" do
457
+ new_node = @neo.create_node
458
+ key = generate_text(6)
459
+ value = generate_text
460
+ @neo.add_node_to_index("test_node_index", key, value, new_node)
461
+ new_index = @neo.get_node_index("test_node_index", key, value)
462
+ expect(new_index).not_to be_nil
463
+ @neo.drop_node_index("test_node_index")
464
+ expect { @neo.get_node_index("test_node_index", key, value) }.to raise_error Neography::NotFoundException
465
+ end
466
+
467
+ it "can get a relationship index" do
468
+ new_node1 = @neo.create_node
469
+ new_node2 = @neo.create_node
470
+ new_relationship = @neo.create_relationship("friends", new_node1, new_node2)
471
+ key = generate_text(6)
472
+ value = generate_text
473
+ @neo.add_relationship_to_index("test_relationship_index", key, value, new_relationship)
474
+ new_index = @neo.get_relationship_index("test_relationship_index", key, value)
475
+ expect(new_index).not_to be_nil
476
+ @neo.drop_relationship_index("test_relationship_index")
477
+ expect { @neo.get_relationship_index("test_relationship_index", key, value) }.to raise_error Neography::NotFoundException
478
+ end
479
+ end
480
+
481
+ end