A simple Ruby wrapper around the Neo4j graph database that works with the server and embedded Neo4j API. This gem can be used both from JRuby and normal MRI. It can be used standalone without the neo4j gem.
To make a basic connection to Neo4j to execute Cypher queries, first choose an adaptor. Adaptors for HTTP, Bolt, and Embedded mode (jRuby only) are available. You can create an adaptor like:
require 'neo4j/core/cypher_session/adaptors/http'
http_adaptor = Neo4j::Core::CypherSession::Adaptors::HTTP.new('http://neo4j:pass@localhost:7474', options)
# or
require 'neo4j/core/cypher_session/adaptors/bolt'
bolt_adaptor = Neo4j::Core::CypherSession::Adaptors::Bolt.new('bolt://neo4j:pass@localhost:7687', options)
# or
require 'neo4j/core/cypher_session/adaptors/embedded'
neo4j_adaptor = Neo4j::Core::CypherSession::Adaptors::Embedded.new('/file/path/to/graph.db', options)
The options are specific to each adaptor. See below for details.
Once you have an adaptor you can create a session like so:
neo4j_session = Neo4j::Core::CypherSession.new(http_adaptor)
From there you can make queries with a Cypher string:
# Basic query
neo4j_session.query('MATCH (n) RETURN n LIMIT 10')
# Query with parameters
neo4j_session.query('MATCH (n) RETURN n LIMIT {limit}', limit: 10)
Or via the Neo4j::Core::Query class
query_obj = Neo4j::Core::Query.new.match(:n).return(:n).limit(10)
neo4j_session.query(query_obj)
Making multiple queries with one request is supported with the HTTP Adaptor:
results = neo4j_session.queries do
append 'MATCH (n:Foo) RETURN n LIMIT 10'
append 'MATCH (n:Bar) RETURN n LIMIT 5'
end
results[0] # results of first query
results[1] # results of second query
When doing batched queries, there is also a shortcut for getting a new Neo4j::Core::Query:
results = neo4j_session.queries do
append query.match(:n).return(:n).limit(10)
end
results[0] # result
As mentioned above, each of the adaptors take different sets of options. They are enumerated below:
All adaptors take wrap_level as an option. This can be used to control how nodes, relationships, and path data is returned:
wrap_level: :nonewill return Ruby hasheswrap_level: :core_entitywill return objects from theneo4j-coregem (Neo4j::Core::Node,Neo4j::Core::Relationship, andNeo4j::Core::Pathwrap_level: :propallows you to define Ruby Procs to do your own wrapping. This is how theneo4jgem providesActiveNodeandActiveRelobjects (see thenode_wrapper.rbandrel_wrapper.rbfiles for examples on how this works
All adaptors will also take either a logger option with a Ruby logger to define where it will log to.
All adaptors will also take the skip_instrumentation option to skip logging of queries.
All adaptors will also take the verbose_query_logs option which can be true or false (false being the default). This will change the logging to output the source line of code which caused a query to be executed (note that the skip_instrumentation should not be set for logging to be produced).
The Bolt adaptor takes connect_timeout, read_timeout, and write_timeout options which define appropriate timeouts. The connect_timeout is 10 seconds and the read_timeout and write_timeout are -1 (no timeout). This is to cause the underlying net_tcp_client gem to operate in blocking mode (as opposed to non-blocking mode). When using non-blocking mode problems were found and since the official Neo4j drivers in other languages use blocking mode, this is what this gem uses by default. This issue could potentially be a bug in the handling of the EAGAIN signal, but it was not investigated further. Set the read/write timeouts at your own risk.
The Bolt adaptor also takes an ssl option which also corresponds to net_tcp_client's ssl option (which, in turn, corresponds to Ruby's OpenSSL::SSL::SSLContext). By default SSL is used. For most cloud providers that use public certificate authorities this open generally won't be needed. If you've setup Neo4j yourself you will need to provide the certificate like so:
cert_store = OpenSSL::X509::Store.new
cert_store.add_file('/the/path/to/your/neo4j.cert')
ssl: {cert_store: cert_store}}
bolt_adaptor = Neo4j::Core::CypherSession::Adaptors::Bolt.new('bolt://neo4j:pass@localhost:7687', ssl: {cert_store: cert_store})You can also turn SSL off by simply specifying ssl: false
Since the HTTP adaptor uses the faraday gem under the covers, it takes a faraday_configurator option. This allows you to pass in a Proc which works just like a Faraday setup block:
faraday_configurator: proc do |faraday|
# The default configurator uses typhoeus so if you override the configurator you must specify this
faraday.adapter :typhoeus
# Optionally you can instead specify another adaptor
# faraday.use Faraday::Adapter::NetHttpPersistent
# If you need to set options which would normally be the second argument of `Faraday.new`, you can do the following:
faraday.options[:open_timeout] = 5
faraday.options[:timeout] = 65
# faraday.options[:ssl] = { verify: true }
endThe Embedded adaptor takes properties_file and properties_map options which are passed to loadPropertiesFromFile and setConfig on the GraphDatabaseBuilder class from the Neo4j Java API.
Our documentation on ReadTheDocs covers both the neo4j and neo4j-core gems:
All new documentation will be done via our readthedocs site, though some old documentation has yet to be moved from our wiki (also there is the neo4j-core wiki)
Consulting support? Contact Heinrich and/or Amit
Pull request with high test coverage and good code climate values will be accepted faster.
Notice, only JRuby can run all the tests (embedded and server db). To run tests with coverage: rake coverage.
- Neo4j.rb - MIT, see the LICENSE file http://github.com/neo4jrb/neo4j-core/tree/master/LICENSE.
- Lucene - Apache, see http://lucene.apache.org/java/docs/features.html
- Neo4j - Dual free software/commercial license, see http://neo4j.org/
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.
