Curator's Note: The content of this article was originally written by Michael Hunger over at the Neo4j blog .
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:
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 clusteringThere have been a number of improvements around the chattiness of the HA protocol, making the cluster communication more efficient.
Kernel, Monitoring and ServerThe 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)$The profiling information is also available via the Java and REST-APIs and the Neo4j Console.
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!
For the full list of changes, as always, see