# external neo4j dependencies
require 'neo4j/property/property'
require 'neo4j/rels/rels'
require 'neo4j/traversal/traversal'
require 'neo4j/index/index'
require 'neo4j/equal'
require 'neo4j/load'
module Neo4j
# A node in the graph with properties and relationships to other entities.
# Along with relationships, nodes are the core building blocks of the Neo4j data representation model.
# Node has three major groups of operations: operations that deal with relationships, operations that deal with properties and operations that traverse the node space.
# The property operations give access to the key-value property pairs.
# Property keys are always strings. Valid property value types are the primitives(String, Fixnum, Float, Boolean), and arrays of those primitives.
#
# === Instance Methods from Included Mixins
# * Neo4j::Property - methods that deal with properties
# * Neo4j::Rels methods for accessing incoming and outgoing relationship and nodes of depth one.
# * Neo4j::Equal equality operators: eql?, equal, ==
# * Neo4j::Index lucene index methods, like indexing a node
# * Neo4j::Traversal - provides an API for accessing outgoing and incoming nodes by traversing from this node of any depth.
#
# === Class Methods from Included Mixins
# * Neo4j::Index::ClassMethods lucene index class methods, like find
# * Neo4j::Load - methods for loading a node
#
# === Neo4j::Node#new and Wrappers
#
# The Neo4j::Node#new method does not return a new Ruby instance (!). Instead it will call the Neo4j Java API which will return a
# *org.neo4j.kernel.impl.core.NodeProxy* object. This java object includes those mixins, see above. The #class method on the java object
# returns Neo4j::Node in order to make it feel like an ordnary Ruby object.
#
# If you want to map your own class to a neo4j node you can use the Neo4j::NodeMixin or the Neo4j::Rails::Model.
# The Neo4j::NodeMixin and Neo4j::Rails::Model wraps the Neo4j::Node object. The raw java node/Neo4j::Node object can be access with the Neo4j::NodeMixin#java_node method.
#
class Node
extend Neo4j::Index::ClassMethods
extend Neo4j::Load
self.node_indexer self
##
# :method: del
# Delete the node and all its relationship.
#
# It might raise an exception if this method was called without a Transaction,
# or if it failed to delete the node (it maybe was already deleted).
#
# If this method raise an exception you may also get an exception when the transaction finish.
# This method is defined in the org.neo4j.kernel.impl.core.NodeProxy which is return by Neo4j::Node.new
#
# ==== Returns
# nil or raise an exception
#
##
# :method: exist?
# returns true if the node exists in the database
# This method is defined in the org.neo4j.kernel.impl.core.NodeProxy which is return by Neo4j::Node.new
##
# :method: wrapped_entity
# same as _java_node
# Used so that we have same method for both relationship and nodes
# This method is defined in the org.neo4j.kernel.impl.core.NodeProxy which is return by Neo4j::Node.new
##
# :method: wrapper
# Loads the Ruby wrapper for this node (unless it is already the wrapper).
# If there is no _classname property for this node then it will simply return itself.
# Same as Neo4j::Node.wrapper(node)
# This method is defined in the org.neo4j.kernel.impl.core.NodeProxy which is return by Neo4j::Node.new
##
# :method: _java_node
# Returns the java node/relationship object representing this object unless it is already the java object.
# This method is defined in the org.neo4j.kernel.impl.core.NodeProxy which is return by Neo4j::Node.new
##
# :method: expand
# See Neo4j::Traversal#expand
##
# :method: outgoing
# See Neo4j::Traversal#outgoing
##
# :method: incoming
# See Neo4j::Traversal#incoming
##
# :method: both
# See Neo4j::Traversal#both
##
# :method: eval_paths
# See Neo4j::Traversal#eval_paths
##
# :method: unique
# See Neo4j::Traversal#unique
##
# :method: node
# See Neo4j::Rels#node or Neo4j::Rels
##
# :method: _node
# See Neo4j::Rels#_node or Neo4j::Rels
##
# :method: rels
# See Neo4j::Rels#rels or Neo4j::Rels
##
# :method: _rels
# See Neo4j::Rels#_rels or Neo4j::Rels
##
# :method: rel
# See Neo4j::Rels#rel
##
# :method: _rel
# See Neo4j::Rels#_rel
##
# :method: rel?
# See Neo4j::Rels#rel?
##
# :method: props
# See Neo4j::Property#props
##
# :method: neo_id
# See Neo4j::Property#neo_id
##
# :method: attributes
# See Neo4j::Property#attributes
##
# :method: property?
# See Neo4j::Property#property?
##
# :method: update
# See Neo4j::Property#update
##
# :method: []
# See Neo4j::Property#[]
##
# :method: []=
# See Neo4j::Property#[]=
##
# :method: []=
# See Neo4j::Property#[]=
class << self
# Returns a new neo4j Node.
# The return node is actually an Java obejct of type org.neo4j.graphdb.Node java object
# which has been extended (see the included mixins for Neo4j::Node).
#
# The created node will have a unique id - Neo4j::Property#neo_id
#
# ==== Parameters
# *args :: a hash of properties to initialize the node with or nil
#
# ==== Returns
# org.neo4j.graphdb.Node java object
#
# ==== Examples
#
# Neo4j::Transaction.run do
# Neo4j::Node.new
# Neo4j::Node.new :name => 'foo', :age => 100
# end
#
#
def new(*args)
# the first argument can be an hash of properties to set
props = args[0].respond_to?(:each_pair) && args[0]
# a db instance can be given, is the first argument if that was not a hash, or otherwise the second
db = (!props && args[0]) || args[1] || Neo4j.started_db
node = db.graph.create_node
props.each_pair { |k, v| node[k]= v } if props
node
end
# create is the same as new
alias_method :create, :new
# Loads a node or wrapped node given a native java node or an id.
# If there is a Ruby wrapper for the node then it will create a Ruby object that will
# wrap the java node (see Neo4j::NodeMixin).
#
# If the node does not exist it will return nil
#
def load(node_id, db = Neo4j.started_db)
node = _load(node_id, db)
node && node.wrapper
end
# Same as load but does not return the node as a wrapped Ruby object.
#
def _load(node_id, db = Neo4j.started_db)
return nil if node_id.nil?
db.graph.get_node_by_id(node_id.to_i)
rescue java.lang.IllegalStateException
nil # the node has been deleted
rescue org.neo4j.graphdb.NotFoundException
nil
end
def extend_java_class(java_clazz) #:nodoc:
java_clazz.class_eval do
include Neo4j::Property
include Neo4j::Rels
include Neo4j::Traversal
include Neo4j::Equal
include Neo4j::Index
def del #:nodoc:
rels.each { |r| r.del }
delete
nil
end
def exist? #:nodoc:
Neo4j::Node.exist?(self)
end
def wrapped_entity #:nodoc:
self
end
def wrapper #:nodoc:
self.class.wrapper(self)
end
def _java_node #:nodoc:
self
end
def class #:nodoc:
Neo4j::Node
end
end
end
end
end
# org.neo4j.kernel.HighlyAvailableGraphDatabase$LookupNode
#
Neo4j::Node.extend_java_class(org.neo4j.kernel.impl.core.NodeProxy)
end