Cypher is a language that is constantly evolving. New features are added to the language continuously, and occasionally, some features become deprecated and are subsequently removed.
This section lists all of the features that have been removed, deprecated, added, or extended in different Cypher versions. Replacement syntax for deprecated and removed features are also indicated.
Feature | Details |
---|---|
label:functionality[] label:deprecated[] CREATE ... INDEX ... OPTIONS { indexProvider: ... }
CREATE ... CONSTRAINTS ... OPTIONS { indexProvider: ... } |
Specifying an index provider in the This also means that the vector index index provider, |
label:functionality[] label:deprecated[] MATCH (where {...}) MATCH (...)-[where {...}]->() |
The variable named
|
label:functionality[] label:deprecated[] ... + n:A ... + n:A&B ... + n:A&B|C |
Using an unparenthesized label expression predicate as the right-hand side operand of |
label:functionality[] label:deprecated[] CASE x ... WHEN is :: STRING THEN ... END |
Using a variable named |
label:functionality[] label:deprecated[] CASE x ... WHEN contains + 1 THEN ... END CASE x ... WHEN contains - 1 THEN ... END |
Using a variable named
|
label:functionality[] label:deprecated[] CASE x ... WHEN in[1] THEN ... END CASE x ... WHEN in["abc"] THEN ... END |
Using the
|
label:functionality[] label:deprecated[] CALL db.schema.nodeTypeProperties() YIELD propertyTypes RETURN propertyTypes;
CALL db.schema.relTypeProperties() YIELD propertyTypes RETURN propertyTypes; |
The column |
label:functionality[] label:deprecated[] CREATE DATABASE db OPTIONS { seedCredentials: ..., seedConfig: ... } |
The |
label:functionality[] label:deprecated[] CREATE DATABASE db OPTIONS { storeFormat: 'standard' }
CREATE DATABASE db OPTIONS { storeFormat: 'high_limit' } |
The |
Feature | Details |
---|---|
label:functionality[] label:updated[] USE graph.byElementId("4:c0a65d96-4993-4b0c-b036-e7ebd9174905:0")
MATCH (n) RETURN n |
|
label:functionality[] label:updated[] CREATE DATABASE foo TOPOLOGY $p PRIMARIES $s SECONDARIES ALTER DATABASE foo SET TOPOLOGY $p PRIMARIES $s SECONDARIES |
The |
label:functionality[] label:updated[] GRANT READ {*} ON GRAPH * FOR (n) WHERE n.createdAt > date('2024-10-25') TO regularUsers |
Property-based access control now supports spatial and temporal values. |
label:functionality[] label:updated[] RETURN 'val' as one, 'val' as two
UNION
RETURN 'val' as two, 'val' as one RETURN 'val' as one, 'val' as two
UNION ALL
RETURN 'val' as two, 'val' as one |
Using differently ordered return items in a |
Feature | Details |
---|---|
label:functionality[] label:new[] MATCH (n:$($label)),
()-[r:$($type))]->() CREATE (n:$($label)),
()-[r:$($type)]->() MERGE (n:$($label)),
()-[r:$($type)]->() LOAD CSV WITH HEADERS FROM 'file:///artists-with-headers.csv' AS line
CREATE (n:$(line.label) {name: line.Name}) |
Added the ability to dynamically reference node labels and relationship types in |
Feature | Details |
---|---|
label:functionality[] label:deprecated[] CREATE DATABASE db OPTIONS { existingDataSeedInstance: ... } |
The |
Feature | Details |
---|---|
label:functionality[] label:updated[] CREATE (n:Label {property: 'name'}),
()-[r:REL_TYPE]->() |
Neo4j’s block format now implements GQL’s limit on the maximum length of identifiers. The maximum limit is set to 16,383 characters in an identifier. This means that node labels, relationship types, and property keys cannot include more than 16,383 characters. |
Feature | Details |
---|---|
label:functionality[] label:new[] CREATE DATABASE db OPTIONS { existingDataSeedServer: ... } |
The option |
Feature | Details |
---|---|
label:functionality[] label:new[] MATCH (t:Team)
OPTIONAL CALL (t) {
MATCH (p:Player)-[:PLAYS_FOR]->(t)
RETURN collect(p) as players
}
RETURN t AS team, players OPTIONAL CALL db.labels() YIELD label
RETURN label |
Introduced |
label:functionality[] label:new[] MATCH (n)
RETURN n.name AS names OFFSET 2 |
Introduced See |
label:functionality[] label:new[] MATCH (n)
ORDER BY n.name DESC
OFFSET 3
LIMIT 2
RETURN collect(n.name) AS names |
Introduced GQL conformant standalone |
label:functionality[] label:new[] SET n:$(label)
REMOVE n:$(label) |
Added the ability to dynamically reference labels in SET and REMOVE clauses. |
label:functionality[] label:new[] SET n[$prop] = "hello world"
REMOVE n[$prop] |
Added the ability to dynamically reference properties in SET and REMOVE clauses. |
label:functionality[] label:new[] DROP [COMPOSITE] DATABASE ... [RESTRICT | CASCADE ALIAS[ES]] |
Added the ability to drop database aliases while deleting a database. This will affect local database aliases targeting the database and constituent database aliases belonging to the composite database. For more information, see Delete a database with local database aliases targeting it and Delete a composite database with constituent database aliases. |
label:functionality[] label:new[] LOAD CSV FROM 'azb://azb-account/azb-container/artists.csv' AS row
MERGE (a:Artist {name: row[1], year: toInteger(row[2])})
RETURN a.name, a.year |
Extension of the LOAD CSV clause to allow loading CSV files from Azure Cloud Storage URIs. |
label:functionality[] label:new[] CREATE USER bob
SET AUTH 'externalProviderName' {
SET ID 'userIdForExternalProvider'
}
SET AUTH 'native' {
SET PASSWORD 'password'
SET PASSWORD CHANGE REQUIRED
} |
Added the ability set which auth providers apply to a user (Enterprise Edition). Administration of the native (username / password) auth via the new syntax is also now supported (Community Edition). |
label:functionality[] label:new[] ALTER USER bob
REMOVE AUTH 'native'
SET AUTH 'externalProviderName' {
SET ID 'userIdForExternalProvider'
} |
Added the ability add and remove user auth providers via the Setting the native (username / password) auth provider via this new syntax is also supported (Community Edition), but removing any auth provider or setting a non-native auth provider is only supported in Enterprise Edition. |
label:functionality[] label:new[] SHOW USERS WITH AUTH |
New support for |
label:functionality[]
label:new[] SET AUTH |
New privilege that allows a user to modify user auth providers.
This is a sub-privilege of the |
Feature | Details |
---|---|
label:functionality[] label:deprecated[] UNWIND [0, 1, 2] AS x
CALL {
WITH x
RETURN x * 10 AS y
}
RETURN x, y |
Using the |
Feature | Details |
---|---|
label:functionality[] label:updated[] RETURN datetime.statement() IS :: TIMESTAMP WITH TIME ZONE |
Introduced new GQL conformant aliases to duration types: See types and their synonyms for more. |
Feature | Details |
---|---|
label:functionality[] label:new[] UNWIND [0, 1, 2] AS x
CALL (x) {
RETURN x * 10 AS y
}
RETURN x, y |
Introduced a new variable scope clause to import variables in |
label:functionality[] label:new[] CREATE VECTOR INDEX moviePlots IF NOT EXISTS
FOR (m:Movie)
ON m.embedding
OPTIONS {indexConfig: {
`vector.quantization.enabled`: true
`vector.hnsw.m`: 16,
`vector.hnsw.ef_construction`: 100,
}} |
Introduced the following configuration settings for vector indexes:
Additionally, as of Neo4j 5.23, it is no longer mandatory to configure the settings |
Feature | Details |
---|---|
label:functionality[] label:updated[] SHOW FUNCTIONS YIELD *
SHOW PROCEDURES YIELD * |
Introduced a The column is a |
Feature | Details |
---|---|
label:functionality[] label:new[] GRANT READ {*} ON GRAPH * FOR (n) WHERE n.securityLevel > 3 TO regularUsers GRANT TRAVERSE ON GRAPH * FOR (n:Email) WHERE n.classification IS NULL TO regularUsers DENY MATCH {*} ON GRAPH * FOR (n) WHERE n.classification <> 'UNCLASSIFIED' TO regularUsers |
Introduction of property-based access control for read privileges. The ability to read, traverse and match nodes based on node property values is now supported in Enterprise Edition. |
label:functionality[] label:new[] LOAD CSV FROM 'gs://gs-bucket/artists.csv' AS row
MERGE (a:Artist {name: row[1], year: toInteger(row[2])})
RETURN a.name, a.year |
Extension of the LOAD CSV clause to allow loading CSV files from Google Cloud Storage URIs. |
label:functionality[] label:new[] CYPHER inferSchemaParts=most_selective_label |
Introduction of |
label:functionality[] label:new[] RETURN upper('abc'), lower('ABC') |
Introduction of a lower() and upper() function. These are aliases of the toLower() and toUpper() functions. |
label:functionality[] label:new[] UNWIND range(1, 10) as i
CALL {
WITH i
CREATE (n:N { i: i })
} IN 3 CONCURRENT TRANSACTIONS OF 2 ROWS |
Introduced CALL { … } IN CONCURRENT TRANSACTIONS, which uses multiple CPU processors simultaneously to execute batched inner transactions concurrently. |
label:functionality[] label:new[] MATCH SHORTEST 1 (:A)-[:R]->{0,10}(:B) MATCH p = ANY 2 (:A)-[:R]->{0,10}(:B) MATCH ALL SHORTEST (:A)-[:R]->{0,10}(:B) MATCH SHORTEST 2 GROUPS (:A)-[:R]->{0,10}(:B) |
Introduced new graph pattern matching keywords to find variations of the shortest paths between nodes. |
label:functionality[] label:new[] New operators: |
Introduced new operators to solve |
Feature | Details |
---|---|
label:functionality[] label:deprecated[] MERGE (a {foo:1})-[:T]->(b {foo:a.foo}) |
Merging a node or relationship entity, and then referencing that entity in a property definition in the same |
Feature | Details |
---|---|
label:syntax[] label:functionality[] label:new[] RETURN trim(BOTH 'x' FROM 'xxhelloxx'),
ltrim('xxhello', 'x'),
rtrim('helloxx', 'x'),
btrim('xxhelloxx', 'x') |
Introduced btrim() function, which returns the given |
Feature | Details |
---|---|
label:functionality[] label:new[] RETURN "Hello" || " " || "World";
RETURN [1, 2] || [3, 4, 5]; |
Added a new |
label:functionality[] label:new[] FINISH |
New FINISH clause, which can be optionally used to define a query that returns no result. |
label:functionality[] label:new[] RETURN 1 AS a
UNION DISTINCT
RETURN 1 AS a |
The keyword |
label:functionality[] label:new[] LOAD CSV FROM 's3://artists.csv' AS row
MERGE (a:Artist {name: row[1], year: toInteger(row[2])})
RETURN a.name, a.year |
Extension of the LOAD CSV clause to allow loading CSV files from AWS S3 URIs. |
label:functionality[] label:new[]
|
Added support for additional Vertex AI vector encoding models.
Also added support for Vertex AI |
Feature | Details |
---|---|
label:functionality[] label:new[] INSERT |
Added a new keyword INSERT, which can be used as a synonym to |
label:functionality[] label:new[] MATCH (n)
RETURN CASE n.prop
WHEN IS NULL THEN "Null"
WHEN < 0 THEN "Negative"
WHEN 2, 4, 6, 8 THEN "Even"
ELSE "Odd"
END |
Extension of the simple |
label:functionality[] label:new[] CREATE VECTOR INDEX [index_name] [IF NOT EXISTS]
FOR ()-[r:REL_TYPE]-() ON (r.property)
OPTIONS {indexConfig: {
`vector.dimensions`: $dimension,
`vector.similarity_function`: $similarityFunction
}} |
Added command to create relationship vector indexes.
The index configuration settings |
label:functionality[] label:new[] RETURN vector.similarity.euclidean(a, b)
RETURN vector.similarity.cosine(a, b) |
Introduction of vector similarity functions.
These functions return a |
Feature | Details |
---|---|
label:functionality[] label:updated[] CREATE [index_type] INDEX [index_name] IF NOT EXISTS FOR ... |
When attempting to create an index using |
label:functionality[] label:updated[] CREATE CONSTRAINT [constraint_name] IF NOT EXISTS FOR ... |
When attempting to create a constraint using |
label:functionality[] label:updated[] DROP CONSTRAINT constraint_name IF EXISTS |
When attempting to drop a non-existing index using |
label:functionality[] label:updated[] DROP INDEX index_name IF EXISTS |
When attempting to drop a non-existing constraint using |
Feature | Details |
---|---|
label:functionality[] label:new[] RETURN normalize("string", NFC) |
Introduction of a normalize() function.
This function normalizes a |
label:functionality[] label:new[] IS [NOT] [NFC | NFD | NFKC | NFKD] NORMALIZED RETURN "string" IS NORMALIZED |
Introduction of an IS NORMALIZED operator.
The operator can be used to check if a |
label:functionality[] label:new[] New operators:
|
Introduction of partitioned operators used by the parallel runtime. These operators segment the data and operate on each segment in parallel |
Feature | Details |
---|---|
label:functionality[] label:updated[] CREATE [index_type] INDEX $name [IF NOT EXISTS] FOR ...
DROP INDEX $name [IF EXISTS] |
Added the ability to use parameters for the index name in the |
label:functionality[] label:updated[] CREATE CONSTRAINT $name [IF NOT EXISTS] FOR ...
DROP CONSTRAINT $name [IF EXISTS] |
Added the ability to use parameters for the constraint name in the |
Feature | Details |
---|---|
label:functionality[] label:new[] GRANT LOAD ON CIDR "127.0.0.1/32" TO role
DENY LOAD ON CIDR "::1/128" TO role |
Added the ability to grant or deny |
Feature | Details |
---|---|
label:functionality[] label:deprecated[] RETURN 1 as my\u0085identifier |
The Unicode character `\u0085` is deprecated for identifiers not quoted in backticks and will be considered as a whitespace character in the future. To continue using it, quote the identifier with backticks. This applies to all identifiers in Cypher, such as label expressions, properties, variable names or parameters. In the given example, the quoted identifier would be `my�identifier`. |
label:functionality[] label:deprecated[] RETURN 1 as my$Identifier |
The character with the Unicode representation `\u0024` is deprecated for identifiers not quoted in backticks and will not be supported in the future. To continue using it, quote the identifier with backticks. This applies to all identifiers in Cypher, such as label expressions, properties, variable names or parameters. In the given example, the quoted identifier would be `my$identifier`. The following Unicode Characters are deprecated in identifiers: '\u0000', '\u0001', '\u0002', '\u0003', '\u0004', '\u0005', '\u0006', '\u0007', '\u0008', '\u000E', '\u000F', '\u0010', '\u0011', '\u0012', '\u0013', '\u0014', '\u0015', '\u0016', '\u0017', '\u0018', '\u0019', '\u001A', '\u001B', '\u007F', '\u0080', '\u0081', '\u0082', '\u0083', '\u0084', '\u0086', '\u0087', '\u0088', '\u0089', '\u008A', '\u008B', '\u008C', '\u008D', '\u008E', '\u008F', '\u0090', '\u0091', '\u0092', '\u0093', '\u0094', '\u0095', '\u0096', '\u0097', '\u0098', '\u0099', '\u009A', '\u009B', '\u009C', '\u009D', '\u009E', '\u009F', '\u0024', '\u00A2', '\u00A3', '\u00A4', '\u00A5', '\u00AD', '\u0600', '\u0601', '\u0602', '\u0603', '\u0604', '\u0605', '\u061C', '\u06DD', '\u070F', '\u08E2', '\u180E', '\u200B', '\u200C', '\u200D', '\u200E', '\u200F', '\u202A', '\u202B', '\u202C', '\u202D', '\u202E', '\u2060', '\u2061', '\u2062', '\u2063', '\u2064', '\u2066', '\u2067', '\u2068', '\u2069', '\u206A', '\u206B', '\u206C', '\u206D', '\u206E', '\u206F', '\u2E2F', '\uFEFF', '\uFFF9', '\uFFFA', '\uFFFB' |
Feature | Details |
---|---|
label:functionality[] label:updated[] SHOW VECTOR INDEXES |
Extended |
label:functionality[] label:updated[] MATCH (n:Label) WHERE $param IS :: STRING NOT NULL AND n.prop = $param |
|
Feature | Details |
---|---|
label:functionality[] label:new[] MATCH (n)
RETURN count(ALL n.prop) |
Added a new keyword ALL, explicitly defining that the aggregate function is not |
label:functionality[] label:new[] CREATE VECTOR INDEX [index_name] [IF NOT EXISTS]
FOR (n: Label) ON (n.property)
OPTIONS {indexConfig: {
`vector.dimensions`: $dimension,
`vector.similarity_function`: $similarityFunction
}} |
Added command to create node vector indexes, replacing the |
Feature | Details |
---|---|
label:functionality[] label:updated[] IS :: INTEGER! |
Extended type syntax to allow an exclamation mark |
Feature | Details |
---|---|
label:functionality[] label:new[] RETURN nullIf(v1, v2) |
Introduction of a nullIf() function. This function returns null if the two given parameters are equivalent, otherwise returns the value of the first parameter. |
label:functionality[] label:new[] MATCH (n) NODETACH DELETE n |
Added a new keyword NODETACH, explicitly defining that relationships will not be detached and deleted.
This is a mirror of the already existing keyword |
Feature | Details |
---|---|
label:functionality[] label:updated[] SHOW FUNCTIONS YIELD *
SHOW PROCEDURES YIELD * |
Updated the Procedure signatures now follow the pattern:
The signature for procedures with no return columns now follows the pattern:
Function signatures now follow the pattern:
For all available Cypher types, see the section on types and their synonyms. |
Feature | Details |
---|---|
label:functionality[] label:new[] label:beta[] CALL cdc.current()
CALL cdc.earliest()
CALL cdc.query(from, selectors) |
Introduction of the Change Data Capture (CDC) feature. For details, see Change Data Capture. |
label:functionality[] label:new[] RETURN valueType(expr) |
Introduction of a valueType() function.
This function returns a |
label:functionality[] label:new[] RETURN char_length(expr) |
Introduction of a char_length() function.
This function returns the number of Unicode characters in a |
label:functionality[] label:new[] RETURN character_length(expr) |
Introduction of a character_length() function.
This function returns the number of Unicode characters in a |
label:functionality[] label:new[] New privilege: GRANT LOAD ON ALL DATA TO `role` |
New privilege that controls a user’s ability to load data.
Unlike other privileges, these are not granted, denied, or revoked on graphs, databases, or the DBMS, but instead on |
label:functionality[] label:new[] USE graph.byElementId(elementId :: STRING) |
New graph function, graph.byElementId(), that resolves the constituent graph to which a given element id belongs. |
label:functionality[] label:new[] CYPHER runtime = parallel |
Introduction of the parallel runtime. This runtime is designed for analytical, graph-global read queries run on machines with several available CPUs. |
Feature | Details |
---|---|
label:functionality[] label:new[] db.nameFromElementId(elementId :: STRING) :: STRING |
New database function to return database names from element ids. |
Feature | Details |
---|---|
label:functionality[] label:updated[] SHOW ALIASES |
Introduced a new column The column returns the name of the composite database that the alias belongs to, or |
label:functionality[] label:updated[] IS [NOT] :: <TYPE> |
Extended type predicate expressions.
Closed dynamic union types ( IS :: INTEGER | FLOAT |
label:functionality[] label:updated[] CREATE CONSTRAINT name FOR (n:Label) REQUIRE n.prop IS :: <PROPERTY TYPE>
CREATE CONSTRAINT name FOR ()-[r:TYPE]-() REQUIRE r.prop IS :: <PROPERTY TYPE> |
Extended node and relationship property type constraints.
Closed dynamic union types (
|
label:functionality[] label:updated[] ALTER CURRENT USER
SET PASSWORD FROM 'password1' TO 'password2' |
This command now auto-commits even when executed inside an explicit transaction. |
Feature | Details |
---|---|
label:functionality[] label:updated[] IS [NOT] :: <TYPE> |
Extended type predicate expressions. The newly supported types are:
|
label:functionality[] label:updated[] CREATE CONSTRAINT name FOR (n:Label) REQUIRE n.prop IS :: <PROPERTY TYPE>
CREATE CONSTRAINT name FOR ()-[r:TYPE]-() REQUIRE r.prop IS :: <PROPERTY TYPE> |
Extended node and relationship property type constraints. The new supported types are:
|
Feature | Details |
---|---|
label:functionality[] label:deprecated[] CREATE (a {foo:1}), (b {foo:a.foo}) |
Creating a node or relationship entity,
and then referencing that entity in a property definition in the same |
Feature | Details |
---|---|
label:functionality[] label:updated[] SHOW SETTINGS YIELD *
SHOW FUNCTIONS YIELD *
SHOW PROCEDURES YIELD * |
Introduced an The column is true if the setting/function/procedure is deprecated and false otherwise. |
label:functionality[] label:updated[] SHOW FUNCTIONS YIELD argumentDescription
SHOW PROCEDURES YIELD argumentDescription, returnDescription |
Introduced an The field is true if the argument/return value is deprecated and false otherwise. |
label:functionality[] label:updated[] SHOW CONSTRAINTS |
Introduced |
Feature | Details |
---|---|
label:functionality[] label:new[] MATCH ((x:A)-[:R]->(z:B WHERE z.h > x.h)){1,5} |
Introduction of quantified path patterns - a new method in graph pattern matching for matching paths of a variable length. More information can be found here. |
label:functionality[] label:new[] New operator: |
The |
label:functionality[] label:new[] IS [NOT] :: <TYPE> |
Added type predicate expressions. The available types are:
|
label:functionality[] label:new[] CREATE CONSTRAINT name FOR (n:Label) REQUIRE n.prop IS :: <PROPERTY TYPE>
CREATE CONSTRAINT name FOR ()-[r:TYPE]-() REQUIRE r.prop IS :: <PROPERTY TYPE> |
Added node and relationship property type constraints. The available property types are:
|
label:functionality[] label:new[] SHOW NODE PROPERTY TYPE CONSTRAINTS
SHOW REL[ATIONSHIP] PROPERTY TYPE CONSTRAINTS
SHOW PROPERTY TYPE CONSTRAINTS |
Added filtering for the new property constraints to |
label:functionality[] label:new[] SHOW SUPPORTED PRIVILEGE[S] |
List supported privileges on the current server. |
Feature | Details |
---|---|
label:functionality[] label:updated[] SHOW INDEXES |
Introduced The |
Feature | Details |
---|---|
label:functionality[] label:new[] New operator: |
The |
Feature | Details |
---|---|
label:functionality[] label:deprecated[] CYPHER connectComponentsPlanner=greedy MATCH (a), (b) RETURN * CYPHER connectComponentsPlanner=idp MATCH (a), (b) RETURN * |
The Cypher query option |
Feature | Details |
---|---|
label:functionality[] label:updated[] ALTER DATABASE ... [WAIT [n [SEC[OND[S]]]]|NOWAIT] |
New sub-clause |
label:functionality[] label:new[] CREATE CONSTRAINT name FOR ()-[r:TYPE]-() REQUIRE r.prop IS UNIQUE
CREATE CONSTRAINT name FOR ()-[r:TYPE]-() REQUIRE r.prop IS RELATIONSHIP KEY |
Added relationship key and property uniqueness constraints. |
label:functionality[] label:new[] SHOW NODE UNIQUE[NESS] CONSTRAINTS
SHOW REL[ATIONSHIP] UNIQUE[NESS] CONSTRAINTS
SHOW UNIQUE[NESS] CONSTRAINTS
SHOW REL[ATIONSHIP] KEY CONSTRAINTS
SHOW KEY CONSTRAINTS |
Added filtering for the new constraint types to The existing |
Feature | Details |
---|---|
label:functionality[] label:new[] CALL {
<inner>
} IN TRANSACTIONS [ OF <num> ROWS ]
[ ON ERROR CONTINUE / BREAK / FAIL ]
[ REPORT STATUS AS <v> ] |
New fine-grained control mechanism to control how an inner transaction impacts subsequent inner and/or outer transactions.
|
Feature | Details |
---|---|
label:functionality[] label:new[]
|
New functionality to change tags at runtime via |
label:functionality[] label:new[] COLLECT {
...
} |
New expression which returns the results of a subquery collected in a list. |
label:functionality[] label:new[] SHOW SETTING[S] [setting-name[,...]]
[YIELD { * | field[, ...] } [ORDER BY field[, ...]] [SKIP n] [LIMIT n]]
[WHERE expression]
[RETURN field[, ...] [ORDER BY field[, ...]] [SKIP n] [LIMIT n]] |
List configuration settings on the current server. The |
label:functionality[]
label:new[] SHOW SETTING[S] name-globbing[,...] |
New privilege that controls a user’s access to desired configuration settings. |
Feature | Details |
---|---|
label:functionality[] label:deprecated[] RETURN 'val' as one, 'val' as two
UNION
RETURN 'val' as two, 'val' as one RETURN 'val' as one, 'val' as two
UNION ALL
RETURN 'val' as two, 'val' as one |
Using differently ordered return items in a RETURN 'val' as one, 'val' as two
UNION
RETURN 'val' as one, 'val' as two RETURN 'val' as one, 'val' as two
UNION ALL
RETURN 'val' as one, 'val' as two |
Feature | Details |
---|---|
label:functionality[] label:updated[] SHOW DATABASES |
Changes to the visibility of databases hosted on offline servers. For such databases:
|
label:functionality[] label:updated[] EXISTS {
...
} |
An |
label:functionality[] label:updated[] COUNT {
...
} |
A |
label:functionality[] label:updated[] SHOW UNIQUE[NESS] CONSTRAINTS |
The property uniqueness constraint type filter now allow both |
Feature | Details |
---|---|
label:functionality[] label:updated[] CREATE COMPOSITE DATABASE name OPTIONS {} |
Creating composite databases now allows for an empty options clause. There are no applicable option values for composite databases. |
label:functionality[] label:new[] DRYRUN REALLOCATE|DEALLOCATE DATABASES FROM <serverId> |
To preview of the result of either |
Feature | Details |
---|---|
label:functionality[] label:deprecated[] CREATE TEXT INDEX ... OPTIONS {indexProvider: `text-1.0`} |
The text index provider |
Feature | Details |
---|---|
label:functionality[] label:removed[] SHOW EXISTS CONSTRAINTS SHOW NODE EXISTS CONSTRAINTS SHOW RELATIONSHIP EXISTS CONSTRAINTS |
Replaced by: SHOW [PROPERTY] EXIST[ENCE] CONSTRAINTS SHOW NODE [PROPERTY] EXIST[ENCE] CONSTRAINTS SHOW REL[ATIONSHIP] [PROPERTY] EXIST[ENCE] CONSTRAINTS |
label:functionality[] label:removed[] SHOW INDEXES BRIEF SHOW CONSTRAINTS BRIEF |
Replaced by: SHOW INDEXES SHOW CONSTRAINTS |
label:functionality[] label:removed[] SHOW INDEXES VERBOSE SHOW CONSTRAINTS VERBOSE |
Replaced by: SHOW INDEXES YIELD * SHOW CONSTRAINTS YIELD * |
label:functionality[] label:removed[] DROP INDEX ON :Label(prop) |
Replaced by: DROP INDEX name |
label:functionality[] label:removed[] DROP CONSTRAINT ON (n:Label) ASSERT (n.prop) IS NODE KEY DROP CONSTRAINT ON (n:Label) ASSERT (n.prop) IS UNIQUE DROP CONSTRAINT ON (n:Label) ASSERT exists(n.prop) DROP CONSTRAINT ON ()-[r:Type]-() ASSERT exists(r.prop) |
Replaced by: DROP CONSTRAINT name |
label:functionality[] label:removed[] CREATE INDEX ON :Label(prop) |
Replaced by: CREATE INDEX FOR (n:Label) ON (n.prop) |
label:functionality[] label:removed[] CREATE CONSTRAINT ON ... ASSERT ... |
Replaced by: CREATE CONSTRAINT FOR ... REQUIRE ... |
label:functionality[] label:removed[] CREATE BTREE INDEX ... label:functionality[] label:removed[] CREATE INDEX
...
OPTIONS "{" btree-option: btree-value[, ...] "}" |
B-tree indexes are removed. B-tree indexes used for CREATE TEXT INDEX ... B-tree indexes used for spatial queries are replaced by: CREATE POINT INDEX ... B-tree indexes used for general queries or property value types are replaced by: CREATE [RANGE] INDEX ... These new indexes may be combined for multiple use cases. |
label:functionality[] label:removed[] SHOW BTREE INDEXES |
B-tree indexes are removed. Replaced by: SHOW {POINT | RANGE | TEXT} INDEXES |
label:functionality[] label:removed[] USING BTREE INDEXES |
B-tree indexes are removed. Replaced by: USING {POINT | RANGE | TEXT} INDEX |
label:functionality[] label:removed[] CREATE CONSTRAINT
...
OPTIONS "{" btree-option: btree-value[, ...] "}" |
Node key and property uniqueness constraints backed by B-tree indexes are removed. Replaced by: CREATE CONSTRAINT ... Constraints used for |
label:functionality[] label:removed[] SHOW INDEXES YIELD uniqueness |
The The new column |
label:functionality[] label:removed[] SHOW CONSTRAINTS YIELD ownedIndexId |
The |
label:functionality[]
label:removed[] ON DEFAULT DATABASE |
Replaced by: ON HOME DATABASE |
label:functionality[]
label:removed[] ON DEFAULT GRAPH |
Replaced by: ON HOME GRAPH |
label:functionality[] label:removed[] SHOW TRANSACTIONS YIELD allocatedBytes |
The |
label:functionality[] label:removed[] exists(prop) |
Replaced by: prop IS NOT NULL |
label:functionality[] label:removed[] NOT exists(prop) |
Replaced by: prop IS NULL |
label:functionality[] label:removed[] 0... |
Replaced by |
label:functionality[] label:removed[] 0X... |
Only |
label:functionality[] label:removed[] MATCH ()-[r]-()
RETURN [ ()-[r]-()-[r]-() | r ] AS rs |
Remaining support for repeated relationship variables is removed. |
label:functionality[] label:removed[] WHERE [1,2,3] |
Automatic coercion of a list to a boolean is removed. Replaced by: WHERE NOT isEmpty([1, 2, 3]) |
label:functionality[] label:removed[] distance(n.prop, point({x:0, y:0}) |
Replaced by: point.distance(n.prop, point({x:0, y:0}) |
label:functionality[] label:removed[] point({x:0, y:0}) <= point({x:1, y:1}) <= point({x:2, y:2}) |
The ability to use operators point.withinBBox(point({x:1, y:1}), point({x:0, y:0}), point({x:2, y:2})) |
label:functionality[] label:removed[] USING PERIODIC COMMIT ... |
Replaced by: CALL {
...
} IN TRANSACTIONS |
label:functionality[] label:removed[] CREATE (a {prop:7})-[r:R]->(b {prop: a.prop}) |
It is no longer allowed to have |
label:functionality[] label:removed[] CALL { RETURN 1 } |
Unaliased expressions are no longer supported in subquery CALL { RETURN 1 AS one } |
label:functionality[] label:removed[] MATCH (a) RETURN (a)--() |
Pattern expressions producing lists of paths are no longer supported, but they can still be used as existence predicates, for example in MATCH (a) RETURN [p=(a)--() | p] |
label:functionality[] label:removed[] MATCH (n) RETURN n.propertyName_1, n.propertyName_2 + count(*) |
Implied grouping keys are no longer supported. Only expressions that do not contain aggregations are still considered grouping keys. In expressions that contain aggregations, the leaves must be either:
|
Feature | Details |
---|---|
label:functionality[] label:deprecated[] MATCH (n)-[r:REL]->(m) SET n=r |
Use the MATCH (n)-[r:REL]->(m) SET n=properties(r) |
label:functionality[] label:deprecated[] MATCH (a), (b), allShortestPaths((a)-[r]->(b)) RETURN b
MATCH (a), (b), shortestPath((a)-[r]->(b)) RETURN b |
MATCH (a), (b), shortestPath((a)-[r*1..1]->(b)) RETURN b |
label:functionality[] label:deprecated[] CREATE DATABASE databaseName.withDot ... |
Creating a database with dots in the name has been deprecated, instead quote the database name using backticks: CREATE DATABASE `databaseName.withDot` ... |
label:functionality[] label:deprecated[] ()-[:A|:B]->() |
Replaced by: ()-[:A|B]->() |
Feature | Details | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
label:functionality[] label:updated[] CREATE INDEX ... |
The default index type is changed from B-tree to range index. |
|||||||||||||||
label:functionality[] label:updated[] SHOW INDEXES |
The new column |
|||||||||||||||
label:functionality[] label:updated[] SHOW CONSTRAINTS |
The new column |
|||||||||||||||
label:functionality[] label:updated[] SHOW TRANSACTIONS YIELD * |
New columns for the current query are added:
These columns are only returned in the full set (with |
|||||||||||||||
label:functionality[] label:updated[] TERMINATE TRANSACTIONS transaction-id[,...]
YIELD { * | field[, ...] }
[ORDER BY field[, ...]]
[SKIP n]
[LIMIT n]
[WHERE expression]
[RETURN field[, ...] [ORDER BY field[, ...]] [SKIP n] [LIMIT n]] |
Terminate transaction now allows |
|||||||||||||||
label:functionality[] label:updated[] SHOW TRANSACTIONS [transaction-id[,...]] TERMINATE TRANSACTIONS transaction-id[,...] |
|
|||||||||||||||
label:functionality[] label:updated[] SHOW TRANSACTIONS [transaction-id[,...]]
YIELD field[, ...]
[ORDER BY field[, ...]]
[SKIP n]
[LIMIT n]
[WHERE expression]
TERMINATE TRANSACTIONS transaction-id[,...]
YIELD field[, ...]
[ORDER BY field[, ...]]
[SKIP n]
[LIMIT n]
[WHERE expression]
RETURN field[, ...]
[ORDER BY field[, ...]]
[SKIP n]
[LIMIT n] |
The When the command is not in standalone mode, the
|
|||||||||||||||
label:functionality[] label:updated[] GRANT EXECUTE BOOSTED PROCEDURE ...
GRANT EXECUTE BOOSTED FUNCTION ... |
Not a syntax change but a semantic one.
The |
|||||||||||||||
label:functionality[] label:updated[] [GRANT|DENY] [IMMUTABLE] ... |
Privileges can be specified as |
|||||||||||||||
label:functionality[] label:updated[] REVOKE [IMMUTABLE] ... |
|
|||||||||||||||
label:functionality[] label:updated[] SHOW DATABASES |
Changes to the default columns in the result:
The following columns have been added to the full result set (with
|
|||||||||||||||
label:functionality[] label:updated[] MATCH (n)
RETURN
CASE n.prop
WHEN null THEN 'one'
ELSE 'two'
END |
Previously, if This is a semantic change only.
Since If matching on MATCH (n)
RETURN
CASE
WHEN n.prop IS NULL THEN 'one'
ELSE 'two'
END |
|||||||||||||||
label:functionality[] label:updated[] RETURN round(val, precision) |
Rounding infinity and NaN values will now return the original value instead of returning an integer approximation for precision 0 and throwing an exception for precision > 0:
To get an integer value use the |
|||||||||||||||
label:functionality[] label:updated[] CREATE [OR REPLACE] ALIAS compositeDatabase.aliasName ...
ALTER ALIAS compositeDatabase.aliasName
DROP ALIAS compositeDatabase.aliasName |
The alias commands can now handle aliases in composite databases. |
|||||||||||||||
label:functionality[] label:updated[] SHOW ALIAS[ES] aliasName FOR DATABASE[S]
SHOW ALIAS[ES] compositeDatabase.aliasName FOR DATABASE[S] |
|
|||||||||||||||
label:functionality[] label:updated[] CREATE [OR REPLACE] ALIAS compositeDatabase.aliasName ...
ALTER ALIAS compositeDatabase.aliasName
DROP ALIAS compositeDatabase.aliasName |
The alias commands can now handle aliases in composite databases. |
|||||||||||||||
label:functionality[] label:updated[] SHOW ALIAS[ES] aliasName FOR DATABASE[S]
SHOW ALIAS[ES] compositeDatabase.aliasName FOR DATABASE[S] |
|
Feature | Details |
---|---|
label:functionality[] label:new[] CREATE [OR REPLACE] COMPOSITE DATABASE databaseName [IF NOT EXISTS] [WAIT [n [SEC[OND[S]]]]|NOWAIT]
DROP COMPOSITE DATABASE databaseName [IF EXISTS] [DUMP DATA | DESTROY DATA] [WAIT [n [SEC[OND[S]]]]|NOWAIT] |
New Cypher command for creating and dropping composite databases. |
label:functionality[]
label:new[] CREATE COMPOSITE DATABASE
DROP COMPOSITE DATABASE
COMPOSITE DATABASE MANAGEMENT |
New privileges that allow a user to |
label:functionality[] label:new[] 1_000_000, 0x_FF_FF, 0o_88_88 |
Cypher now supports number literals with underscores between digits. |
label:functionality[] label:new[] isNaN(n.prop) |
New function which returns whether the given number is |
label:functionality[] label:new[] NaN, Inf, Infinity |
Cypher now supports float literals for the values |
label:functionality[] label:new[] COUNT { (n) WHERE n.foo = "bar" } |
New expression which returns the number of results of a subquery. |
label:functionality[] label:new[] CREATE DATABASE ... TOPOLOGY n PRIMAR{Y|IES} [m SECONDAR{Y|IES}] |
New sub-clause for |
label:functionality[] label:new[] ALTER DATABASE ... SET TOPOLOGY n PRIMAR{Y|IES} [m SECONDAR{Y|IES}] |
New sub-clause for |
label:functionality[] label:new[] ENABLE SERVER ... |
New Cypher command for enabling servers. |
label:functionality[] label:new[] ALTER SERVER ... SET OPTIONS ... |
New Cypher command for setting options for a server. |
label:functionality[] label:new[] RENAME SERVER ... TO ... |
New Cypher command for changing the name of a server. |
label:functionality[] label:new[] REALLOCATE DATABASES |
New Cypher command for re-balancing what servers host which databases. |
label:functionality[] label:new[] DEALLOCATE DATABASE[S] FROM SERVER[S] ... |
New Cypher command for moving all databases from servers. |
label:functionality[] label:new[] DROP SERVER ... |
New Cypher command for dropping servers. |
label:functionality[] label:new[] SHOW SERVERS |
New Cypher command for listing servers. |
label:functionality[]
label:new[] SERVER MANAGEMENT SHOW SERVERS |
New privileges that allow a user to create, modify, reallocate, deallocate, drop and list servers. |
label:functionality[] label:new[] MATCH (n: A&(B|C)&!D) |
New concise syntax for expressing predicates for which labels a node may have, referred to as label expression. |
label:functionality[] label:new[] MATCH ()-[r:(!A&!B)]->() |
New concise syntax for expressing predicates for which relationship types a relationship may have, referred to as relationship type expression. |
label:functionality[] label:new[] MATCH ()-[r:R {prop1: 42} WHERE r.prop2 > 42]->() |
New syntax that enables inlining of |
Feature | Details |
---|---|
label:functionality[] label:deprecated[] MATCH (n) RETURN n.propertyName_1, n.propertyName_2 + count(*) |
Implied grouping keys are deprecated. Only expressions that do not contain aggregations are still considered grouping keys. In expressions that contain aggregations, the leaves must be either:
|
label:syntax[] label:deprecated[] USING PERIODIC COMMIT ... |
Replaced by: CALL {
...
} IN TRANSACTIONS |
label:syntax[] label:deprecated[] CREATE (a {prop:7})-[r:R]->(b {prop: a.prop}) |
|
label:syntax[] label:deprecated[] CREATE CONSTRAINT ON ... ASSERT ... |
Replaced by: CREATE CONSTRAINT FOR ... REQUIRE ... |
label:functionality[] label:deprecated[] CREATE BTREE INDEX ... |
B-tree indexes are deprecated. B-tree indexes used for string queries are replaced by: CREATE TEXT INDEX ... B-tree indexes used for spatial queries are replaced by: CREATE POINT INDEX ... B-tree indexes used for general queries or property value types are replaced by: CREATE RANGE INDEX ... These new indexes may be combined for multiple use cases. |
label:functionality[] label:deprecated[] CREATE INDEX
...
OPTIONS "{" btree-option: btree-value[, ...] "}" |
|
label:functionality[] label:deprecated[] SHOW BTREE INDEXES |
B-tree indexes are deprecated. Replaced by: SHOW {POINT | RANGE | TEXT} INDEXES |
label:functionality[] label:deprecated[] USING BTREE INDEX |
B-tree indexes are deprecated. Replaced by: USING {POINT | RANGE | TEXT} INDEX |
label:functionality[] label:deprecated[] CREATE CONSTRAINT
...
OPTIONS "{" btree-option: btree-value[, ...] "}" |
Node key and property uniqueness constraints with B-tree options are deprecated. Replaced by: CREATE CONSTRAINT
...
OPTIONS "{" range-option: range-value[, ...] "}" Constraints used for string properties will also require an additional text index to cover the string queries properly. Constraints used for point properties will also require an additional point index to cover the spatial queries properly. |
label:functionality[] label:deprecated[] distance(n.prop, point({x:0, y:0}) |
Replaced by: point.distance(n.prop, point({x:0, y:0}) |
label:functionality[] label:deprecated[] point({x:0, y:0}) <= point({x:1, y:1}) <= point({x:2, y:2}) |
The ability to use the inequality operators point.withinBBox(point({x:1, y:1}), point({x:0, y:0}), point({x:2, y:2})) |
label:functionality[] label:deprecated[] MATCH (n)
RETURN
CASE n.prop
WHEN null THEN 'one'
ELSE 'two'
END |
Currently, if Please use MATCH (n)
RETURN
CASE
WHEN n.prop IS NULL THEN 'one'
ELSE 'two'
END |
Feature | Details |
---|---|
label:functionality[] label:new[] CALL {
...
} IN TRANSACTIONS |
New clause for evaluating a subquery in separate transactions. Typically used when modifying or importing large amounts of data. See CALL { ... } IN TRANSACTIONS. |
label:syntax[] label:new[] CREATE CONSTRAINT FOR ... REQUIRE ... |
New syntax for creating constraints, applicable to all constraint types. |
label:functionality[] label:new[] CREATE CONSTRAINT [constraint_name] [IF NOT EXISTS]
FOR (n:LabelName)
REQUIRE (n.propertyName_1, …, n.propertyName_n) IS UNIQUE
[OPTIONS "{" option: value[, ...] "}"] |
Property uniqueness constraints now allow multiple properties, ensuring that the combination of property values are unique. |
label:functionality[] label:new[] label:deprecated[] DROP CONSTRAINT
ON (n:LabelName)
ASSERT (n.propertyName_1, …, n.propertyName_n) IS UNIQUE |
Property uniqueness constraints now allow multiple properties. Replaced by: DROP CONSTRAINT name [IF EXISTS] |
label:syntax[] label:new[] CREATE CONSTRAINT [constraint_name] [IF NOT EXISTS]
FOR ...
REQUIRE ... IS NOT NULL
OPTIONS "{" "}" |
Existence constraints now allow an |
label:functionality[] label:new[] CREATE LOOKUP INDEX [index_name] [IF NOT EXISTS]
FOR ... ON ...
OPTIONS "{" option: value[, ...] "}" |
Token lookup indexes now allow an |
label:functionality[] label:new[] CREATE TEXT INDEX ... |
Allows creating text indexes on nodes or relationships with a particular label or relationship type, and property combination. They can be dropped by using their name. |
label:functionality[] label:new[] CREATE RANGE INDEX ... |
Allows creating range indexes on nodes or relationships with a particular label or relationship type, and properties combination. They can be dropped by using their name. |
label:functionality[] label:new[] CREATE CONSTRAINT
...
OPTIONS "{" indexProvider: 'range-1.0' "}" |
Allows creating node key and property uniqueness constraints backed by range indexes by providing the range index provider in the |
label:functionality[] label:new[] CREATE POINT INDEX ... |
Allows creating point indexes on nodes or relationships with a particular label or relationship type, and property combination. They can be dropped by using their name. |
label:syntax[]
label:new[] IMPERSONATE |
New privilege that allows a user to assume privileges of another one. |
label:functionality[] label:new[] SHOW TRANSACTION[S] [transaction-id[,...]]
[YIELD { * | field[, ...] } [ORDER BY field[, ...]] [SKIP n] [LIMIT n]]
[WHERE expression]
[RETURN field[, ...] [ORDER BY field[, ...]] [SKIP n] [LIMIT n]] |
List transactions on the current server. The This replaces the procedures |
label:functionality[] label:new[] TERMINATE TRANSACTION[S] transaction-id[,...] |
Terminate transactions on the current server. The This replaces the procedures |
label:functionality[] label:new[] ALTER DATABASE ... [IF EXISTS]
SET ACCESS {READ ONLY | READ WRITE} |
New Cypher command for modifying a database by changing its access mode. |
label:functionality[]
label:new[] ALTER DATABASE |
New privilege that allows a user to modify databases. |
label:functionality[]
label:new[] SET DATABASE ACCESS |
New privilege that allows a user to modify database access mode. |
label:functionality[] label:new[] CREATE ALIAS ... [IF NOT EXISTS]
FOR DATABASE ... |
New Cypher command for creating an alias for a database name. Remote aliases are only supported from Neo4j 4.4.8. |
label:functionality[] label:new[] CREATE OR REPLACE ALIAS ...
FOR DATABASE ... |
New Cypher command for creating or replacing an alias for a database name. Remote aliases are only supported from Neo4j 4.4.8. |
label:functionality[] label:new[] ALTER ALIAS ... [IF EXISTS]
SET DATABASE ... |
New Cypher command for altering an alias. Remote aliases are only supported from Neo4j 4.4.8. |
label:functionality[] label:new[] DROP ALIAS ... [IF EXISTS] FOR DATABASE |
New Cypher command for dropping a database alias. |
label:functionality[] label:new[] SHOW ALIASES FOR DATABASE |
New Cypher command for listing database aliases. Only supported since Neo4j 4.4.8. |
label:functionality[]
label:new[] ALIAS MANAGEMENT |
New privilege that allows a user to create, modify, delete and list aliases. Only supported since Neo4j 4.4.8. |
label:functionality[]
label:new[] CREATE ALIAS |
New privilege that allows a user to create aliases. Only supported since Neo4j 4.4.8. |
label:functionality[]
label:new[] ALTER ALIAS |
New privilege that allows a user to modify aliases. Only supported since Neo4j 4.4.8. |
label:functionality[]
label:new[] DROP ALIAS |
New privilege that allows a user to delete aliases. Only supported since Neo4j 4.4.8. |
label:functionality[]
label:new[] SHOW ALIAS |
New privilege that allows a user to show aliases. Only supported since Neo4j 4.4.8. |
label:syntax[] label:new[] MATCH (n:N {prop1: 42} WHERE n.prop2 > 42) |
New syntax that enables inlining of |
Feature | Details |
---|---|
label:syntax[] label:deprecated[] CREATE CONSTRAINT [name]
ON (node:Label)
ASSERT exists(node.property) |
Replaced by: CREATE CONSTRAINT [name]
ON (node:Label)
ASSERT node.property IS NOT NULL |
label:syntax[] label:deprecated[] CREATE CONSTRAINT [name]
ON ()-[rel:REL]-()
ASSERT exists(rel.property) |
Replaced by: CREATE CONSTRAINT [name]
ON ()-[rel:REL]-()
ASSERT rel.property IS NOT NULL |
label:syntax[] label:deprecated[] exists(prop) |
Replaced by: prop IS NOT NULL |
label:syntax[] label:deprecated[] NOT exists(prop) |
Replaced by: prop IS NULL |
label:syntax[]
label:deprecated[] |
Replaced by default output columns. |
label:syntax[]
label:deprecated[] |
Replaced by: YIELD * |
label:syntax[] label:deprecated[] SHOW EXISTS CONSTRAINTS |
Replaced by: SHOW [PROPERTY] EXIST[ENCE] CONSTRAINTS Still allows |
label:syntax[] label:deprecated[] SHOW NODE EXISTS CONSTRAINTS |
Replaced by: SHOW NODE [PROPERTY] EXIST[ENCE] CONSTRAINTS Still allows |
label:syntax[] label:deprecated[] SHOW RELATIONSHIP EXISTS CONSTRAINTS |
Replaced by: SHOW RELATIONSHIP [PROPERTY] EXIST[ENCE] CONSTRAINTS Still allows |
label:syntax[]
label:deprecated[] ON DEFAULT DATABASE |
Replaced by: ON HOME DATABASE |
label:syntax[]
label:deprecated[] ON DEFAULT GRAPH |
Replaced by: ON HOME GRAPH |
label:syntax[] label:deprecated[] MATCH (a) RETURN (a)--() |
Pattern expressions producing lists of paths are deprecated, but they can still be used as existence predicates, for example in MATCH (a) RETURN [p=(a)--() | p] |
Feature | Details |
---|---|
label:functionality[] label:updated[] SHOW INDEXES WHERE ... |
Now allows filtering for: SHOW INDEXES |
label:functionality[] label:updated[] SHOW CONSTRAINTS WHERE ... |
Now allows filtering for: SHOW CONSTRAINTS |
label:functionality[] label:updated[] SHOW INDEXES YIELD ...
[WHERE ...]
[RETURN ...] |
Now allows |
label:functionality[] label:updated[] SHOW CONSTRAINTS YIELD ...
[WHERE ...]
[RETURN ...] |
Now allows |
label:syntax[] label:updated[] SHOW [PROPERTY] EXIST[ENCE] CONSTRAINTS |
New syntax for filtering |
label:syntax[] label:updated[] SHOW NODE [PROPERTY] EXIST[ENCE] CONSTRAINTS |
New syntax for filtering |
label:syntax[] label:updated[] SHOW REL[ATIONSHIP] [PROPERTY] EXIST[ENCE] CONSTRAINTS |
New syntax for filtering |
label:functionality[] label:updated[] SHOW FULLTEXT INDEXES |
Now allows easy filtering for |
label:functionality[] label:updated[] SHOW LOOKUP INDEXES |
Now allows easy filtering for |
Feature | Details |
---|---|
label:syntax[] label:new[] CREATE DATABASE ...
[OPTIONS {...}] |
New syntax to pass options to |
label:syntax[] label:new[] CREATE CONSTRAINT [name]
ON (node:Label)
ASSERT node.property IS NOT NULL |
New syntax for creating node property existence constraints. |
label:syntax[] label:new[] CREATE CONSTRAINT [name]
ON ()-[rel:REL]-()
ASSERT rel.property IS NOT NULL |
New syntax for creating relationship property existence constraints. |
label:syntax[] label:new[] ALTER USER name IF EXISTS ... |
Makes altering users idempotent. If the specified name does not exists, no error is thrown. |
label:syntax[] label:new[] ALTER USER ...
SET HOME DATABASE ... |
Now allows setting home database for user. |
label:syntax[] label:new[] ALTER USER ...
REMOVE HOME DATABASE |
Now allows removing home database for user. |
label:syntax[] label:new[] CREATE USER ...
SET HOME DATABASE ... |
|
label:syntax[] label:new[] SHOW HOME DATABASE |
New syntax for showing the home database of the current user. |
label:syntax[]
label:new[] SET USER HOME DATABASE |
New Cypher command for administering privilege for changing users home database. |
label:syntax[]
label:new[] ON HOME DATABASE |
New syntax for privileges affecting home database. |
label:syntax[]
label:new[] ON HOME GRAPH |
New syntax for privileges affecting home graph. |
label:syntax[] label:new[] CREATE FULLTEXT INDEX ... |
Allows creating fulltext indexes on nodes or relationships. They can be dropped by using their name. |
label:functionality[] label:new[] CREATE INDEX FOR ()-[r:TYPE]-() ... |
Allows creating indexes on relationships with a particular relationship type and property combination. They can be dropped by using their name. |
label:functionality[] label:new[] CREATE LOOKUP INDEX ... |
Create token lookup index for nodes with any labels or relationships with any relationship type. They can be dropped by using their name. |
label:functionality[] label:new[] RENAME ROLE |
New Cypher command for changing the name of a role. |
label:functionality[] label:new[] RENAME USER |
New Cypher command for changing the name of a user. |
label:functionality[] label:new[] SHOW PROCEDURE[S]
[EXECUTABLE [BY {CURRENT USER | username}]]
[YIELD ...]
[WHERE ...]
[RETURN ...] |
New Cypher commands for listing procedures. |
label:functionality[] label:new[] SHOW [ALL | BUILT IN | USER DEFINED] FUNCTION[S]
[EXECUTABLE [BY {CURRENT USER | username}]]
[YIELD ...]
[WHERE ...]
[RETURN ...] |
New Cypher commands for listing functions. |
Feature | Details |
---|---|
label:syntax[] label:deprecated[] 0... |
Replaced by |
label:syntax[] label:deprecated[] 0X... |
Only |
label:syntax[] label:deprecated[] CALL { RETURN 1 } |
Unaliased expressions are deprecated in subquery CALL { RETURN 1 AS one } |
Feature | Details |
---|---|
label:functionality[] label:updated[] SHOW ROLE name PRIVILEGES |
Can now handle multiple roles. SHOW ROLES n1, n2, ... PRIVILEGES |
label:functionality[] label:updated[] SHOW USER name PRIVILEGES |
Can now handle multiple users. SHOW USERS n1, n2, ... PRIVILEGES |
label:functionality[] label:updated[] round(expression, precision) |
The |
label:functionality[] label:updated[] round(expression, precision, mode) |
The |
Feature | Details |
---|---|
label:functionality[] label:new[] SHOW PRIVILEGES [AS [REVOKE] COMMAND[S]] |
Privileges can now be shown as Cypher commands. |
label:syntax[] label:new[] DEFAULT GRAPH |
New optional part of the Cypher commands for database privileges. |
label:syntax[] label:new[] 0o... |
Cypher now interprets literals with prefix |
label:syntax[] label:new[] SET [PLAINTEXT | ENCRYPTED] PASSWORD |
For |
label:functionality[]
label:new[] EXECUTE |
New Cypher commands for administering privileges for executing procedures and user defined functions.
See The DBMS |
label:syntax[] label:new[] CREATE [BTREE] INDEX ... [OPTIONS {...}] |
Allows setting index provider and index configuration when creating an index. |
label:syntax[] label:new[] CREATE CONSTRAINT ... IS NODE KEY [OPTIONS {...}] |
Allows setting index provider and index configuration for the backing index when creating a node key constraint. |
label:syntax[] label:new[] CREATE CONSTRAINT ... IS UNIQUE [OPTIONS {...}] |
Allows setting index provider and index configuration for the backing index when creating a property uniqueness constraint. |
label:syntax[] label:new[] SHOW CURRENT USER |
New Cypher command for showing current logged-in user and roles. |
label:functionality[] label:new[] SHOW [ALL | BTREE] INDEX[ES] [BRIEF | VERBOSE [OUTPUT]] |
New Cypher commands for listing indexes. Replaces the procedures |
label:functionality[] label:new[] SHOW [ALL | UNIQUE | NODE EXIST[S] | RELATIONSHIP EXIST[S] | EXIST[S] | NODE KEY] CONSTRAINT[S] [BRIEF | VERBOSE [OUTPUT]] |
New Cypher commands for listing constraints. Replaces the procedures |
label:functionality[]
label:new[] SHOW INDEX |
New Cypher command for administering privilege for listing indexes. |
label:functionality[]
label:new[] SHOW CONSTRAINTS |
New Cypher command for administering privilege for listing constraints. |
Feature | Details |
---|---|
label:syntax[] label:new[] CREATE INDEX [name] IF NOT EXISTS FOR ... |
Makes index creation idempotent. If an index with the name or schema already exists no error will be thrown. |
label:syntax[] label:new[] DROP INDEX name IF EXISTS |
Makes index deletion idempotent. If no index with the name exists no error will be thrown. |
label:syntax[] label:new[] CREATE CONSTRAINT [name] IF NOT EXISTS ON ... |
Makes constraint creation idempotent. If a constraint with the name or type and schema already exists no error will be thrown. |
label:syntax[] label:new[] DROP CONSTRAINT name IF EXISTS |
Makes constraint deletion idempotent. If no constraint with the name exists no error will be thrown. |
Feature | Details |
---|---|
label:functionality[] label:restricted[] REVOKE ... |
No longer revokes sub-privileges when revoking a compound privilege, e.g. when revoking |
label:functionality[] label:restricted[] ALL DATABASE PRIVILEGES |
No longer includes the privileges |
Feature | Details |
---|---|
label:procedure[] label:updated[] queryId |
The |
label:functionality[] label:updated[] SHOW PRIVILEGES |
The returned privileges are a closer match to the original grants and denies, e.g. if granted |
Feature | Details |
---|---|
label:functionality[]
label:new[] PUBLIC |
The |
label:syntax[]
label:new[] REVOKE MATCH |
The |
label:functionality[] label:new[] SHOW USERS |
New support for |
label:functionality[] label:new[] SHOW ROLES |
New support for |
label:functionality[] label:new[] SHOW DATABASES |
New support for |
label:functionality[]
label:new[] |
New Cypher commands for administering transaction management. |
label:functionality[]
label:new[] |
New Cypher commands for administering user management. |
label:functionality[]
label:new[] |
New Cypher commands for administering database management. |
label:functionality[]
label:new[] |
New Cypher commands for administering privilege management. |
label:functionality[] label:new[] ALL DBMS PRIVILEGES |
New Cypher command for administering role, user, database and privilege management. |
label:functionality[] label:new[] ALL GRAPH PRIVILEGES |
New Cypher command for administering read and write privileges. |
label:functionality[]
label:new[] |
New Cypher commands for administering write privileges. |
label:functionality[] label:new[] ON DEFAULT DATABASE |
New optional part of the Cypher commands for database privileges. |
Feature | Details |
---|---|
label:function[] label:removed[] rels() |
Replaced by relationships(). |
label:function[] label:removed[] toInt() |
Replaced by toInteger(). |
label:function[] label:removed[] lower() |
Replaced by toLower(). |
label:function[] label:removed[] upper() |
Replaced by toUpper(). |
label:function[] label:removed[] extract() |
Replaced by list comprehension. |
label:function[] label:removed[] filter() |
Replaced by list comprehension. |
label:functionality[]
label:removed[] CYPHER planner=rule |
The |
label:functionality[]
label:removed[] |
The removal of the |
label:functionality[]
label:removed[] CYPHER runtime=compiled |
Replaced by the new |
label:clause[] label:removed[] CREATE UNIQUE |
Running queries with this clause will cause a syntax error. |
label:clause[] label:removed[] START |
Running queries with this clause will cause a syntax error. |
label:syntax[] label:removed[] MATCH (n)-[:A|:B|:C {foo: 'bar'}]-() RETURN n |
Replaced by |
label:syntax[] label:removed[] MATCH (n)-[x:A|:B|:C]-() RETURN n |
Replaced by |
label:syntax[] label:removed[] MATCH (n)-[x:A|:B|:C*]-() RETURN n |
Replaced by |
label:syntax[] label:removed[] {parameter} |
Replaced by $parameter. |
Feature | Details |
---|---|
label:syntax[] label:deprecated[] MATCH (n)-[rs*]-() RETURN rs |
As in Cypher 3.2, this is replaced by: MATCH p=(n)-[*]-() RETURN relationships(p) AS rs |
label:syntax[] label:deprecated[] CREATE INDEX ON :Label(prop) |
Replaced by |
label:syntax[] label:deprecated[] DROP INDEX ON :Label(prop) |
Replaced by |
label:syntax[] label:deprecated[] DROP CONSTRAINT ON (n:Label) ASSERT (n.prop) IS NODE KEY |
Replaced by |
label:syntax[] label:deprecated[] DROP CONSTRAINT ON (n:Label) ASSERT (n.prop) IS UNIQUE |
Replaced by |
label:syntax[] label:deprecated[] DROP CONSTRAINT ON (n:Label) ASSERT exists(n.prop) |
Replaced by |
label:syntax[] label:deprecated[] DROP CONSTRAINT ON ()-[r:Type]-() ASSERT exists(r.prop) |
Replaced by |
Feature | Details |
---|---|
label:function[] label:restricted[] length() |
Restricted to only work on paths. See length() for more details. |
label:function[] label:restricted[] size() |
Only works for strings, lists and pattern comprehensions, and no longer works for paths.
For versions above 5.0, use a RETURN COUNT { (a)-[]->(b) } For versions below 5.0, use a pattern comprehension instead: RETURN size([ (a)-[]->(b) | a ]) See size() and Count Subqueries for more details. |
Feature | Details |
---|---|
label:syntax[] label:extended[] CREATE CONSTRAINT [name] ON ... |
The create constraint syntax can now include a name. The |
Feature | Details |
---|---|
label:functionality[]
label:new[] CYPHER runtime=pipelined |
This Neo4j Enterprise Edition only feature involves a new runtime that has many performance enhancements. |
label:functionality[]
label:new[] |
New Cypher commands for administering multiple databases. |
label:functionality[]
label:new[] |
New Cypher commands for administering role-based access control. |
label:functionality[]
label:new[] |
New Cypher commands for administering dbms, database, graph and sub-graph access control. |
label:syntax[] label:new[] CREATE INDEX [name] FOR (n:Label) ON (n.prop) |
New syntax for creating indexes, which can include a name. Replaces the |
label:syntax[] label:new[] DROP INDEX name |
New command for dropping an index by name. |
label:syntax[] label:new[] DROP CONSTRAINT name |
New command for dropping a constraint by name, no matter the type. |
label:clause[] label:new[] WHERE EXISTS {...} |
|
label:clause[] label:new[] USE neo4j |
New clause to specify which graph a query, or query part, is executed against. |
Feature | Details |
---|---|
label:functionality[]
label:deprecated[] CYPHER runtime=compiled |
The compiled runtime will be discontinued in the next major release. It might still be used for default queries in order to not cause regressions, but explicitly requesting it will not be possible. |
label:function[] label:deprecated[] extract() |
Replaced by list comprehension. |
label:function[] label:deprecated[] filter() |
Replaced by list comprehension. |
Feature | Type | Change | Details |
---|---|---|---|
Functionality |
Amendment |
A point — irrespective of which Coordinate Reference System is used — can be stored as a property and is able to be backed by an index. Prior to this, a point was a virtual property only. |
|
Function |
Added |
||
Function |
Added |
||
Function |
Added |
||
Functionality |
Added |
Supports storing, indexing and working with the following temporal types: Date, Time, LocalTime, DateTime, LocalDateTime and Duration. |
|
Functionality |
Added |
Functions allowing for the creation and manipulation of values for each temporal type — Date, Time, LocalTime, DateTime, LocalDateTime and Duration. |
|
Functionality |
Added |
Operators allowing for the manipulation of values for each temporal type — Date, Time, LocalTime, DateTime, LocalDateTime and Duration. |
|
Function |
Extended |
Now also allows temporal values as input (i.e. values of type Date, Time, LocalTime, DateTime, LocalDateTime or Duration). |
Feature | Type | Change | Details |
---|---|---|---|
|
Clause |
Removed |
As in Cypher 3.2, any queries using the |
|
Functionality |
Added |
Neo4j Enterprise Edition only |
Function |
Extended |
Now also supports aggregation over sets containing lists of strings and/or numbers, as well as over sets containing strings, numbers, and lists of strings and/or numbers |
Feature | Type | Change | Details |
---|---|---|---|
|
Functionality |
Removed |
All queries now use the cost planner. Any query prepended thus will fall back to using Cypher 3.1. |
|
Clause |
Removed |
Running such queries will fall back to using Cypher 3.1 (and use the rule planner) |
|
Clause |
Removed |
Running such queries will fall back to using Cypher 3.1 (and use the rule planner) |
|
Syntax |
Deprecated |
Replaced by |
|
Syntax |
Deprecated |
Replaced by |
|
Syntax |
Deprecated |
Replaced by |
|
Syntax |
Deprecated |
Replaced by |
Functionality |
Added |
||
Index |
Added |
||
Index |
Added |
Neo4j Enterprise Edition only |
|
|
Functionality |
Added |
Neo4j Enterprise Edition only |
Function |
Extended |
Now also allows a list as input |
|
Function |
Extended |
Now also supports aggregation over a set containing both strings and numbers |
Feature | Type | Change | Details |
---|---|---|---|
|
Function |
Deprecated |
Replaced by relationships() |
|
Function |
Deprecated |
Replaced by toInteger() |
|
Function |
Deprecated |
Replaced by toLower() |
|
Function |
Deprecated |
Replaced by toUpper() |
Function |
Added |
||
Syntax |
Added |
||
Syntax |
Added |
||
Functionality |
Added |
||
Clause |
Extended |
Records returned by |
Feature | Type | Change | Details |
---|---|---|---|
|
Function |
Removed |
Replaced by exists() |
|
Function |
Removed |
Replaced by toString() |
|
Syntax |
Deprecated |
Replaced by $parameter |
Function |
Added |
||
Clause |
Added |
||
Function |
Added |
||
Function |
Added |
||
Function |
Added |
||
Functionality |
Added |
||
Function |
Extended |
Now also allows Boolean values as input |