Query routing decisions
Introduction
A query that arrives at a Neo4j server, over the bolt protocol from a driver, undergoes query routing. Query routing is the process of deciding with which Cypher executor (database) and at which physical location the query should be executed.
Routing decision tree
Before the query is executed, these are the decisions taken during query routing:
- Step 1: Determine the name of the target database
-
Pick the first of these that has a value:
-
-
Note that administration commands implicitly have
USE system
.
-
-
- Step 2: Reuse open transaction
-
-
If there is an already open transaction to the target database, local or remote, then proceed to step 6.
-
If not, then proceed to step 3.
-
- Step 3: Determine the type of the target database (execution context type)
-
-
If the target database is a database in this DBMS, then the context type is Internal.
-
If the target database is the Fabric virtual database, then the context type is Fabric.
-
This also allows the query to target multiple databases.
-
-
If the target database is a Fabric graph, then the context type is External.
-
- Step 4: Determine the location of execution
-
-
If context type is Internal, then …
-
if the URI scheme is
bolt://
(routing disabled), then location is Local. -
if transaction mode is
READ
, then location is Local. -
if transaction mode is
WRITE
, then …-
if the local member is the leader for the database, then location is Local.
-
if the another member is the leader for the database, then …
-
if Server-side routing is enabled, then location is Remote (using the routing advertised address of that member).
-
if not, then fail.
-
-
-
-
If context type is Fabric, then location is Local (for this part of the query).
-
If context type is External, then location is Remote (using the URI and database given in the configuration).
-
- Step 5: Open a transaction
-
-
If location is Local, then open a transaction to the database on this member.
-
If location is Remote, then open a driver transaction to the database using the URI determined in step 4.
-
- Step 6: Execute query
-
-
Execute the query in the open transaction.
-