Release Date: 8 November 2019
We are proud to announce the second public early release of our Neo4j Database – Neo4j Enterprise Edition 4.0 Milestone Release 3 (in short Neo4j EE 4.0 MR3). This release is distributed publicly: we encourage you to try out all the new features. Neo4j 4.0 will be available within Neo4j Desktop Canary Version. Neo4j 4.0 is the core technology of the Neo4j Graph Platform.

Important Information

This milestone release is a beta version and it should not be used in production. Issues in the release may lead to data corruption and eventually data loss. This version is considered “feature complete”, although we may consider to add, modify or remove features at the last minute: users and developers are therefore advised to plan the use of the new features with caution.


  • Multiple databases available at runtime
  • Java and Javascript Reactive drivers with Server-to-Client flow control
  • New index population algorithm for the native index provider
  • A new, experimental version of Spring Data Neo4j based on reactive drivers (SDN/RX)
  • New features in schema-based security and Role Based Access Control
  • New features in sharding and federated data with Neo4j Fabric.
The Release Notes and changelog for the previous Milestone Release, Neo4j 4.0 EE MR2, are available here.

Detailed Changes and Docs

For a list of fixes and improvements, please see the changelog below. A preview of the documentation is available here.

Available Packages

Available Linux Repositories

Upgrading to Neo4j EE 4.0 MR3

In order to migrate from Neo4j 3.5 to Neo4j EE 4.0 MR3, follow the migration guide available here.

Neo4j 4.0 MR3 Changelog



  • Signature change for procedures: db.awaitIndex and db.resampleIndex take index name instead of pattern. Procedures db.createIndex, db.createUniquePropertyConstraint and db.createNodeKey take list of labels and properties instead of combined pattern, ‘:Label(property)’ -> [‘Label’], [‘property’].
  • The settings for the automatic page cache warmer are now supported.
  • Upgrade commons-compress to 1.19
  • Fulltext procedure can not create index with duplicate entity tokens
  • Switch transaction state to be allocated off heap by default.
  • Refactoring of db.indexes() procedure
  • Expose heap usage metrics as part of neo4j provided metrics
  • Expose nodes and relationships counters as part of neo4j provided metrics
  • Remove connectors as group settings
  • Move and rename bolt/https ssl_policy settings
  • Rework to make Config.Builder accept typed Objects instead of Strings
  • The consistency checker no longer logs DEBUG messages about the full text indexes failing to register transaction state providers or procedures. These were harmless to begin with, so now they are gone.
  • Starting a database that needs recovery will no longer wait for a uniqueness index to be rebuilt if the uniqueness index has no uniqueness constraint associated with it
  • Improve error message for returning relationships that are deleted in the same transaction.
  • Fix bug that broke settings that used relative paths when using neo4j-admin backup.
  • Monotonic time tracking for transaction termination monitor
  • Added possibility to log long running queries
  • Consistency check now verify structural consistency of indexes
  • Added possibility to prefetch files into page cache
  • Added metrics for total store size (per database)
  • Fixed a bug where Distinct combined with MapProjection could cause some results to be removed because they were incorrectly seen as not distinct.
  • Upgrade commons-compress due to security fix.


  • Add ability to disable role management
  • Decrease the chance of getting Found no solution for block with size 0 by reducing the number of solutions considered
  • When calling procedures with parameters of the wrong type, the error message has been improved to make this clear.
  • Create index and create constraint are no longer idempotent
  • Fix a planning problem where the planner wasn’t using the index after nodes have been deleted.
  • Combining index read, DISTINCT, and MERGE could in some situations end up with an error saying Uh oh… There was no slot for…
  • Solved a bug in compiled runtime where complex NodeHashJoins sometimes led to wrong result.
  • WGS-84 points will now properly validate their input coordinates. Values for latitude should always lie in the interval [-90, 90], any other value outside this range will throw an exception. Values for longitude should always lie in the interval [-180, 180], any other value outside this range will now be wrapped around to fit in this range.
  • Support database access/start/stop privilege
  • Removal of the REST API UserService endpoint
  • Support index, constraint and token management privileges
  • Fixes bug in slotted runtime, when a property is read from index and then a node property of the same name is updated later in the query. E.g.:
    MATCH (n:Label)
    WHERE n.prop > 0
     WITH collect(n.prop) AS ns
    MATCH (n:Label) SET n.prop = 0
  • Enhance split function to take multiple delimiters
  • Adding ProcedureCallContext to Context that can be used by procedures. This will give procedures information about the context in which they were called, specifically which return items were requested via yield. Based on this, the procedure can safely decide to skip calculating values that are not yielded anyway. The procedures db.labels and db.relationshipTypes have taken advantage of this for performance optimizations.
  • Solved a bug in slotted runtime where complex NodeHashJoins sometimes led to wrong result.
  • Bound calculated selectivity of range seek to exact match selectivity…
  • Allow queries like:

without a WITH between the clauses.

  • Adding ProcedureCallContext to Context that can be used by procedures. This will give procedures information about the context in which they were called, specifically which return items were requested via yield. Based on this, the procedure can safely decide to skip calculating values that are not yielded anyway. The procedures db.labels and db.relationshipTypes have taken advantage of this for performance optimizations.
  • Cypher now supports executing sub-queries. This enables, among other things, processing results of a union query, which was not possible before. The syntax for this looks like:
    CALL { MATCH (x:X) RETURN x 
           MATCH(x:Y) RETURN x
         } RETURN x ORDER BY 
  • Upgrade Apache Shiro to 1.4.1 to mitigate DoS vulnerability
  • Post-planning property read pushdown
  • Queries with variables defined before optional matches that contain OR predicates and can be planned as UNION queries were failing to retain the incoming variables.
  • Allows queries like:
MATCH (n) WHERE id(n)=20.0 RETURN n

to return the node with the id 20.

  • Procedures can now get information from ProcedureCallContext about the name of the database it is running on and if it is in the system database.

Causal Clustering

  • No longer try to connect to members which are long gone.
  • Use pooled buffers in store copy
  • Make chunk size configurable in store copy and increase default from 8K to 32K
  • Load external config file for akka.


  • Drag and drop cypher and grass files anywhere to import
  • Detect operating enviromentments more generically
  • Upgrade neo4j-driver to 1.7.5
  • Handle Infinity and -Infinity results correctly
  • Now displaying clickable urls in table and graph views
  • Export :history
  • Give user more connection feedback + add connection timeout configuration
  • Export query result records as JSON
  • Support additional :param definition. See :help params in neo4j-browser for instructions.
  • Use GraphQL version of Relate-API when available (in Neo4j Desktop)
  • UI fixes on :server user add and :server user list commands
  • Fix regression in write-code guide name
  • Revert “Use GraphQL version of Relate-API when available (in Neo4j Desktop)”.

Cypher Shell

  • Added modes: verbose/plain. Verbose displays more information and is intended for interactive use. Plain displays only the data from queries, intended for scripting
  • Added multiline statement support
  • Added option (–encryption) to choose between encrypted and unencrypted communication with the server
  • Added option –debug to get additional information in case of errors
  • Made semicolons optional for shell commands
  • Added version of connected Neo4j to welcome message
  • Fixed lack of interactive detection on Windows. Now always uses interactive mode on Windows by default
  • If non-interactive mode is desired (for scripting) then a new flag –non-interactive has been added
  • Insist that username is not empty
  • Fallback to plain bolt:// when url scheme is bolt+routing://
  • Fixed incorrect handling of bangs [!] in usernames/passwords
  • empty password gives a more descriptive error message
  • Fixed handling of pipes on Windows
  • cypher-shell now available in standalone Debian and RPM packages
  • Added tabular output format
  • automatically select output format when terminal is interactive or not
  • Fix periodic commit statements
  • Fixed startup crash on Alpine Linux
  • upgrading to latest version of driver
  • Assigning cypher expressions to parameters
  • update params display to show new params setting
  • adding support for spatial and temporal datatype
  • upgrading to driver 1.6.1
  • Don’t send parameter lambdas to server
  • Upgrade to java 11
  • Stream results of autocommit queries
  • Turn encryption off by default
  • Allows providing Cypher parameters as command line arguments with –param “name => value”.
  • Support for passing a cypher file via -f or –file to cypher-shell
  • Support interactively executing Cypher statements from a file via :source statements.cypher.


  • Fixed parsing of neo4j.conf on Windows to allow users to specify additional jvm arguments such as jdk.serialFilter.


  • Remove self signed certificate.
  • Additional netty exception logging
  • Added info level logging of raft (pre)voting decisions
  • Fix leak in akka distributed metadata
  • Optionally use jdk.serialFilter to avoid java serialization exploits
  • Startup script has been fixed to run on java11 in all bash variants.