neography 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +1 -1
- data/README.rdoc +9 -1
- data/examples/facebook.rb +40 -0
- data/examples/linkedin.rb +39 -0
- data/examples/traversal_example1.rb +65 -0
- data/lib/neography/rest.rb +6 -1
- data/lib/neography/version.rb +1 -1
- data/spec/integration/rest_relationship_spec.rb +21 -0
- metadata +5 -2
data/Gemfile.lock
CHANGED
data/README.rdoc
CHANGED
@@ -62,6 +62,7 @@ To Use:
|
|
62
62
|
@neo.remove_node_properties(node1, ["weight","age"]) # Remove multiple properties of a node
|
63
63
|
|
64
64
|
rel1 = @neo.create_relationship("friends", node1, node2) # Create a relationship between node1 and node2
|
65
|
+
rel2 = @neo.get_relationship(rel1) # Get a relationship
|
65
66
|
@neo.get_node_relationships(node1) # Get all relationships
|
66
67
|
@neo.get_node_relationships(node1, "in") # Get only incoming relationships
|
67
68
|
@neo.get_node_relationships(node1, "all", "enemies") # Get all relationships of type enemies
|
@@ -109,10 +110,17 @@ See Neo4j API for:
|
|
109
110
|
* {Prune Evaluator}[http://components.neo4j.org/neo4j-examples/1.2.M04/apidocs/org/neo4j/graphdb/StopEvaluator.html]
|
110
111
|
* {Return Filter}[http://components.neo4j.org/neo4j-examples/1.2.M04/apidocs/org/neo4j/graphdb/ReturnableEvaluator.html]
|
111
112
|
|
113
|
+
=== Examples
|
114
|
+
|
115
|
+
A couple of examples borrowed from Matthew Deiters's Neo4jr-social
|
116
|
+
|
117
|
+
* {Facebook}[https://github.com/maxdemarzi/neography/blob/master/examples/facebook.rb]
|
118
|
+
* {Linked In}[https://github.com/maxdemarzi/neography/blob/master/examples/linkedin.rb]
|
119
|
+
|
112
120
|
=== To Do
|
113
121
|
|
114
122
|
* More tests
|
115
|
-
* examples
|
123
|
+
* More examples
|
116
124
|
* batch import with typhoeus ?
|
117
125
|
* create proper objects for Node and Relationship
|
118
126
|
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'neography'
|
3
|
+
|
4
|
+
@neo = Neography::Rest.new
|
5
|
+
|
6
|
+
def create_person(name)
|
7
|
+
@neo.create_node("name" => name)
|
8
|
+
end
|
9
|
+
|
10
|
+
def make_mutual_friends(node1, node2)
|
11
|
+
@neo.create_relationship("friends", node1, node2)
|
12
|
+
@neo.create_relationship("friends", node2, node1)
|
13
|
+
end
|
14
|
+
|
15
|
+
def suggestions_for(node)
|
16
|
+
@neo.traverse(node,"nodes", {"order" => "breadth first",
|
17
|
+
"uniqueness" => "node global",
|
18
|
+
"relationships" => {"type"=> "friends", "direction" => "in"},
|
19
|
+
"return filter" => {
|
20
|
+
"language" => "javascript",
|
21
|
+
"body" => "position.length() == 2;"},
|
22
|
+
"depth" => 2})
|
23
|
+
end
|
24
|
+
|
25
|
+
johnathan = create_person('Johnathan')
|
26
|
+
mark = create_person('Mark')
|
27
|
+
phill = create_person('Phill')
|
28
|
+
mary = create_person('Mary')
|
29
|
+
luke = create_person('Luke')
|
30
|
+
|
31
|
+
make_mutual_friends(johnathan, mark)
|
32
|
+
make_mutual_friends(mark, mary)
|
33
|
+
make_mutual_friends(mark, phill)
|
34
|
+
make_mutual_friends(phill, mary)
|
35
|
+
make_mutual_friends(phill, luke)
|
36
|
+
|
37
|
+
puts "Johnathan should become friends with #{suggestions_for(johnathan).map{|n| n["data"]["name"]}.join(', ')}"
|
38
|
+
|
39
|
+
# RESULT
|
40
|
+
# Johnathan should become friends with Mary, Phill
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'neography'
|
3
|
+
|
4
|
+
@neo = Neography::Rest.new
|
5
|
+
|
6
|
+
def create_person(name)
|
7
|
+
@neo.create_node("name" => name)
|
8
|
+
end
|
9
|
+
|
10
|
+
def make_mutual_friends(node1, node2)
|
11
|
+
@neo.create_relationship("friends", node1, node2)
|
12
|
+
@neo.create_relationship("friends", node2, node1)
|
13
|
+
end
|
14
|
+
|
15
|
+
def degrees_of_separation(start_node, destination_node)
|
16
|
+
paths = @neo.get_paths(start_node, destination_node, {"type"=> "friends", "direction" => "in"}, depth=4, algorithm="allSimplePaths")
|
17
|
+
paths.each do |p|
|
18
|
+
p["names"] = p["nodes"].collect {|node| @neo.get_node_properties(node, "name")["name"] }
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
johnathan = create_person('Johnathan')
|
24
|
+
mark = create_person('Mark')
|
25
|
+
phill = create_person('Phill')
|
26
|
+
mary = create_person('Mary')
|
27
|
+
|
28
|
+
make_mutual_friends(johnathan, mark)
|
29
|
+
make_mutual_friends(mark, phill)
|
30
|
+
make_mutual_friends(phill, mary)
|
31
|
+
make_mutual_friends(mark, mary)
|
32
|
+
|
33
|
+
degrees_of_separation(johnathan, mary).each do |path|
|
34
|
+
puts path["names"].join(' => friends => ')
|
35
|
+
end
|
36
|
+
|
37
|
+
# RESULT
|
38
|
+
# Johnathan => friends => Mark => friends => Phill => friends => Mary
|
39
|
+
# Johnathan => friends => Mark => friends => Mary
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'neography'
|
3
|
+
|
4
|
+
@neo = Neography::Rest.new
|
5
|
+
|
6
|
+
def create_node(level, type)
|
7
|
+
@neo.create_node("NODE_LEVEL" => level, "TYPE" => type)
|
8
|
+
end
|
9
|
+
|
10
|
+
def create_other_node(type)
|
11
|
+
@neo.create_node("TYPE" => type)
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
def get_nodes_by_level(level, node)
|
16
|
+
starting_id = node["self"].split('/').last
|
17
|
+
|
18
|
+
@neo.traverse(node,"nodes", {"order" => "breadth first",
|
19
|
+
"uniqueness" => "node global",
|
20
|
+
"relationships" => {"type"=> "linked", "direction" => "out"},
|
21
|
+
"prune evaluator" => {
|
22
|
+
"language" => "javascript",
|
23
|
+
"body" => "position.startNode().hasProperty('NODE_LEVEL')
|
24
|
+
&& position.startNode().getProperty('NODE_LEVEL')==5
|
25
|
+
&& position.startNode().getId()!=#{starting_id};"},
|
26
|
+
"return filter" => {
|
27
|
+
"language" => "javascript",
|
28
|
+
"body" => "position.endNode().hasProperty('NODE_LEVEL') && position.endNode().getProperty('NODE_LEVEL')==5;"}})
|
29
|
+
end
|
30
|
+
|
31
|
+
node1 = create_node(5, "N")
|
32
|
+
node2 = create_node(5, "N")
|
33
|
+
node3 = create_node(5, "N")
|
34
|
+
node4 = create_node(5, "N")
|
35
|
+
node5 = create_node(5, "N")
|
36
|
+
node6 = create_node(5, "N")
|
37
|
+
node7 = create_node(5, "N")
|
38
|
+
|
39
|
+
node8 = create_other_node("Y")
|
40
|
+
node9 = create_other_node("Y")
|
41
|
+
node10 = create_other_node("Y")
|
42
|
+
|
43
|
+
node11 = create_node(6, "N")
|
44
|
+
node12 = create_node(7, "N")
|
45
|
+
node13 = create_node(8, "N")
|
46
|
+
|
47
|
+
|
48
|
+
@neo.create_relationship("linked", node1, node2)
|
49
|
+
@neo.create_relationship("linked", node2, node3)
|
50
|
+
@neo.create_relationship("linked", node3, node4)
|
51
|
+
@neo.create_relationship("linked", node4, node5)
|
52
|
+
@neo.create_relationship("linked", node5, node6)
|
53
|
+
@neo.create_relationship("linked", node6, node7)
|
54
|
+
|
55
|
+
@neo.create_relationship("linked", node2, node8)
|
56
|
+
@neo.create_relationship("linked", node3, node9)
|
57
|
+
@neo.create_relationship("linked", node4, node10)
|
58
|
+
|
59
|
+
@neo.create_relationship("linked", node5, node11)
|
60
|
+
@neo.create_relationship("linked", node6, node12)
|
61
|
+
@neo.create_relationship("linked", node7, node13)
|
62
|
+
|
63
|
+
puts "The node levels returned are #{get_nodes_by_level(5, node1).map{|n| n["data"]["NODE_LEVEL"]}.join(', ')}"
|
64
|
+
|
65
|
+
# The node levels returned are 5, 5, 5, 5, 5, 5, 5
|
data/lib/neography/rest.rb
CHANGED
@@ -3,7 +3,7 @@ module Neography
|
|
3
3
|
include HTTParty
|
4
4
|
attr_accessor :protocol, :server, :port, :log_file, :log_enabled, :logger
|
5
5
|
|
6
|
-
def initialize(protocol='http://', server='localhost', port=7474, log_file='neography.log', log_enabled=
|
6
|
+
def initialize(protocol='http://', server='localhost', port=7474, log_file='neography.log', log_enabled=false)
|
7
7
|
@protocol = protocol
|
8
8
|
@server = server
|
9
9
|
@port = port
|
@@ -84,6 +84,10 @@ module Neography
|
|
84
84
|
post("/node/#{get_id(from)}/relationships", options)
|
85
85
|
end
|
86
86
|
|
87
|
+
def get_relationship(id)
|
88
|
+
get("/relationship/#{get_id(id)}")
|
89
|
+
end
|
90
|
+
|
87
91
|
def reset_relationship_properties(id, properties)
|
88
92
|
options = { :body => properties.to_json, :headers => {'Content-Type' => 'application/json'} }
|
89
93
|
put("/relationship/#{get_id(id)}/properties", options)
|
@@ -298,6 +302,7 @@ module Neography
|
|
298
302
|
end
|
299
303
|
|
300
304
|
def get_depth(depth)
|
305
|
+
return nil if depth.nil?
|
301
306
|
return 1 if depth.to_i == 0
|
302
307
|
depth.to_i
|
303
308
|
end
|
data/lib/neography/version.rb
CHANGED
@@ -32,6 +32,27 @@ describe Neography::Rest do
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
+
describe "get_relationship" do
|
36
|
+
it "can get a relationship that exists" do
|
37
|
+
new_node1 = @neo.create_node
|
38
|
+
new_node2 = @neo.create_node
|
39
|
+
new_relationship = @neo.create_relationship("friends", new_node1, new_node2)
|
40
|
+
existing_relationship = @neo.get_relationship(new_relationship)
|
41
|
+
existing_relationship.should_not be_nil
|
42
|
+
existing_relationship.should have_key("self")
|
43
|
+
existing_relationship["self"].should == new_relationship["self"]
|
44
|
+
end
|
45
|
+
|
46
|
+
it "returns nil if it tries to get a relationship that does not exist" do
|
47
|
+
new_node1 = @neo.create_node
|
48
|
+
new_node2 = @neo.create_node
|
49
|
+
new_relationship = @neo.create_relationship("friends", new_node1, new_node2)
|
50
|
+
fake_relationship = new_relationship["self"].split('/').last.to_i + 1000
|
51
|
+
existing_relationship = @neo.get_relationship(fake_relationship)
|
52
|
+
existing_relationship.should be_nil
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
35
56
|
describe "set_relationship_properties" do
|
36
57
|
it "can set a relationship's properties" do
|
37
58
|
new_node1 = @neo.create_node
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 4
|
9
|
+
version: 0.0.4
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Max De Marzi
|
@@ -108,6 +108,9 @@ files:
|
|
108
108
|
- LICENSE
|
109
109
|
- README.rdoc
|
110
110
|
- Rakefile
|
111
|
+
- examples/facebook.rb
|
112
|
+
- examples/linkedin.rb
|
113
|
+
- examples/traversal_example1.rb
|
111
114
|
- lib/neography.rb
|
112
115
|
- lib/neography/rest.rb
|
113
116
|
- lib/neography/version.rb
|