neography 0.0.5 → 0.0.6

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.
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- neography (0.0.4)
4
+ neography (0.0.5)
5
5
  httparty (~> 0.6.1)
6
6
  json
7
7
 
@@ -157,10 +157,32 @@ The Neo4j ID is available by using node.neo_id .
157
157
  new_rel = Neography::Relationship.create(:family, n1, n2) # Create a relationship from my_node to node2
158
158
  new_rel.start_node # Get the start/from node of a relationship
159
159
  new_rel.end_node # Get the end/to node of a relationship
160
+ new_rel.other_node(n2) # Get the other node of a relationship
161
+
160
162
  existing_rel = Neography::Relationship.load(12) # Get an existing relationship by id
161
163
  existing_rel.del # Delete a relationship
162
164
 
163
165
  Neography::Relationship.create(:friends, n1, n2)
166
+ n1.outgoing(:friends) << n2 # Create outgoing relationship
167
+ n1.incoming(:friends) << n2 # Create incoming relationship
168
+ n1.both(:friends) << n2 # Create both relationships
169
+
170
+ n1.outgoing # Get nodes related by outgoing relationships
171
+ n1.incoming # Get nodes related by incoming relationships
172
+ n1.both # Get nodes related by any relationships
173
+
174
+ n1.outgoing(:friends) # Get nodes related by outgoing friends relationship
175
+ n1.incoming(:friends) # Get nodes related by incoming friends relationship
176
+ n1.both(:friends) # Get nodes related by friends relationship
177
+
178
+ n1.outgoing(:friends).incoming(:enemies) # Get nodes related by one of multiple relationships
179
+ n1.outgoing(:friends).depth(2) # Get nodes related by friends and friends of friends
180
+ n1.outgoing(:friends).depth(:all) # Get nodes related by friends until the end of the graph
181
+ n1.outgoing(:friends).depth(2).include_start_node # Get n1 and nodes related by friends and friends of friends
182
+
183
+ n1.outgoing(:friends).prune("position.endNode().getProperty('name') == 'Tom';")
184
+ n1.outgoing(:friends).filter("position.length() == 2;")
185
+
164
186
  n1.rel?(:friends) # Has a friends relationship
165
187
  n1.rel?(:outgoing, :friends) # Has outgoing friends relationship
166
188
  n1.rel?(:friends, :outgoing) # same, just the other way
@@ -169,6 +191,12 @@ The Neo4j ID is available by using node.neo_id .
169
191
  n1.rel?(:all) # same as above
170
192
  n1.rel? # same as above
171
193
 
194
+ n1.rels # Get node relationships
195
+ n1.rels(:friends) # Get friends relationships
196
+ n1.rels(:friends).outgoing # Get outgoing friends relationships
197
+ n1.rels(:friends).incoming # Get incoming friends relationships
198
+ n1.rels(:friends,:work) # Get friends and work relationships
199
+ n1.rels(:friends,:work).outgoing # Get outgoing friends and work relationships
172
200
 
173
201
  See Neo4j API for:
174
202
  * {Order}[http://components.neo4j.org/neo4j-examples/1.2.M04/apidocs/org/neo4j/graphdb/Traverser.Order.html]
@@ -185,12 +213,11 @@ A couple of examples borrowed from Matthew Deiters's Neo4jr-social
185
213
 
186
214
  === To Do
187
215
 
188
- * More tests
189
- * More examples
190
- * batch import with typhoeus ?
191
- * create proper objects for Node and Relationship
216
+ * More Tests
217
+ * More Examples
218
+ * Mixins ?
192
219
 
193
- === License
220
+ === Licenses
194
221
 
195
222
  * Neography - MIT, see the LICENSE file http://github.com/maxdemarzi/neography/tree/master/LICENSE.
196
223
  * Lucene - Apache, see http://lucene.apache.org/java/docs/features.html
@@ -17,7 +17,6 @@ end
17
17
 
18
18
  DIRECTIONS = ["incoming", "in", "outgoing", "out", "all", "both"]
19
19
 
20
-
21
20
  require 'httparty'
22
21
  require 'json'
23
22
  require 'logger'
@@ -2,27 +2,15 @@ module Neography
2
2
  module NodeRelationship
3
3
 
4
4
  def outgoing(types=nil)
5
- if types
6
- NodeTraverser.new(self).outgoing(types)
7
- else
8
- NodeTraverser.new(self).outgoing
9
- end
5
+ NodeTraverser.new(self).outgoing(types)
10
6
  end
11
7
 
12
8
  def incoming(types=nil)
13
- if types
14
- NodeTraverser.new(self).incoming(types)
15
- else
16
- NodeTraverser.new(self).incoming
17
- end
9
+ NodeTraverser.new(self).incoming(types)
18
10
  end
19
11
 
20
12
  def both(types=nil)
21
- if types
22
- NodeTraverser.new(self).both(types)
23
- else
24
- NodeTraverser.new(self) # default is both
25
- end
13
+ NodeTraverser.new(self).both(types)
26
14
  end
27
15
 
28
16
  def rels(*types)
@@ -30,7 +18,9 @@ module Neography
30
18
  end
31
19
 
32
20
  def rel(dir, type)
33
- Neography::RelationshipTraverser.new(self, type, dir).first
21
+ rel = Neography::RelationshipTraverser.new(self, type, dir)
22
+ rel = rel.first unless rel.nil?
23
+ rel
34
24
  end
35
25
 
36
26
  def rel?(dir=nil, type=nil)
@@ -2,19 +2,128 @@ module Neography
2
2
  class NodeTraverser
3
3
  include Enumerable
4
4
 
5
- attr_accessor :order, :uniqueness, :depth, :prune, :filter
5
+ attr_accessor :order, :uniqueness, :depth, :prune, :filter, :relationships
6
6
 
7
- def initialize(from, types = nil, dir=nil)
7
+ def initialize(from, types = nil, dir = "all" )
8
8
  @from = from
9
- @depth = 1
10
9
  @order = "depth first"
11
10
  @uniqueness = "none"
12
- if types.nil? || dir.nil?
13
- # @td = org.neo4j.kernel.impl.traversal.TraversalDescriptionImpl.new.breadth_first()
11
+ @relationships = Array.new
12
+ types.each do |type|
13
+ @relationships << {"type" => type.to_s, "direction" => dir.to_s }
14
+ end unless types.nil?
15
+ end
16
+
17
+ def <<(other_node)
18
+ create(other_node)
19
+ self
20
+ end
21
+
22
+ def create(other_node)
23
+ case @relationships.first["direction"]
24
+ when "outgoing", "out"
25
+ rel = Neography::Relationship.new(@from.neo_server.create_relationship(@relationships.first["type"], @from, other_node))
26
+ when "incoming", "in"
27
+ rel = Neography::Relationship.new(@from.neo_server.create_relationship(@relationships.first["type"], other_node, @from))
28
+ else
29
+ rel = Array.new
30
+ rel << Neography::Relationship.new(@from.neo_server.create_relationship(@relationships.first["type"], @from, other_node))
31
+ rel << Neography::Relationship.new(@from.neo_server.create_relationship(@relationships.first["type"], other_node, @from))
32
+ end
33
+ rel
34
+ end
35
+
36
+ def both(type)
37
+ @relationships << {"type" => type.to_s, "direction" => "all"}
38
+ self
39
+ end
40
+
41
+ def outgoing(type)
42
+ @relationships << {"type" => type.to_s, "direction" => "out"}
43
+ self
44
+ end
45
+
46
+ def incoming(type)
47
+ @relationships << {"type" => type.to_s, "direction" => "in"}
48
+ self
49
+ end
50
+
51
+ def filter(body)
52
+ @filter = Hash.new
53
+ @filter["language"] = "javascript"
54
+ @filter["body"] = body
55
+ self
56
+ end
57
+
58
+ def prune(body)
59
+ @prune = Hash.new
60
+ @prune["language"] = "javascript"
61
+ @prune["body"] = body
62
+ self
63
+ end
64
+
65
+ def depth(d)
66
+ d = 2147483647 if d == :all
67
+ @depth = d
68
+ self
69
+ end
70
+
71
+ def include_start_node
72
+ @filter = Hash.new
73
+ @filter["language"] = "builtin"
74
+ @filter["name"] = "all"
75
+ self
76
+ end
77
+
78
+ def size
79
+ [*self].size
80
+ end
81
+
82
+ alias_method :length, :size
83
+
84
+ def [](index)
85
+ each_with_index {|node,i| break node if index == i}
86
+ end
87
+
88
+ def empty?
89
+ first == nil
90
+ end
91
+
92
+ def each
93
+ iterator.each do |i|
94
+ node = Neography::Node.new(i)
95
+ node.neo_server = @from.neo_server
96
+ yield node
97
+ end
98
+ end
99
+
100
+ def iterator
101
+ options = Hash.new
102
+ options["order"] = @order
103
+ options["uniqueness"] = @uniqueness
104
+ options["relationships"] = @relationships
105
+ options["prune evaluator"] = @prune unless @prune.nil?
106
+ options["return filter"] = @filter unless @filter.nil?
107
+ options["depth"] = @depth unless @depth.nil?
108
+
109
+ if @relationships[0]["type"].blank?
110
+ rels = @from.neo_server.get_node_relationships(@from, @relationships[0]["direction"])
111
+ case @relationships[0]["direction"]
112
+ when "in"
113
+ rels.collect { |r| @from.neo_server.get_node(r["start"]) } #.uniq
114
+ when "out"
115
+ rels.collect { |r| @from.neo_server.get_node(r["end"]) } #.uniq
116
+ else
117
+ rels.collect { |r|
118
+ if @from.neo_id == r["start"].split('/').last
119
+ @from.neo_server.get_node(r["end"])
120
+ else
121
+ @from.neo_server.get_node(r["start"])
122
+ end
123
+ } #.uniq
124
+ end
14
125
  else
15
- # @types = type_to_java(type)
16
- # @dir = dir_to_java(dir)
17
- # @td = org.neo4j.kernel.impl.traversal.TraversalDescriptionImpl.new.breadth_first().relationships(@type, @dir)
126
+ @from.neo_server.traverse(@from, "nodes", options)
18
127
  end
19
128
  end
20
129
 
@@ -42,8 +42,12 @@ module Neography
42
42
  self.start_node.neo_server.delete_relationship(self.neo_id)
43
43
  end
44
44
 
45
+ def exist?
46
+ !self.start_node.neo_server.get_relationship(self.neo_id).nil?
47
+ end
48
+
45
49
  def other_node(node)
46
- if node = @start_node
50
+ if node == @start_node
47
51
  @end_node
48
52
  else
49
53
  @start_node
@@ -19,15 +19,38 @@ module Neography
19
19
  end
20
20
 
21
21
  def each
22
- iterator.each { |i| yield Neography::Relationship.new(i, @node.neo_server) }
22
+ iterator.each do |i|
23
+ rel = Neography::Relationship.new(i, @node.neo_server)
24
+ rel.start_node = Neography::Node.load(rel.start_node)
25
+ rel.end_node = Neography::Node.load(rel.end_node)
26
+
27
+ yield rel if match_to_other?(rel)
28
+ end
23
29
  end
24
30
 
25
31
  def empty?
26
32
  first == nil
27
33
  end
28
-
34
+
29
35
  def iterator
30
- @node.neo_server.get_node_relationships(@node, @direction, @types)
36
+ Array(@node.neo_server.get_node_relationships(@node, @direction, @types))
37
+ end
38
+
39
+ def match_to_other?(rel)
40
+ if @to_other.nil?
41
+ true
42
+ elsif @direction == :outgoing
43
+ rel.end_node == @to_other
44
+ elsif @direction == :incoming
45
+ rel.start_node == @to_other
46
+ else
47
+ rel.start_node == @to_other || rel.end_node == @to_other
48
+ end
49
+ end
50
+
51
+ def to_other(to_other)
52
+ @to_other = to_other
53
+ self
31
54
  end
32
55
 
33
56
  def del
@@ -44,13 +67,11 @@ module Neography
44
67
  end
45
68
 
46
69
  def incoming
47
- raise "Not allowed calling incoming when finding several relationships types" if @types
48
70
  @direction = :incoming
49
71
  self
50
72
  end
51
73
 
52
74
  def outgoing
53
- raise "Not allowed calling outgoing when finding several relationships types" if @types
54
75
  @direction = :outgoing
55
76
  self
56
77
  end
@@ -1,3 +1,3 @@
1
1
  module Neography
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
@@ -0,0 +1,374 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ describe Neography::NodeRelationship do
4
+
5
+ def create_nodes
6
+ #
7
+ # f
8
+ # ^
9
+ # friends
10
+ # |
11
+ # a --friends-> b --friends--> c
12
+ # | ^
13
+ # | |
14
+ # +--- work -----+
15
+ # |
16
+ # +--- work ---> d --- work --> e
17
+ a = Neography::Node.create :name => 'a'
18
+ b = Neography::Node.create :name => 'b'
19
+ c = Neography::Node.create :name => 'c'
20
+ d = Neography::Node.create :name => 'd'
21
+ e = Neography::Node.create :name => 'e'
22
+ f = Neography::Node.create :name => 'f'
23
+ a.outgoing(:friends) << b
24
+ b.outgoing(:friends) << c
25
+ b.outgoing(:work) << c
26
+ b.outgoing(:work) << d
27
+ d.outgoing(:work) << e
28
+ b.outgoing(:friends) << f
29
+ [a,b,c,d,e,f]
30
+ end
31
+
32
+ describe "outgoing" do
33
+ it "#outgoing(:friends) << other_node creates an outgoing relationship of type :friends" do
34
+ a = Neography::Node.create
35
+ other_node = Neography::Node.create
36
+
37
+ # when
38
+ a.outgoing(:friends) << other_node
39
+
40
+ # then
41
+ a.outgoing(:friends).first.should == other_node
42
+ end
43
+
44
+ it "#outgoing(:friends) << b << c creates an outgoing relationship of type :friends" do
45
+ a = Neography::Node.create
46
+ b = Neography::Node.create
47
+ c = Neography::Node.create
48
+
49
+ # when
50
+ a.outgoing(:friends) << b << c
51
+
52
+ # then
53
+ a.outgoing(:friends).should include(b,c)
54
+ end
55
+
56
+ it "#outgoing returns all incoming nodes of any type" do
57
+ a,b,c,d,e,f = create_nodes
58
+
59
+ b.outgoing.should include(c,f,d)
60
+ [*b.outgoing].size.should == 4 #c is related by both work and friends
61
+ end
62
+
63
+ it "#outgoing(type) should only return outgoing nodes of the given type of depth one" do
64
+ a,b,c,d = create_nodes
65
+ b.outgoing(:work).should include(c,d)
66
+ [*b.outgoing(:work)].size.should == 2
67
+ end
68
+
69
+ it "#outgoing(type1).outgoing(type2) should return outgoing nodes of the given types" do
70
+ a,b,c,d,e,f = create_nodes
71
+ nodes = b.outgoing(:work).outgoing(:friends)
72
+
73
+ nodes.should include(c,d,f)
74
+ nodes.size.should == 4 #c is related by both work and friends
75
+ end
76
+
77
+ it "#outgoing(type).depth(4) should only return outgoing nodes of the given type and depth" do
78
+ a,b,c,d,e = create_nodes
79
+ [*b.outgoing(:work).depth(4)].size.should == 3
80
+ b.outgoing(:work).depth(4).should include(c,d,e)
81
+ end
82
+
83
+ it "#outgoing(type).depth(4).include_start_node should also include the start node" do
84
+ a,b,c,d,e = create_nodes
85
+ [*b.outgoing(:work).depth(4).include_start_node].size.should == 4
86
+ b.outgoing(:work).depth(4).include_start_node.should include(b,c,d,e)
87
+ end
88
+
89
+ it "#outgoing(type).depth(:all) should traverse at any depth" do
90
+ a,b,c,d,e = create_nodes
91
+ [*b.outgoing(:work).depth(:all)].size.should == 3
92
+ b.outgoing(:work).depth(:all).should include(c,d,e)
93
+ end
94
+ end
95
+
96
+ describe "incoming" do
97
+ it "#incoming(:friends) << other_node should add an incoming relationship" do
98
+ a = Neography::Node.create
99
+ other_node = Neography::Node.create
100
+
101
+ # when
102
+ a.incoming(:friends) << other_node
103
+
104
+ # then
105
+ a.incoming(:friends).first.should == other_node
106
+ end
107
+
108
+ it "#incoming(:friends) << b << c creates an incoming relationship of type :friends" do
109
+ a = Neography::Node.create
110
+ b = Neography::Node.create
111
+ c = Neography::Node.create
112
+
113
+ # when
114
+ a.incoming(:friends) << b << c
115
+
116
+ # then
117
+ a.incoming(:friends).should include(b,c)
118
+ end
119
+
120
+ it "#incoming returns all incoming nodes of any type" do
121
+ a,b,c,d,e,f = create_nodes
122
+
123
+ b.incoming.should include(a)
124
+ [*b.incoming].size.should == 1
125
+ end
126
+
127
+ it "#incoming(type).depth(2) should only return outgoing nodes of the given type and depth" do
128
+ a,b,c,d,e = create_nodes
129
+ [*e.incoming(:work).depth(2)].size.should == 2
130
+ e.incoming(:work).depth(2).should include(b,d)
131
+ end
132
+
133
+ it "#incoming(type) should only return incoming nodes of the given type of depth one" do
134
+ a,b,c,d = create_nodes
135
+ c.incoming(:work).should include(b)
136
+ [*c.incoming(:work)].size.should == 1
137
+ end
138
+ end
139
+
140
+ describe "both" do
141
+ it "#both(:friends) << other_node should raise an exception" do
142
+ a = Neography::Node.create
143
+ other_node = Neography::Node.create
144
+
145
+ # when
146
+ a.both(:friends) << other_node
147
+ a.incoming(:friends).first.should == other_node
148
+ a.outgoing(:friends).first.should == other_node
149
+ end
150
+
151
+ it "#both returns all incoming and outgoing nodes of any type" do
152
+ a,b,c,d,e,f = create_nodes
153
+
154
+ b.both.should include(a,c,d,f)
155
+ [*b.both].size.should == 5 #c is related by both work and friends
156
+ b.incoming.should include(a)
157
+ b.outgoing.should include(c)
158
+ end
159
+
160
+ it "#both(type) should return both incoming and outgoing nodes of the given type of depth one" do
161
+ a,b,c,d,e,f = create_nodes
162
+
163
+ b.both(:friends).should include(a,c,f)
164
+ [*b.both(:friends)].size.should == 3
165
+ end
166
+
167
+ it "#outgoing and #incoming can be combined to traverse several relationship types" do
168
+ a,b,c,d,e = create_nodes
169
+ nodes = [*b.incoming(:friends).outgoing(:work)]
170
+
171
+ nodes.should include(a,c,d)
172
+ nodes.should_not include(b,e)
173
+ end
174
+ end
175
+
176
+
177
+ describe "prune" do
178
+ it "#prune, if it returns true the traversal will be stop for that path" do
179
+ a, b, c, d, e = create_nodes
180
+ [*b.outgoing(:work).depth(4)].size.should == 3
181
+ b.outgoing(:work).depth(4).should include(c,d,e)
182
+
183
+ [*b.outgoing(:work).prune("position.endNode().getProperty('name') == 'd';")].size.should == 2
184
+ b.outgoing(:work).prune("position.endNode().getProperty('name') == 'd';").should include(c,d)
185
+ end
186
+ end
187
+
188
+ describe "filter" do
189
+ it "#filter, if it returns true the node will be included in the return results" do
190
+ a, b, c, d, e = create_nodes
191
+ [*b.outgoing(:work).depth(4)].size.should == 3
192
+ b.outgoing(:work).depth(4).should include(c,d,e)
193
+
194
+ [*b.outgoing(:work).depth(4).filter("position.length() == 2;")].size.should == 1
195
+ b.outgoing(:work).depth(4).filter("position.length() == 2;").should include(e)
196
+ end
197
+ end
198
+
199
+ describe "rels" do
200
+ it "#rels returns a RelationshipTraverser which can filter which relationship it should return by specifying #to_other" do
201
+ a = Neography::Node.create
202
+ b = Neography::Node.create
203
+ c = Neography::Node.create
204
+ r1 = Neography::Relationship.create(:friend, a, b)
205
+ Neography::Relationship.create(:friend, a, c)
206
+
207
+ a.rels.to_other(b).size.should == 1
208
+ a.rels.to_other(b).should include(r1)
209
+ end
210
+
211
+ it "#rels returns an RelationshipTraverser which provides a method for deleting all the relationships" do
212
+ a = Neography::Node.create
213
+ b = Neography::Node.create
214
+ c = Neography::Node.create
215
+ r1 = Neography::Relationship.create(:friend, a, b)
216
+ r2 = Neography::Relationship.create(:friend, a, c)
217
+
218
+ a.rel?(:friend).should be_true
219
+ a.rels.del
220
+ a.rel?(:friend).should be_false
221
+ r1.exist?.should be_false
222
+ r2.exist?.should be_false
223
+ end
224
+
225
+ it "#rels returns an RelationshipTraverser with methods #del and #to_other which can be combined to only delete a subset of the relationships" do
226
+ a = Neography::Node.create
227
+ b = Neography::Node.create
228
+ c = Neography::Node.create
229
+ r1 = Neography::Relationship.create(:friend, a, b)
230
+ r2 = Neography::Relationship.create(:friend, a, c)
231
+ r1.exist?.should be_true
232
+ r2.exist?.should be_true
233
+ a.rels.to_other(c).del
234
+ r1.exist?.should be_true
235
+ r2.exist?.should be_false
236
+ end
237
+
238
+ it "#rels should return both incoming and outgoing relationship of any type of depth one" do
239
+ a,b,c,d,e,f = create_nodes
240
+ b.rels.size.should == 5
241
+ nodes = b.rels.collect{|r| r.other_node(b)}
242
+ nodes.should include(a,c,d,f)
243
+ nodes.should_not include(e)
244
+ end
245
+
246
+ it "#rels(:friends) should return both incoming and outgoing relationships of given type of depth one" do
247
+ # given
248
+ a,b,c,d,e,f = create_nodes
249
+
250
+ # when
251
+ rels = [*b.rels(:friends)]
252
+
253
+ # then
254
+ rels.size.should == 3
255
+ nodes = rels.collect{|r| r.end_node}
256
+ nodes.should include(b,c,f)
257
+ nodes.should_not include(a,d,e)
258
+ end
259
+
260
+ it "#rels(:friends).outgoing should return only outgoing relationships of given type of depth one" do
261
+ # given
262
+ a,b,c,d,e,f = create_nodes
263
+
264
+ # when
265
+ rels = [*b.rels(:friends).outgoing]
266
+
267
+ # then
268
+ rels.size.should == 2
269
+ nodes = rels.collect{|r| r.end_node}
270
+ nodes.should include(c,f)
271
+ nodes.should_not include(a,b,d,e)
272
+ end
273
+
274
+
275
+ it "#rels(:friends).incoming should return only outgoing relationships of given type of depth one" do
276
+ # given
277
+ a,b,c,d,e = create_nodes
278
+
279
+ # when
280
+ rels = [*b.rels(:friends).incoming]
281
+
282
+ # then
283
+ rels.size.should == 1
284
+ nodes = rels.collect{|r| r.start_node}
285
+ nodes.should include(a)
286
+ nodes.should_not include(b,c,d,e)
287
+ end
288
+
289
+ it "#rels(:friends,:work) should return both incoming and outgoing relationships of given types of depth one" do
290
+ # given
291
+ a,b,c,d,e,f = create_nodes
292
+
293
+ # when
294
+ rels = [*b.rels(:friends,:work)]
295
+
296
+ # then
297
+ rels.size.should == 5
298
+ nodes = rels.collect{|r| r.other_node(b)}
299
+ nodes.should include(a,c,d,f)
300
+ nodes.should_not include(b,e)
301
+ end
302
+
303
+ it "#rels(:friends,:work).outgoing should return outgoing relationships of given types of depth one" do
304
+ # given
305
+ a,b,c,d,e,f = create_nodes
306
+
307
+ # when
308
+ rels = [*b.rels(:friends,:work).outgoing]
309
+
310
+ # then
311
+ rels.size.should == 4
312
+ nodes = rels.collect{|r| r.other_node(b)}
313
+ nodes.should include(c,d,f)
314
+ nodes.should_not include(a,b,e)
315
+ end
316
+ end
317
+
318
+ describe "rel" do
319
+ it "#rel returns a single relationship if there is only one relationship" do
320
+ a = Neography::Node.create
321
+ b = Neography::Node.create
322
+ rel = Neography::Relationship.create(:friend, a, b)
323
+ a.rel(:outgoing, :friend).should == rel
324
+ end
325
+
326
+ it "#rel returns nil if there is no relationship" do
327
+ a = Neography::Node.create
328
+ b = Neography::Node.create
329
+ a.rel(:outgoing, :friend).should be_nil
330
+ end
331
+
332
+ it "#rel should only return one relationship even if there are more" do
333
+ a = Neography::Node.create
334
+ b = Neography::Node.create
335
+ c = Neography::Node.create
336
+ Neography::Relationship.create(:friend, a, b)
337
+ Neography::Relationship.create(:friend, a, c)
338
+ [*a.rel(:outgoing, :friend)].size == 1
339
+ end
340
+ end
341
+
342
+ describe "rel?" do
343
+ it "#rel? returns true if there are any relationships" do
344
+ n1 = Neography::Node.create
345
+ n1.rel?.should be_false
346
+ n1.outgoing(:foo) << Neography::Node.create
347
+
348
+ n1.rel?.should be_true
349
+ n1.rel?(:bar).should be_false
350
+ n1.rel?(:foo).should be_true
351
+ n1.rel?(:incoming, :foo).should be_false
352
+ n1.rel?(:outgoing, :foo).should be_true
353
+ n1.rel?(:foo, :incoming).should be_false
354
+ n1.rel?(:foo, :outgoing).should be_true
355
+ n1.rel?(:incoming).should be_false
356
+ n1.rel?(:outgoing).should be_true
357
+ n1.rel?(:both).should be_true
358
+ n1.rel?(:all).should be_true
359
+ n1.rel?.should be_true
360
+ end
361
+ end
362
+
363
+
364
+ describe "delete relationship" do
365
+ it "can delete an existing relationship" do
366
+ p1 = Neography::Node.create
367
+ p2 = Neography::Node.create
368
+ new_rel = Neography::Relationship.create(:family, p1, p2)
369
+ new_rel.del
370
+ Neography::Relationship.load(new_rel).should be_nil
371
+ end
372
+ end
373
+
374
+ end
@@ -6,21 +6,16 @@ describe Neography::Relationship do
6
6
  p1 = Neography::Node.create
7
7
  p2 = Neography::Node.create
8
8
 
9
- new_rel = Neography::Relationship.create(:family, p1, p2)
10
- puts new_rel.inspect
11
- new_rel.start_node.should == p1
12
- new_rel.end_node.should == p2
13
-
14
-
15
- # p1.outgoing(:family).should include(p2)
16
- # p2.incoming(:family).should include(p1)
9
+ Neography::Relationship.create(:family, p1, p2)
10
+ p1.outgoing(:family).should include(p2)
11
+ p2.incoming(:family).should include(p1)
17
12
  end
18
13
 
19
14
  it "#new(:family, p1, p2, :since => '1998', :colour => 'blue') creates relationship and sets its properties" do
20
15
  p1 = Neography::Node.create
21
16
  p2 = Neography::Node.create
22
-
23
17
  rel = Neography::Relationship.create(:family, p1, p2, :since => 1998, :colour => 'blue')
18
+
24
19
  rel[:since].should == 1998
25
20
  rel[:colour].should == 'blue'
26
21
  rel.since.should == 1998
@@ -30,42 +25,13 @@ describe Neography::Relationship do
30
25
  it "#outgoing(:friends).create(other) creates a new relationship between self and other node" do
31
26
  p1 = Neography::Node.create
32
27
  p2 = Neography::Node.create
33
-
34
28
  rel = p1.outgoing(:foo).create(p2)
35
- p1.outgoing(:foo).first.should == p2
36
- rel.should be_kind_of(Neography::Relationship)
37
- end
38
- end
39
29
 
40
- describe "rel?" do
41
- it "#rel? returns true if there are any relationships" do
42
- n1 = Neography::Node.create
43
- n2 = Neography::Node.create
44
- new_rel = Neography::Relationship.create(:foo, n1, n2)
45
- n1.rel?.should be_true
46
- n1.rel?(:bar).should be_false
47
- n1.rel?(:foo).should be_true
48
- n1.rel?(:incoming, :foo).should be_false
49
- n1.rel?(:outgoing, :foo).should be_true
50
- n1.rel?(:foo, :incoming).should be_false
51
- n1.rel?(:foo, :outgoing).should be_true
52
-
53
- n1.rel?(:incoming).should be_false
54
- n1.rel?(:outgoing).should be_true
55
- n1.rel?(:both).should be_true
56
- n1.rel?(:all).should be_true
57
- n1.rel?.should be_true
30
+ rel.should be_kind_of(Neography::Relationship)
31
+ p1.outgoing(:foo).first.should == p2
32
+ p1.outgoing(:foo).should include(p2)
33
+ p2.incoming(:foo).should include(p1)
58
34
  end
59
35
  end
60
36
 
61
-
62
- describe "delete relationship" do
63
- it "can delete an existing relationship" do
64
- p1 = Neography::Node.create
65
- p2 = Neography::Node.create
66
- new_rel = Neography::Relationship.create(:family, p1, p2)
67
- new_rel.del
68
- Neography::Relationship.load(new_rel).should be_nil
69
- end
70
- end
71
37
  end
metadata CHANGED
@@ -3,95 +3,95 @@ name: neography
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
- - 0
7
- - 0
8
- - 5
9
- version: 0.0.5
6
+ - 0
7
+ - 0
8
+ - 6
9
+ version: 0.0.6
10
10
  platform: ruby
11
11
  authors:
12
- - Max De Marzi
12
+ - Max De Marzi
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-12-08 00:00:00 -08:00
17
+ date: 2010-12-10 00:00:00 -08:00
18
18
  default_executable:
19
19
  dependencies:
20
- - !ruby/object:Gem::Dependency
21
- name: rspec
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- none: false
25
- requirements:
26
- - - ~>
27
- - !ruby/object:Gem::Version
28
- segments:
29
- - 2
30
- - 0
31
- - 0
32
- - beta
33
- - 22
34
- version: 2.0.0.beta.22
35
- type: :development
36
- version_requirements: *id001
37
- - !ruby/object:Gem::Dependency
38
- name: net-http-spy
39
- prerelease: false
40
- requirement: &id002 !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ~>
44
- - !ruby/object:Gem::Version
45
- segments:
46
- - 0
47
- - 2
48
- - 1
49
- version: 0.2.1
50
- type: :development
51
- version_requirements: *id002
52
- - !ruby/object:Gem::Dependency
53
- name: fakeweb
54
- prerelease: false
55
- requirement: &id003 !ruby/object:Gem::Requirement
56
- none: false
57
- requirements:
58
- - - ~>
59
- - !ruby/object:Gem::Version
60
- segments:
61
- - 1
62
- - 3
63
- - 0
64
- version: 1.3.0
65
- type: :development
66
- version_requirements: *id003
67
- - !ruby/object:Gem::Dependency
68
- name: httparty
69
- prerelease: false
70
- requirement: &id004 !ruby/object:Gem::Requirement
71
- none: false
72
- requirements:
73
- - - ~>
74
- - !ruby/object:Gem::Version
75
- segments:
76
- - 0
77
- - 6
78
- - 1
79
- version: 0.6.1
80
- type: :runtime
81
- version_requirements: *id004
82
- - !ruby/object:Gem::Dependency
83
- name: json
84
- prerelease: false
85
- requirement: &id005 !ruby/object:Gem::Requirement
86
- none: false
87
- requirements:
88
- - - ">="
89
- - !ruby/object:Gem::Version
90
- segments:
91
- - 0
92
- version: "0"
93
- type: :runtime
94
- version_requirements: *id005
20
+ - !ruby/object:Gem::Dependency
21
+ name: rspec
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 2
30
+ - 0
31
+ - 0
32
+ - beta
33
+ - 22
34
+ version: 2.0.0.beta.22
35
+ type: :development
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: net-http-spy
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ segments:
46
+ - 0
47
+ - 2
48
+ - 1
49
+ version: 0.2.1
50
+ type: :development
51
+ version_requirements: *id002
52
+ - !ruby/object:Gem::Dependency
53
+ name: fakeweb
54
+ prerelease: false
55
+ requirement: &id003 !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ~>
59
+ - !ruby/object:Gem::Version
60
+ segments:
61
+ - 1
62
+ - 3
63
+ - 0
64
+ version: 1.3.0
65
+ type: :development
66
+ version_requirements: *id003
67
+ - !ruby/object:Gem::Dependency
68
+ name: httparty
69
+ prerelease: false
70
+ requirement: &id004 !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ segments:
76
+ - 0
77
+ - 6
78
+ - 1
79
+ version: 0.6.1
80
+ type: :runtime
81
+ version_requirements: *id004
82
+ - !ruby/object:Gem::Dependency
83
+ name: json
84
+ prerelease: false
85
+ requirement: &id005 !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ segments:
91
+ - 0
92
+ version: "0"
93
+ type: :runtime
94
+ version_requirements: *id005
95
95
  description: A Ruby wrapper to the Neo4j Rest API see http://components.neo4j.org/neo4j-rest/ for more details.
96
96
  email: maxdemarzi@gmail.com
97
97
  executables: []
@@ -101,42 +101,43 @@ extensions: []
101
101
  extra_rdoc_files: []
102
102
 
103
103
  files:
104
- - .gitignore
105
- - CONTRIBUTORS
106
- - Gemfile
107
- - Gemfile.lock
108
- - LICENSE
109
- - README.rdoc
110
- - Rakefile
111
- - examples/facebook.rb
112
- - examples/linkedin.rb
113
- - examples/traversal_example1.rb
114
- - lib/neography.rb
115
- - lib/neography/config.rb
116
- - lib/neography/equal.rb
117
- - lib/neography/neography.rb
118
- - lib/neography/node.rb
119
- - lib/neography/node_relationship.rb
120
- - lib/neography/node_traverser.rb
121
- - lib/neography/property.rb
122
- - lib/neography/property_container.rb
123
- - lib/neography/relationship.rb
124
- - lib/neography/relationship_traverser.rb
125
- - lib/neography/rest.rb
126
- - lib/neography/version.rb
127
- - neography.gemspec
128
- - spec/integration/neography_spec.rb
129
- - spec/integration/node_spec.rb
130
- - spec/integration/relationship_spec.rb
131
- - spec/integration/rest_bulk_spec.rb
132
- - spec/integration/rest_experimental_spec.rb
133
- - spec/integration/rest_index_spec.rb
134
- - spec/integration/rest_node_spec.rb
135
- - spec/integration/rest_path_spec.rb
136
- - spec/integration/rest_relationship_spec.rb
137
- - spec/integration/rest_traverse_spec.rb
138
- - spec/spec_helper.rb
139
- - spec/support/fake_root_spec.rb
104
+ - .gitignore
105
+ - CONTRIBUTORS
106
+ - Gemfile
107
+ - Gemfile.lock
108
+ - LICENSE
109
+ - README.rdoc
110
+ - Rakefile
111
+ - examples/facebook.rb
112
+ - examples/linkedin.rb
113
+ - examples/traversal_example1.rb
114
+ - lib/neography.rb
115
+ - lib/neography/config.rb
116
+ - lib/neography/equal.rb
117
+ - lib/neography/neography.rb
118
+ - lib/neography/node.rb
119
+ - lib/neography/node_relationship.rb
120
+ - lib/neography/node_traverser.rb
121
+ - lib/neography/property.rb
122
+ - lib/neography/property_container.rb
123
+ - lib/neography/relationship.rb
124
+ - lib/neography/relationship_traverser.rb
125
+ - lib/neography/rest.rb
126
+ - lib/neography/version.rb
127
+ - neography.gemspec
128
+ - spec/integration/neography_spec.rb
129
+ - spec/integration/node_relationship_spec.rb
130
+ - spec/integration/node_spec.rb
131
+ - spec/integration/relationship_spec.rb
132
+ - spec/integration/rest_bulk_spec.rb
133
+ - spec/integration/rest_experimental_spec.rb
134
+ - spec/integration/rest_index_spec.rb
135
+ - spec/integration/rest_node_spec.rb
136
+ - spec/integration/rest_path_spec.rb
137
+ - spec/integration/rest_relationship_spec.rb
138
+ - spec/integration/rest_traverse_spec.rb
139
+ - spec/spec_helper.rb
140
+ - spec/support/fake_root_spec.rb
140
141
  has_rdoc: true
141
142
  homepage: http://rubygems.org/gems/neography
142
143
  licenses: []
@@ -145,23 +146,23 @@ post_install_message:
145
146
  rdoc_options: []
146
147
 
147
148
  require_paths:
148
- - lib
149
+ - lib
149
150
  required_ruby_version: !ruby/object:Gem::Requirement
150
151
  none: false
151
152
  requirements:
152
- - - ">="
153
- - !ruby/object:Gem::Version
154
- segments:
155
- - 0
156
- version: "0"
153
+ - - ">="
154
+ - !ruby/object:Gem::Version
155
+ segments:
156
+ - 0
157
+ version: "0"
157
158
  required_rubygems_version: !ruby/object:Gem::Requirement
158
159
  none: false
159
160
  requirements:
160
- - - ">="
161
- - !ruby/object:Gem::Version
162
- segments:
163
- - 0
164
- version: "0"
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ segments:
164
+ - 0
165
+ version: "0"
165
166
  requirements: []
166
167
 
167
168
  rubyforge_project: neography