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/i 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.
-
IRC - #neo4j @ irc.freenode.net
<img src=“https://secure.travis-ci.org/andreasronge/neo4j.png” />
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). Please also check/add issues at lighthouse, neo4j.lighthouseapp.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/