Welcome to Neo4j.rb

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. This JRuby gem uses the mature Neo4j Java library.

It has been tested with Neo4j version 1.8.2 and 1.9.M03 ( see here) and JRuby 1.7.4 (see Travis)

Notice, you do not need to install the Neo4j server since this gem comes included with the database. However, if you still want to use the Neo4j server (e.g. the admin UI) you can connect the embedded databas with the Neo4j server using a Neo4j HA Cluster (see wiki pages).

Documentation

Example applications

Why Neo4j.rb or a Graph Database ?

Here are some of the major benefits of Neo4j.rb

Public API

The neo4j gem depends on the neo4j-wrapper and neo4j-core gems and neo4j-cypher gem.

neo4j gem

Neo4j::Rails::Model

Neo4j::Rails::Relationship

Neo4j::Rails::Observer

Neo4j::Rails::HaConsole::Railitie

Neo4j::Rails::Versioning

Neo4j::Rails::Compositions::ClassMethods

Neo4j::Rails::AcceptId

Example

Example of using Neo4j with Rails 3 (ActiveModel)

class User < Neo4j::Rails::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

  # add an exact lucene index on the email property
  property :email, :index => :exact

  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

u = User.new(:name => 'kalle', :age => 42, :email => "bla@foo.com")
u.save

Make sure you are using JRuby !

Generate a Rails Application

Example of creating an Neo4j Application from scratch:

gem install rails
rails new myapp -m http://andreasronge.github.com/neo4j/rails.rb -O
cd myapp
bundle
rails generate scaffold User name:string email:string
rails s
open a webbrowser: http://localhost:3000/users

The -O flag above means that it will skip active record. For more information, read the Github Wiki

neo4j-wrapper

Neo4j::NodeMixin

Neo4j::RelationshipMixin

Example

Example of mapping a ruby class to a node and delaring properties and relationships and lucene index.

class Person
  include Neo4j::NodeMixin
  property :name, :index => :exact
  property :city

  has_n :friends
  has_one :address
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'

The Neo4j::NodeMixin and Neo4j::RelationshipMixin is implemented in the neo4j-wrapper gem For more information, read the Github Wiki

neo4j-core gem

Neo4j::Node The Java Neo4j Node

Neo4j::Relationship The Java Relationship

Neo4j The Database

Neo4j::Cypher Cypher DSL, see RSpec spec/neo4j/cypher_spec

Neo4j::Algo Included algorithms, like shortest path

Example

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

The Neo4j::Node and Neo4j::Relationship is implemented in the neo4j-core gem.

For more information, read the Github Wiki

Rails/Neo4j.rb in a Cluster ?

Yes, check Neo4j.rb Ha Cluster or Screencast Notice, you don't need to install the Neo4j Server, but it could be a useful tool to visualize the graph.

Architecture

As you seen above, neo4j.rb consists of a three layers API:

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.

Project information

Configuration

Development configuration - You can configure Neo4j through the Neo4j::Config object.

Neo4j::Config[:storage_path] = "/var/neo4j"

Configuring Neo4j from Rails - When using Neo4j.rb from rails you can use the normal rails configuration to set Neo4j configuration.

config.neo4j.storage_path = "#{config.root}/db/neo4j"

Contributing

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).

License

Notice there are different license for the neo4j-community, neo4j-advanced and neo4j-enterprise jar gems. Only the neo4j-community gem is by default required.