-
Notifications
You must be signed in to change notification settings - Fork 276
Neo4j::ActiveNode
ActiveNode is the ActiveRecord replacement module for Rails. Its syntax should be familiar for ActiveRecord users but has some unique qualities.
To use ActiveNode, include Neo4j::ActiveNode
in a class.
class Post
include Neo4j::ActiveNode
end
All properties for Neo4j::ActiveNode objects must be declared (unlike neo4j-core nodes).
Properties are declared using the property
method which is the same as attribute
from the active_attr gem.
Example:
class Post
include Neo4j::ActiveNode
property :title, index: :exact
property :text, default: 'bla bla bla'
property :score, type: Integer, default: 0
validates :title, :presence => true
validates :score, numericality: { only_integer: true }
before_save do
self.score = score * 100
end
has_n :friends
end
Properties can be indexed using the index
argument on the property method, see example above.
To declare a index on a property
class Person
include Neo4j::ActiveNode
property :name, index: :exact
end
Only exact index is currently possible.
Indexes can also be declared like this:
class Person
include Neo4j::ActiveNode
property :name
index :name
end
You can declare that a property should have a unique value.
class Person
property :id_number, constraint: :unique # will raise an exception if id_number is not unique
end
Notice an unique validation is not enough to be 100% sure that a property is unique (because of concurrency issues, just like ActiveRecord). Constraints can also be declared just like indexes separately, see above.
Pass a property name as a symbol to the serialize
method if you want to save a hash or an array with mixed object types* to the database.
class Student
include Neo4j::ActiveNode
property :links
serialize :links
end
s = Student.create(links: { neo4j: 'http://www.neo4j.org', neotech: 'http://www.neotechnology.com' })
s.links
# => {"neo4j"=>"http://www.neo4j.org", "neotech"=>"http://www.neotechnology.com"}
s.links.class
# => Hash
Neo4j.rb serializes as JSON by default but pass it the constant Hash as a second parameter to serialize as YAML. Those coming from ActiveRecord will recognize this behavior, though Rails serializes as YAML by default.
*Neo4j allows you to save Ruby arrays to undefined or String types but their contents need to all be of the same type. You can do user.stuff = [1, 2, 3]
or user.stuff = ["beer, "pizza", "doritos"]
but not user.stuff = [1, "beer", "pizza"]
. If you wanted to do that, you could call serialize on your property in the model.
Implements like Active Records the following callback hooks:
- initialize
- validation
- find
- save
- create
- update
- destroy
See http://neo4j.rubyforge.org/classes/Neo4j/Rails/Timestamps.html
class Blog
include Neo4j::ActiveNode
property :updated_at # will automatically be set when model changes
end
Support the Active Model validation, such as:
- validates :age, presence: true
- validates_uniqueness_of :name, :scope => :adult
The Neo4j::ActiveNode
module has a few ways to query:
Nodes and relationships have unique ids - neo_id
.
Since Neo4j's id may be recycled you can define which key should act as primary key on Neo4j::ActiveNode
classes instead of using the internal Neo4j ids. The Neo4j internal id can always be accessed using Neo4j::ActiveNode#neo_id
You can define which key should act as primary key (Neo4j::ActiveNode#id
) either on your models or globally in Neo4j::Config or Rails configuration, for example see config/application.rb or model
An id can be generated for you and stored as an indexed property.
Example
class Person
include Neo4j::ActiveNode
id_property :my_uuid, auto: :uuid
end
The on
parameter tells which method is used to generate the unique id.
class Person
include Neo4j::ActiveNode
id_property :personal_id, on: :phone_and_name
property :name
property :phone
def phone_and_name
self.name + self.phone # strange example ...
end
end
There will always be a unique contraint on all id_properties.
has_many
and has_one
associations can also be defined on ActiveNode models to make querying and creating relationships easier.
class Post
include Neo4j::ActiveNode
has_many :in, :comments, origin: :post
has_one :out, :author, type: :author, model_class: Person
end
class Comment
include Neo4j::ActiveNode
has_one :out, :post, type: :post
has_one :out, :author, type: :author, model_class: Person
end
class Person
include Neo4j::ActiveNode
has_many :in, :posts, origin: :author
has_many :in, :comments, origin: :author
end
You can query associations:
post.comments.to_a # Array of comments
comment.post # Post object
comment.post.comments # Original comment and all of it's siblings. Makes just one query
post.comments.authors.posts # All posts of people who have commented on the post. Still makes just one query
You can create associations
post.comments = [comment1, comment2] # Removes all existing relationships
post.comments << comment3 # Creates new relationship
comment.post = post1 # Removes all existing relationships
WARNING: Much of the information in this wiki is out of date. We are in the process of moving things to readthedocs
- Project Introduction
- Neo4j::ActiveNode
- Neo4j::ActiveRel
- Search and Scope
- Validation, Uniqueness, and Case Sensitivity
- Indexing VS Legacy Indexing
- Optimized Methods
- Inheritance
- Core: Nodes & Rels
- Introduction
- Persistence
- Find : Lucene
- Relationships
- Third Party Gems & extensions
- Scaffolding & Generators
- HA Cluster