neography 1.1.1 → 1.1.2
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/README.md +1 -1
- data/lib/neography/connection.rb +2 -2
- data/lib/neography/railtie.rb +1 -1
- data/lib/neography/rest/cypher.rb +1 -1
- data/lib/neography/rest/node_labels.rb +8 -8
- data/lib/neography/version.rb +1 -1
- data/spec/integration/node_encoding_spec.rb +71 -0
- data/spec/integration/rest_labels_spec.rb +24 -27
- data/spec/integration/rest_node_spec.rb +12 -0
- data/spec/integration/rest_plugin_spec.rb +50 -0
- data/spec/unit/rest/cypher_spec.rb +1 -1
- metadata +4 -2
data/README.md
CHANGED
@@ -13,7 +13,7 @@ Neography is a thin Ruby wrapper to the Neo4j Rest API, for more information:
|
|
13
13
|
* [Getting Started with Neo4j Server](http://neo4j.org/community/)
|
14
14
|
* [Neo4j Rest API Reference](http://docs.neo4j.org/chunked/milestone/rest-api.html)
|
15
15
|
|
16
|
-
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
|
16
|
+
If you want to utilize 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
|
17
17
|
|
18
18
|
|
19
19
|
## Installation
|
data/lib/neography/connection.rb
CHANGED
@@ -110,7 +110,7 @@ module Neography
|
|
110
110
|
code, body, parsed = handle_batch(response)
|
111
111
|
else
|
112
112
|
code = response.code
|
113
|
-
body = response.body
|
113
|
+
body = response.body.force_encoding("UTF-8")
|
114
114
|
parsed = false
|
115
115
|
end
|
116
116
|
return_result(code, body, parsed)
|
@@ -118,7 +118,7 @@ module Neography
|
|
118
118
|
|
119
119
|
def handle_batch(response)
|
120
120
|
code = 200
|
121
|
-
body = @parser.json(response.body)
|
121
|
+
body = @parser.json(response.body.force_encoding("UTF-8"))
|
122
122
|
body.each do |result|
|
123
123
|
if result["status"] >= 400
|
124
124
|
code = result["status"]
|
data/lib/neography/railtie.rb
CHANGED
@@ -7,7 +7,7 @@ module Neography
|
|
7
7
|
# See: http://api.rubyonrails.org/classes/Rails/Railtie.html
|
8
8
|
initializer 'neography.configure' do
|
9
9
|
# Provides a hook so people implementing the gem can do this in a railtie of their own:
|
10
|
-
# initializer "my_thing.neography_initialization", before: '
|
10
|
+
# initializer "my_thing.neography_initialization", before: 'neography.configure' do
|
11
11
|
# require 'my_thing/neography'
|
12
12
|
# end
|
13
13
|
end
|
@@ -13,7 +13,7 @@ module Neography
|
|
13
13
|
:query => query,
|
14
14
|
:params => parameters
|
15
15
|
}.to_json,
|
16
|
-
:headers => json_content_type.merge({'Accept' => 'application/json;stream=true'})
|
16
|
+
:headers => json_content_type.merge({'Accept' => 'application/json;stream=true;charset=UTF-8'})
|
17
17
|
}
|
18
18
|
|
19
19
|
@connection.post(optioned_path(cypher_options), options)
|
@@ -17,11 +17,11 @@ module Neography
|
|
17
17
|
def list
|
18
18
|
@connection.get(base_path)
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
def get(id)
|
22
|
-
@connection.get(node_path(:id => id))
|
22
|
+
@connection.get(node_path(:id => get_id(id)))
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
def get_nodes(label)
|
26
26
|
@connection.get(nodes_path(:label => label))
|
27
27
|
end
|
@@ -37,9 +37,9 @@ module Neography
|
|
37
37
|
).to_json,
|
38
38
|
:headers => json_content_type
|
39
39
|
}
|
40
|
-
@connection.post(node_path(:id => id), options)
|
40
|
+
@connection.post(node_path(:id => get_id(id)), options)
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
def set(id, label)
|
44
44
|
options = {
|
45
45
|
:body => (
|
@@ -47,11 +47,11 @@ module Neography
|
|
47
47
|
).to_json,
|
48
48
|
:headers => json_content_type
|
49
49
|
}
|
50
|
-
@connection.put(node_path(:id => id), options)
|
51
|
-
end
|
50
|
+
@connection.put(node_path(:id => get_id(id)), options)
|
51
|
+
end
|
52
52
|
|
53
53
|
def delete(id, label)
|
54
|
-
@connection.delete(delete_path(:id => id, :label => label))
|
54
|
+
@connection.delete(delete_path(:id => get_id(id), :label => label))
|
55
55
|
end
|
56
56
|
|
57
57
|
|
data/lib/neography/version.rb
CHANGED
@@ -0,0 +1,71 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Neography::Node do
|
5
|
+
|
6
|
+
describe "create and new" do
|
7
|
+
|
8
|
+
it "can create a node with UTF-8 encoded properties" do
|
9
|
+
new_node = Neography::Node.create("name" => "美都池水")
|
10
|
+
new_node.name.should == "美都池水"
|
11
|
+
end
|
12
|
+
|
13
|
+
it "can create a node with more than one UTF-8 encoded properties" do
|
14
|
+
new_node = Neography::Node.create("first_name" => "美都", "last_name" => "池水")
|
15
|
+
new_node.first_name.should == "美都"
|
16
|
+
new_node.last_name.should == "池水"
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "load" do
|
22
|
+
it "can get a node with UTF-8 encoded properties that exists" do
|
23
|
+
new_node = Neography::Node.create("first_name" => "美都", "last_name" => "池水")
|
24
|
+
existing_node = Neography::Node.load(new_node)
|
25
|
+
existing_node.should_not be_nil
|
26
|
+
existing_node.neo_id.should_not be_nil
|
27
|
+
existing_node.neo_id.should == new_node.neo_id
|
28
|
+
existing_node.first_name.should == "美都"
|
29
|
+
existing_node.last_name.should == "池水"
|
30
|
+
end
|
31
|
+
|
32
|
+
it "can get a node with UTF-8 encoded properties from an index" do
|
33
|
+
@neo = Neography::Rest.new
|
34
|
+
new_node = Neography::Node.create("first_name" => "美都", "last_name" => "池水")
|
35
|
+
key = generate_text(6)
|
36
|
+
value = generate_text
|
37
|
+
@neo.add_node_to_index("test_node_index", key, value, new_node)
|
38
|
+
node_from_index = @neo.get_node_index("test_node_index", key, value)
|
39
|
+
existing_node = Neography::Node.load(node_from_index)
|
40
|
+
existing_node.should_not be_nil
|
41
|
+
existing_node.neo_id.should_not be_nil
|
42
|
+
existing_node.neo_id.should == new_node.neo_id
|
43
|
+
existing_node.first_name.should == "美都"
|
44
|
+
existing_node.last_name.should == "池水"
|
45
|
+
end
|
46
|
+
|
47
|
+
it "can get a node with UTF-8 encoded properties that exists via cypher" do
|
48
|
+
new_node = Neography::Node.create("first_name" => "美都", "last_name" => "池水")
|
49
|
+
cypher = "START n = node({id}) return n"
|
50
|
+
@neo = Neography::Rest.new
|
51
|
+
results = @neo.execute_query(cypher, {:id => new_node.neo_id.to_i})
|
52
|
+
existing_node = Neography::Node.load(results)
|
53
|
+
existing_node.should_not be_nil
|
54
|
+
existing_node.neo_id.should_not be_nil
|
55
|
+
existing_node.neo_id.should == new_node.neo_id
|
56
|
+
existing_node.first_name.should == "美都"
|
57
|
+
existing_node.last_name.should == "池水"
|
58
|
+
end
|
59
|
+
|
60
|
+
it "can get columns of data from a node with UTF-8 encoded properties that exists via cypher" do
|
61
|
+
new_node = Neography::Node.create("first_name" => "美都", "last_name" => "池水")
|
62
|
+
cypher = "START me = node({id})
|
63
|
+
RETURN me.first_name, me.last_name"
|
64
|
+
@neo = Neography::Rest.new
|
65
|
+
results = @neo.execute_query(cypher, {:id => new_node.neo_id.to_i})
|
66
|
+
results['data'][0].should == ["美都","池水"]
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
@@ -16,9 +16,8 @@ describe Neography::Rest do
|
|
16
16
|
describe "add_label" do
|
17
17
|
it "can add a label to a node" do
|
18
18
|
new_node = @neo.create_node
|
19
|
-
|
20
|
-
@neo.
|
21
|
-
labels = @neo.get_node_labels(new_node_id)
|
19
|
+
@neo.add_label(new_node, "Person")
|
20
|
+
labels = @neo.get_node_labels(new_node)
|
22
21
|
labels.should == ["Person"]
|
23
22
|
end
|
24
23
|
|
@@ -39,7 +38,7 @@ describe Neography::Rest do
|
|
39
38
|
labels.should == ["Actor", "Director"]
|
40
39
|
end
|
41
40
|
end
|
42
|
-
|
41
|
+
|
43
42
|
describe "set_label" do
|
44
43
|
it "can set a label to a node" do
|
45
44
|
new_node = @neo.create_node
|
@@ -47,17 +46,16 @@ describe Neography::Rest do
|
|
47
46
|
@neo.set_label(new_node_id, "Person")
|
48
47
|
labels = @neo.get_node_labels(new_node_id)
|
49
48
|
labels.should == ["Person"]
|
50
|
-
end
|
49
|
+
end
|
51
50
|
|
52
51
|
it "can set a label to a node that already had a label" do
|
53
52
|
new_node = @neo.create_node
|
54
|
-
|
55
|
-
@neo.
|
56
|
-
@neo.
|
57
|
-
labels = @neo.get_node_labels(new_node_id)
|
53
|
+
@neo.add_label(new_node, "Actor")
|
54
|
+
@neo.set_label(new_node, "Director")
|
55
|
+
labels = @neo.get_node_labels(new_node)
|
58
56
|
labels.should == ["Director"]
|
59
|
-
end
|
60
|
-
|
57
|
+
end
|
58
|
+
|
61
59
|
it "can set multiple labels to a node" do
|
62
60
|
new_node = @neo.create_node
|
63
61
|
new_node_id = new_node["self"].split('/').last
|
@@ -70,12 +68,11 @@ describe Neography::Rest do
|
|
70
68
|
describe "delete_label" do
|
71
69
|
it "can delete a label from a node" do
|
72
70
|
new_node = @neo.create_node
|
73
|
-
|
74
|
-
@neo.
|
75
|
-
@neo.
|
76
|
-
labels = @neo.get_node_labels(new_node_id)
|
71
|
+
@neo.set_label(new_node, ["Actor", "Director"])
|
72
|
+
@neo.delete_label(new_node, "Actor")
|
73
|
+
labels = @neo.get_node_labels(new_node)
|
77
74
|
labels.should == ["Director"]
|
78
|
-
end
|
75
|
+
end
|
79
76
|
|
80
77
|
it "can delete a label from a node that doesn't have one" do
|
81
78
|
new_node = @neo.create_node
|
@@ -83,15 +80,15 @@ describe Neography::Rest do
|
|
83
80
|
@neo.delete_label(new_node_id, "Actor")
|
84
81
|
labels = @neo.get_node_labels(new_node_id)
|
85
82
|
labels.should == []
|
86
|
-
end
|
83
|
+
end
|
87
84
|
|
88
85
|
it "cannot delete a label from a node that doesn't exist" do
|
89
86
|
new_node = @neo.create_node
|
90
87
|
new_node_id = new_node["self"].split('/').last
|
91
|
-
expect {
|
88
|
+
expect {
|
92
89
|
@neo.delete_label(new_node_id.to_i + 1, "Actor")
|
93
90
|
}.to raise_error Neography::NodeNotFoundException
|
94
|
-
end
|
91
|
+
end
|
95
92
|
end
|
96
93
|
|
97
94
|
describe "get_nodes_labeled" do
|
@@ -101,14 +98,14 @@ describe Neography::Rest do
|
|
101
98
|
@neo.set_label(new_node_id, ["Actor", "Director"])
|
102
99
|
nodes = @neo.get_nodes_labeled("Actor")
|
103
100
|
nodes.last["self"].split('/').last.should == new_node_id
|
104
|
-
end
|
101
|
+
end
|
105
102
|
|
106
103
|
it "returns an empty array on non-existing label" do
|
107
104
|
nodes = @neo.get_nodes_labeled("do_not_exist")
|
108
105
|
nodes.should == []
|
109
|
-
end
|
106
|
+
end
|
110
107
|
end
|
111
|
-
|
108
|
+
|
112
109
|
describe "find_nodes_labeled" do
|
113
110
|
it "can find a node with a label and a property" do
|
114
111
|
new_node = @neo.create_node(:name => "max")
|
@@ -116,7 +113,7 @@ describe Neography::Rest do
|
|
116
113
|
@neo.set_label(new_node_id, "clown")
|
117
114
|
nodes = @neo.find_nodes_labeled("clown", { :name => "max" })
|
118
115
|
nodes.last["self"].split('/').last.should == new_node_id
|
119
|
-
end
|
116
|
+
end
|
120
117
|
|
121
118
|
it "returns an empty array on non-existing label property" do
|
122
119
|
new_node = @neo.create_node(:name => "max")
|
@@ -124,8 +121,8 @@ describe Neography::Rest do
|
|
124
121
|
@neo.set_label(new_node_id, "clown")
|
125
122
|
nodes = @neo.find_nodes_labeled("clown", { :name => "does_not_exist" })
|
126
123
|
nodes.should == []
|
127
|
-
end
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
128
127
|
|
129
|
-
|
130
|
-
|
131
|
-
end
|
128
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# Encoding: utf-8
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Neography::Rest do
|
@@ -71,6 +73,16 @@ describe Neography::Rest do
|
|
71
73
|
@neo.get_node(fake_node)
|
72
74
|
}.to raise_error Neography::NodeNotFoundException
|
73
75
|
end
|
76
|
+
|
77
|
+
it "can get a node with a tilde" do
|
78
|
+
new_node = @neo.create_node("name" => "Ateísmo Sureño")
|
79
|
+
new_node[:id] = new_node["self"].split('/').last
|
80
|
+
existing_node = @neo.get_node(new_node)
|
81
|
+
existing_node.should_not be_nil
|
82
|
+
existing_node.should have_key("self")
|
83
|
+
existing_node["self"].split('/').last.should == new_node[:id]
|
84
|
+
existing_node["data"]["name"].should == "Ateísmo Sureño"
|
85
|
+
end
|
74
86
|
end
|
75
87
|
|
76
88
|
describe "set_node_properties" do
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# Encoding: utf-8
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
describe Neography::Rest do
|
@@ -51,6 +53,54 @@ describe Neography::Rest do
|
|
51
53
|
existing_node["data"][0][0]["self"].split('/').last.should == id
|
52
54
|
end
|
53
55
|
|
56
|
+
it "can perform a range query" do
|
57
|
+
name = generate_text(6)
|
58
|
+
new_node = @neo.create_node({:number => 3})
|
59
|
+
id = new_node["self"].split('/').last
|
60
|
+
@neo.create_node_index(name, "fulltext","lucene")
|
61
|
+
@neo.add_node_to_index(name, "number", 3, new_node)
|
62
|
+
existing_node = @neo.find_node_index(name, "number:[1 TO 5]")
|
63
|
+
existing_node.first["self"].should == new_node["self"]
|
64
|
+
existing_node.first.should_not be_nil
|
65
|
+
existing_node.first["data"]["number"].should == 3
|
66
|
+
existing_node = @neo.execute_query("start n=node:#{name}(\"number:[1 TO 5]\") return n")
|
67
|
+
existing_node.should have_key("data")
|
68
|
+
existing_node.should have_key("columns")
|
69
|
+
existing_node["data"][0][0].should have_key("self")
|
70
|
+
existing_node["data"][0][0]["self"].split('/').last.should == id
|
71
|
+
end
|
72
|
+
|
73
|
+
it "can perform a range query with a term" do
|
74
|
+
name = generate_text(6)
|
75
|
+
new_node = @neo.create_node({:number => 3, :name => "Max"})
|
76
|
+
id = new_node["self"].split('/').last
|
77
|
+
@neo.create_node_index(name, "fulltext","lucene")
|
78
|
+
@neo.add_node_to_index(name, "number", 3, new_node)
|
79
|
+
@neo.add_node_to_index(name, "name", "max", new_node)
|
80
|
+
existing_node = @neo.find_node_index(name, "name:max AND number:[1 TO 5]")
|
81
|
+
existing_node.first["self"].should == new_node["self"]
|
82
|
+
existing_node.first.should_not be_nil
|
83
|
+
existing_node.first["data"]["number"].should == 3
|
84
|
+
existing_node.first["data"]["name"].should == "Max"
|
85
|
+
existing_node = @neo.execute_query("start n=node:#{name}(\"name:max AND number:[1 TO 5]\") return n")
|
86
|
+
existing_node.should have_key("data")
|
87
|
+
existing_node.should have_key("columns")
|
88
|
+
existing_node["data"][0][0].should have_key("self")
|
89
|
+
existing_node["data"][0][0]["self"].split('/').last.should == id
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
it "can get a node with a tilde" do
|
94
|
+
new_node = @neo.create_node("name" => "Ateísmo Sureño")
|
95
|
+
id = new_node["self"].split('/').last
|
96
|
+
existing_node = @neo.execute_query("start n=node(#{id}) return n")
|
97
|
+
existing_node.should_not be_nil
|
98
|
+
existing_node.should have_key("data")
|
99
|
+
existing_node.should have_key("columns")
|
100
|
+
existing_node["data"][0][0]["self"].split('/').last.should == id
|
101
|
+
existing_node["data"][0][0]["data"]["name"].should == "Ateísmo Sureño"
|
102
|
+
end
|
103
|
+
|
54
104
|
it "can get the a node with a variable" do
|
55
105
|
new_node = @neo.create_node
|
56
106
|
id = new_node["self"].split('/').last
|
@@ -10,7 +10,7 @@ module Neography
|
|
10
10
|
it "executes a cypher query" do
|
11
11
|
options = {
|
12
12
|
:body=>"{\"query\":\"SOME QUERY\",\"params\":{\"foo\":\"bar\",\"baz\":\"qux\"}}",
|
13
|
-
:headers=>{"Content-Type"=>"application/json", "Accept"=>"application/json;stream=true"}
|
13
|
+
:headers=>{"Content-Type"=>"application/json", "Accept"=>"application/json;stream=true;charset=UTF-8"}
|
14
14
|
}
|
15
15
|
connection.should_receive(:post).with("/cypher", options)
|
16
16
|
subject.query("SOME QUERY", { :foo => "bar", :baz => "qux" })
|
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: 1.1.
|
4
|
+
version: 1.1.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-08-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -244,6 +244,7 @@ files:
|
|
244
244
|
- spec/integration/authorization_spec.rb
|
245
245
|
- spec/integration/index_spec.rb
|
246
246
|
- spec/integration/neography_spec.rb
|
247
|
+
- spec/integration/node_encoding_spec.rb
|
247
248
|
- spec/integration/node_path_spec.rb
|
248
249
|
- spec/integration/node_relationship_spec.rb
|
249
250
|
- spec/integration/node_spec.rb
|
@@ -324,6 +325,7 @@ test_files:
|
|
324
325
|
- spec/integration/authorization_spec.rb
|
325
326
|
- spec/integration/index_spec.rb
|
326
327
|
- spec/integration/neography_spec.rb
|
328
|
+
- spec/integration/node_encoding_spec.rb
|
327
329
|
- spec/integration/node_path_spec.rb
|
328
330
|
- spec/integration/node_relationship_spec.rb
|
329
331
|
- spec/integration/node_spec.rb
|