Neo4j.rb is a graph database for JRuby.
You can think of Neo4j as a high-performance graph engine with all the features of a mature and robust database. The programmer works with an object-oriented, flexible network structure rather than with strict and static tables — yet enjoys all the benefits of a fully transactional, enterprise-strength database.
It uses two powerful and mature Java libraries:
Here are some of the major benefits of Neo4j.rb
Domain Modeling - use the language of a graph (nodes/relationship/properties) to express your domain !
Schema Less and Efficient storage of Semi Structured Information
No O/R mismatch - very natural to map a graph to an Object Oriented language like Ruby.
Embedded Database - no database tier, easier to install, test, deploy and configure. It is run in the same process as your application.
Express Queries as Traversals
Fast deep traversal instead of slow SQL queries that span many table joins.
Very natural to express graph related problem with traversals (recommendation engine, find shortest parth etc..)
Seamless integration with Ruby on Rails.
ACID Transaction with rollbacks support.
Example of creating a Neo4j::Node
require "rubygems" require 'neo4j' Neo4j::Transaction.run do node = Neo4j::Node.new (:name => 'andreas') node.outgoing(:friends) << Neo4j::Node.new (:name => 'peter') node.outgoing(:friends).each {|node| puts "name #{node[:name]}"} end
Example of mapping a ruby class to a node and delaring properties and relationships and lucene index.
class Person include Neo4j::NodeMixin property :name property :city has_n :friends has_one :address index :name end # assume we have an transaction already running andreas = Person.new (:name => 'andreas') andreas.friends << Person.new (:name => 'peter') andreas.friends.each {|person| puts "name #{person.name}" } Person.find("name: andreas").first.name # => 'andreas'
Example of using Neo4j with Rails 3 (ActiveModel)
class User < Neo4j::Model attr_accessor :password attr_accessible :email, :password, :password_confirmation, :pending_account after_save :encrypt_password email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/ property :email index :email has_one(:avatar).to(Avator) validates :email, :presence => true,:format => { :with => email_regex } validates :email, :uniqueness => true, :unless => :pending_account? accepts_nested_attributes_for :avatar, :allow_destroy => true ... end
Example of creating an Neo4j Application from scratch: (make sure you have installed JRuby version >= 1.6.2)
gem install rails rails new myapp -m http://andreasronge.github.com/rails3.rb cd myapp bundle rails generate scaffold User name:string email:string rails s open a webbrowser: http://localhost:3000/users
To run it with Tomcat instead of WEBrick
gem install trinidad trinidad
As you seen above, neo4j.rb consists of a three layers API:
Layer 1. For interacting with the basic building blocks of the graph database (node, properties and relationship), see Neo4j::Node and Neo4j::Relationship classes.
Layer 2. A binding API to Ruby objects, see Neo4j::NodeMixin and Neo4j::RelationshipMixin modules.
Layer 3. An implementation of the Rails Active Model and a subset of the Active Record API, see Neo4j::Rails::Model class.
Notice that you can always access the lower layers if you want to do some more advanced. You can even access the Java API directly.
Have you found a bug, need help or have a patch ? Just clone neo4j.rb and send me a pull request or email me. Do you need help - send me an email (andreas.ronge at gmail dot com).
Neo4j.rb - MIT, see the LICENSE file github.com/andreasronge/neo4j/tree/master/LICENSE.
Lucene - Apache, see lucene.apache.org/java/docs/features.html
Neo4j - Dual free software/commercial license, see neo4j.org/