Module: Neo4j::Wrapper::HasN::ClassMethods

Defined in:
lib/neo4j-wrapper/has_n/class_methods.rb

Instance Method Summary (collapse)

Instance Method Details

- (Hash) _decl_rels



7
8
9
# File 'lib/neo4j-wrapper/has_n/class_methods.rb', line 7

def _decl_rels
  @_decl_rels ||= {}
end

- (Neo4j::Wrapper::HasN::DeclRel) has_n(rel_type)

Specifies a relationship between two node classes. Generates assignment and accessor methods for the given relationship. Both incoming and outgoing relationships can be declared, see DeclRel

Examples:

has_n(:files)


class FolderNode
   include Ne4j::NodeMixin
   has_n(:files)
end

folder = FolderNode.new
folder.files << Neo4j::Node.new << Neo4j::Node.new
folder.files.inject {...}

FolderNode.files #=> 'files' the name of the relationship

has_n(x).to(…)


# You can declare which class it has relationship to.
# The generated relationships will be prefixed with the name of that class.
class FolderNode
   include Ne4j::NodeMixin
   has_n(:files).to(File)
   # Same as has_n(:files).to("File")
end

FolderNode.files #=> 'File#files' the name of the relationship

has_n(x).from(class, has_n_name)


# generate accessor method for traversing and adding relationship on incoming nodes.
class FileNode
   include Ne4j::NodeMixin
   has_one(:folder).from(FolderNode.files)
   # or same as
   has_one(:folder).from(FolderNode, :files)
end

Using Cypher

# from FolderNode example above
folder.files.query{ cypher query DSL, see neo4j-core}
folder.files{ } # same as above
folder.files.query(:name => 'file.txt') # a cypher query with WHERE and statements
folder.files(:name => 'file.txt') # same as above
folder.files.query.to_s # the cypher query explained as a String


68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/neo4j-wrapper/has_n/class_methods.rb', line 68

def has_n(rel_type)
  clazz = self
  module_eval(%Q{
        def #{rel_type}(cypher_hash_query = nil, &cypher_block)
            dsl = _decl_rels_for('#{rel_type}'.to_sym)
            Neo4j::Wrapper::HasN::Nodes.new(self, dsl, cypher_hash_query, &cypher_block)
        end}, __FILE__, __LINE__)


  module_eval(%Q{
        def #{rel_type}_rels
            dsl = _decl_rels_for('#{rel_type}'.to_sym)
            dsl.all_relationships(self)
        end}, __FILE__, __LINE__)

  instance_eval(%Q{
  def #{rel_type}
    _decl_rels[:#{rel_type}].rel_type
  end}, __FILE__, __LINE__)

  _decl_rels[rel_type.to_sym] = DeclRel.new(rel_type, false, clazz)
end

- (Neo4j::Wrapper::HasN::DeclRel) has_one(rel_type)

Specifies a relationship between two node classes. Generates assignment and accessor methods for the given relationship Old relationship is deleted when a new relationship is assigned. Both incoming and outgoing relationships can be declared, see DeclRel

Examples:


class FileNode
   include Ne4j::NodeMixin
   has_one(:folder)
end

file = FileNode.new
file.folder = Neo4j::Node.new
file.folder # => the node above
file.folder_rel # => the relationship object between those nodes


110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/neo4j-wrapper/has_n/class_methods.rb', line 110

def has_one(rel_type)
  clazz = self
  module_eval(%Q{def #{rel_type}=(value)
          dsl = _decl_rels_for(:#{rel_type})
          rel = dsl.single_relationship(self)
          rel.del unless rel.nil?
          dsl.create_relationship_to(self, value) if value
      end}, __FILE__, __LINE__)

  module_eval(%Q{def #{rel_type}
          dsl = _decl_rels_for('#{rel_type}'.to_sym)
          dsl.single_node(self)
      end}, __FILE__, __LINE__)

  module_eval(%Q{def #{rel_type}_rel
          dsl = _decl_rels_for(:#{rel_type})
          dsl.single_relationship(self)
       end}, __FILE__, __LINE__)

  instance_eval(%Q{
  def #{rel_type}
    _decl_rels[:#{rel_type}].rel_type
  end}, __FILE__, __LINE__)

  _decl_rels[rel_type.to_sym] = DeclRel.new(rel_type, true, clazz)
end

- (Object) inherited(klass)

make sure the inherited classes inherit the _decl_rels hash



12
13
14
15
16
17
# File 'lib/neo4j-wrapper/has_n/class_methods.rb', line 12

def inherited(klass)
  copy = _decl_rels.clone
  copy.each_pair{|k,v| copy[k] = v.inherit_new}
  klass.instance_variable_set(:@_decl_rels, copy)
  super
end