Skip to content

Commit

Permalink
More Phase 2 Functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
maxdemarzi committed Dec 10, 2010
1 parent d3c4887 commit da88fba
Show file tree
Hide file tree
Showing 7 changed files with 286 additions and 51 deletions.
2 changes: 1 addition & 1 deletion Gemfile.lock
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
PATH
remote: .
specs:
neography (0.0.4)
neography (0.0.5)
httparty (~> 0.6.1)
json

Expand Down
27 changes: 20 additions & 7 deletions README.rdoc
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,8 @@ The Neo4j ID is available by using node.neo_id .
new_rel = Neography::Relationship.create(:family, n1, n2) # Create a relationship from my_node to node2
new_rel.start_node # Get the start/from node of a relationship
new_rel.end_node # Get the end/to node of a relationship
new_rel.other_node(n2) # Get the other node of a relationship

existing_rel = Neography::Relationship.load(12) # Get an existing relationship by id
existing_rel.del # Delete a relationship

Expand All @@ -173,6 +175,14 @@ The Neo4j ID is available by using node.neo_id .
n1.incoming(:friends) # Get nodes related by incoming friends relationship
n1.both(:friends) # Get nodes related by friends relationship

n1.outgoing(:friends).incoming(:enemies) # Get nodes related by one of multiple relationships
n1.outgoing(:friends).depth(2) # Get nodes related by friends and friends of friends
n1.outgoing(:friends).depth(:all) # Get nodes related by friends until the end of the graph
n1.outgoing(:friends).depth(2).include_start_node # Get n1 and nodes related by friends and friends of friends

n1.outgoing(:friends).prune("position.endNode().getProperty('name') == 'Tom';")
n1.outgoing(:friends).filter("position.length() == 2;")

n1.rel?(:friends) # Has a friends relationship
n1.rel?(:outgoing, :friends) # Has outgoing friends relationship
n1.rel?(:friends, :outgoing) # same, just the other way
Expand All @@ -181,8 +191,12 @@ The Neo4j ID is available by using node.neo_id .
n1.rel?(:all) # same as above
n1.rel? # same as above



n1.rels # Get node relationships
n1.rels(:friends) # Get friends relationships
n1.rels(:friends).outgoing # Get outgoing friends relationships
n1.rels(:friends).incoming # Get incoming friends relationships
n1.rels(:friends,:work) # Get friends and work relationships
n1.rels(:friends,:work).outgoing # Get outgoing friends and work relationships

See Neo4j API for:
* {Order}[http://components.neo4j.org/neo4j-examples/1.2.M04/apidocs/org/neo4j/graphdb/Traverser.Order.html]
Expand All @@ -199,12 +213,11 @@ A couple of examples borrowed from Matthew Deiters's Neo4jr-social

=== To Do

* More tests
* More examples
* batch import with typhoeus ?
* create proper objects for Node and Relationship
* More Tests
* More Examples
* Mixins ?

=== License
=== Licenses

* Neography - MIT, see the LICENSE file http://github.com/maxdemarzi/neography/tree/master/LICENSE.
* Lucene - Apache, see http://lucene.apache.org/java/docs/features.html
Expand Down
22 changes: 6 additions & 16 deletions lib/neography/node_relationship.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,35 +2,25 @@ module Neography
module NodeRelationship

def outgoing(types=nil)
if types
NodeTraverser.new(self).outgoing(types)
else
NodeTraverser.new(self).outgoing(types).collect {|n| n}
end
NodeTraverser.new(self).outgoing(types)
end

def incoming(types=nil)
if types
NodeTraverser.new(self).incoming(types)
else
NodeTraverser.new(self).incoming(types).collect {|n| n}
end
NodeTraverser.new(self).incoming(types)
end

def both(types=nil)
if types
NodeTraverser.new(self).both(types)
else
NodeTraverser.new(self).both(types).collect {|n| n}
end
NodeTraverser.new(self).both(types)
end

def rels(*types)
Neography::RelationshipTraverser.new(self, types, :both)
end

def rel(dir, type)
Neography::RelationshipTraverser.new(self, type, dir).first
rel = Neography::RelationshipTraverser.new(self, type, dir)
rel = rel.first unless rel.nil?
rel
end

def rel?(dir=nil, type=nil)
Expand Down
24 changes: 12 additions & 12 deletions lib/neography/node_traverser.rb
Original file line number Diff line number Diff line change
Expand Up @@ -48,28 +48,28 @@ def incoming(type)
self
end

def filter(language, name)
@filter["language"] = language
if language == "builtin"
@filter["name"] = name
else
@filter["body"] = name
end
def filter(body)
@filter = Hash.new
@filter["language"] = "javascript"
@filter["body"] = body
self
end

def prune(language, body)
@prune["language"] = language
def prune(body)
@prune = Hash.new
@prune["language"] = "javascript"
@prune["body"] = body
self
end

def depth(d)
d = 2147483647 if d == :all
@depth = d
self
end

def include_start_node
@filter = Hash.new
@filter["language"] = "builtin"
@filter["name"] = "all"
self
Expand Down Expand Up @@ -110,17 +110,17 @@ def iterator
rels = @from.neo_server.get_node_relationships(@from, @relationships[0]["direction"])
case @relationships[0]["direction"]
when "in"
rels.collect { |r| @from.neo_server.get_node(r["start"]) }.uniq
rels.collect { |r| @from.neo_server.get_node(r["start"]) } #.uniq
when "out"
rels.collect { |r| @from.neo_server.get_node(r["end"]) }.uniq
rels.collect { |r| @from.neo_server.get_node(r["end"]) } #.uniq
else
rels.collect { |r|
if @from.neo_id == r["start"].split('/').last
@from.neo_server.get_node(r["end"])
else
@from.neo_server.get_node(r["start"])
end
}.uniq
} #.uniq
end
else
@from.neo_server.traverse(@from, "nodes", options)
Expand Down
6 changes: 5 additions & 1 deletion lib/neography/relationship.rb
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,12 @@ def del
self.start_node.neo_server.delete_relationship(self.neo_id)
end

def exist?
!self.start_node.neo_server.get_relationship(self.neo_id).nil?
end

def other_node(node)
if node = @start_node
if node == @start_node
@end_node
else
@start_node
Expand Down
31 changes: 26 additions & 5 deletions lib/neography/relationship_traverser.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,38 @@ def to_s
end

def each
iterator.each { |i| yield Neography::Relationship.new(i, @node.neo_server) }
iterator.each do |i|
rel = Neography::Relationship.new(i, @node.neo_server)
rel.start_node = Neography::Node.load(rel.start_node)
rel.end_node = Neography::Node.load(rel.end_node)

yield rel if match_to_other?(rel)
end
end

def empty?
first == nil
end

def iterator
@node.neo_server.get_node_relationships(@node, @direction, @types)
Array(@node.neo_server.get_node_relationships(@node, @direction, @types))
end

def match_to_other?(rel)
if @to_other.nil?
true
elsif @direction == :outgoing
rel.end_node == @to_other
elsif @direction == :incoming
rel.start_node == @to_other
else
rel.start_node == @to_other || rel.end_node == @to_other
end
end

def to_other(to_other)
@to_other = to_other
self
end

def del
Expand All @@ -44,13 +67,11 @@ def both
end

def incoming
raise "Not allowed calling incoming when finding several relationships types" if @types
@direction = :incoming
self
end

def outgoing
raise "Not allowed calling outgoing when finding several relationships types" if @types
@direction = :outgoing
self
end
Expand Down

0 comments on commit da88fba

Please sign in to comment.