Neo4j 1.9.M05 released – wrapping up

Hi all,

We are very proud to announce the next milestone of the Neo4j 1.9 release cycle. This time, we have been trying to introduce as few big changes as possible and instead concentrate on things that make the production environment a more pleasant experience. That means Monitoring, Cypher profiling, Java7 and High Availability were the targets for this work. Let’s look at some of them:

Java7 Support

As of Neo4j 1.9.M05, Java7, Oracle JDK, is officially supported as the default runtime. We verified and adjusted some of the differences around e.g. sorting so that Java7 is a stable runtime for Neo4j.

High Availability and clustering

There have been a number of improvements around the chattiness of the HA protocol, making the cluster communication more efficient.

Kernel, Monitoring and Server

The IndexProvider interfaces are now in line with normal kernel extensions, making the system more consequent in design.
For the Neo4j REST Server, we added support for X-Forwarded-Host and X-Forwarded-Proto headers to allow parameterising of  links in data for hosting behind proxy servers.
Also, the JMX information beans will now provide info on all configuration values, including the defaults not explicitly set, enabling better diagnosing and tuning of your neo4j database.


DISTINCT is now lazy, and keeps the incoming ordering, making these kind of queries much faster and memory-efficient. Also handling of iterators from index lookups and global graph operations is lazy as it should have been. Thanks to Wes Freeman for spotting this.

A first version of support for profiling cypher statements has been introduced, together with a matching PROFILE neo4j-shell command. This reports an additional execution plan with metrics together with the result output, like

Welcome to the Neo4j Shell! Enter ‘help’ for a list of commands

neo4j-sh (0)$ profile START n = node(0) MATCH (n)-[r]-(e) WITH n RETURN count(*);
| count(*) |
| 0        |
1 row
0 ms

ColumnFilter(symKeys=[”  INTERNAL_AGGREGATE-939275295″], 

returnItemNames=[“count(*)”], _rows=1, _db_hits=0)
EagerAggregation(keys=[], aggregates=[“(INTERNAL_AGGREGATE-939275295,CountStar)”], 
_rows=1, _db_hits=0)
ColumnFilter(symKeys=[“e”, “n”, “r”], returnItemNames=[“n”], _rows=0, _db_hits=0)
TraversalMatcher(trail=”(n)-[r WHERE true AND true]-(e)”, _rows=0, _db_hits=1)
ParameterPipe(_rows=1, _db_hits=0)
neo4j-sh (0)$

As always, there has been a lot of small fixes and improvements not listed here. Many thanks for all the contributions to Neo4j for many of the issues – it helps a lot to get comments, feedback and patches for things that need improvement!

Yours sincerely,

Peter for the Neo4j Team

Want to learn more about graph databases? Click below to get your free copy of O’Reilly’s Graph Databases ebook and discover how to use graph technologies for your application today.

Download My Ebook