From 5a989791e888e34c5907057a8c5cc74cc40ab2af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Wed, 18 Jun 2025 09:17:55 +0200 Subject: [PATCH 01/72] fix Cypher 25 queries (#1309) --- .../ROOT/images/repeatable-elements-graph.svg | 132 +++++++++--------- modules/ROOT/pages/clauses/use.adoc | 4 +- modules/ROOT/pages/patterns/match-modes.adoc | 11 +- .../composed-queries/sequential-queries.adoc | 2 +- 4 files changed, 76 insertions(+), 73 deletions(-) diff --git a/modules/ROOT/images/repeatable-elements-graph.svg b/modules/ROOT/images/repeatable-elements-graph.svg index f85e06d7f..f3f02d4fb 100644 --- a/modules/ROOT/images/repeatable-elements-graph.svg +++ b/modules/ROOT/images/repeatable-elements-graph.svg @@ -1,48 +1,44 @@ - - + + + + - - - - + - - + + - - - - + + - - - - + + + + - - + @@ -50,16 +46,15 @@ - - - - - - - + + + + + + + - - + @@ -67,17 +62,16 @@ - - - + + + - - - - + + + + - - + @@ -85,14 +79,13 @@ - - - - + + + + - - - + + @@ -100,17 +93,15 @@ - - - + + - - - + + - + - + @@ -119,17 +110,15 @@ - - - - - + + + - + - + - + @@ -139,10 +128,10 @@ - + - + @@ -152,7 +141,16 @@ - + + + + + + + + + + @@ -172,10 +170,16 @@ - - + + + + + + + + diff --git a/modules/ROOT/pages/clauses/use.adoc b/modules/ROOT/pages/clauses/use.adoc index 68799cdfd..69d43792d 100644 --- a/modules/ROOT/pages/clauses/use.adoc +++ b/modules/ROOT/pages/clauses/use.adoc @@ -73,8 +73,8 @@ In subqueries, a `USE` clause may appear directly following the xref:subqueries/ [source, cypher, role=test-setup] ---- CREATE DATABASE myDatabase; -CREATE COMPOSITE DATABASE `myComposite`; -CREATE ALIAS `myComposite`.`myConstituent` FOR DATABASE `myDatabase`; +CREATE COMPOSITE DATABASE myComposite; +CREATE ALIAS myComposite.myConstituent FOR DATABASE myDatabase; ---- //// diff --git a/modules/ROOT/pages/patterns/match-modes.adoc b/modules/ROOT/pages/patterns/match-modes.adoc index 0385bd384..29b283bc6 100644 --- a/modules/ROOT/pages/patterns/match-modes.adoc +++ b/modules/ROOT/pages/patterns/match-modes.adoc @@ -181,11 +181,10 @@ The next example matches paths starting and ending at the same `Location` (`Knei ---- MATCH REPEATABLE ELEMENTS p = (start:Location {name: 'Kneiphof'})-[:BRIDGE]-{,9}(start) // <1> WHERE all(bridge IN range(1,7) WHERE bridge IN [r IN relationships(p) | r.id]) // <2> -WITH p -ORDER BY length(p) -LIMIT 1 RETURN [n IN nodes(p) | n.name] AS visitedLocations, [r IN relationships(p) | r.id] AS crossedBridges +ORDER BY length(p), crossedBridges +LIMIT 1 ---- <1> Paths with a length of less than 9 relationships return no results because they do not allow enough moves to traverse all seven bridges at least once while forming a cycle back to Kneiphof. @@ -196,13 +195,13 @@ RETURN [n IN nodes(p) | n.name] AS visitedLocations, |=== | visitedLocations | crossedBridges -| ["Kneiphof", "South Bank", "Kneiphof", "South Bank", "Lomse", "Kneiphof", "North Bank", "Lomse", "North Bank", "Kneiphof"] -| [4, 6, 4, 3, 7, 5, 2, 2, 1] +| ["Kneiphof", "North Bank", "Kneiphof", "South Bank", "Lomse", "North Bank", "Kneiphof", "South Bank", "Lomse", "Kneiphof"] +| [1, 1, 4, 3, 2, 5, 6, 3, 7] 2+d|Rows: 1 |=== -The order of the bridges traversed in the path returned demonstrates that bridges `2` and `4` were crossed twice in order to return to `Kneiphof`. +The order of the bridges traversed in the path returned demonstrates that bridges `1` and `3` were crossed twice in order to return to `Kneiphof`. image::repeatable-elements-graph.svg[Several graphs showing order of traversals when using repeatable elements match mode, width=600, role=popup] _Sequence of bridge traversals when using `REPEATABLE ELEMENTS`._ diff --git a/modules/ROOT/pages/queries/composed-queries/sequential-queries.adoc b/modules/ROOT/pages/queries/composed-queries/sequential-queries.adoc index 6a0f33ca0..72f714b05 100644 --- a/modules/ROOT/pages/queries/composed-queries/sequential-queries.adoc +++ b/modules/ROOT/pages/queries/composed-queries/sequential-queries.adoc @@ -65,7 +65,7 @@ CREATE (techCorp:Supplier {name: 'TechCorp', email: 'contact@techcorp.com'}), == Syntax .`NEXT` syntax -[source, cypher] +[source, syntax] ---- From 742fc810b2f352500bbdb13c2f9e47a60979abf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Wed, 18 Jun 2025 12:57:22 +0200 Subject: [PATCH 02/72] add xrefs for constraints index page (#1311) --- modules/ROOT/pages/constraints/index.adoc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/ROOT/pages/constraints/index.adoc b/modules/ROOT/pages/constraints/index.adoc index f906e317b..5ae7f1828 100644 --- a/modules/ROOT/pages/constraints/index.adoc +++ b/modules/ROOT/pages/constraints/index.adoc @@ -5,10 +5,10 @@ include::https://raw.githubusercontent.com/neo4j-graphacademy/courses/main/ascii Neo4j offers several constraints to ensure the quality and integrity of data in a graph. The following constraints are available in Neo4j: -* *Property uniqueness constraints* ensure that the combined property values are unique for all nodes with a specific label or all relationships with a specific type. -* *Property existence constraints* ensure that a property exists either for all nodes with a specific label or for all relationships with a specific type. label:enterprise-edition[] -* *Property type constraints* ensure that a property has the required property type for all nodes with a specific label or for all relationships with a specific type. label:enterprise-edition[] -* *Key constraints* ensure that all properties exist and that the combined property values are unique for all nodes with a specific label or all relationships with a specific type.label:enterprise-edition[] +* xref:constraints/managing-constraints.adoc#create-property-uniqueness-constraints[Property uniqueness constraints]: ensure that the combined property values are unique for all nodes with a specific label or all relationships with a specific type. +* xref:constraints/managing-constraints.adoc#create-property-existence-constraints[Property existence constraints]: ensure that a property exists either for all nodes with a specific label or for all relationships with a specific type. label:enterprise-edition[] +* xref:constraints/managing-constraints.adoc#create-property-type-constraints[Property type constraints]: ensure that a property has the required property type for all nodes with a specific label or for all relationships with a specific type. label:enterprise-edition[] +* xref:constraints/managing-constraints.adoc#create-key-constraints[Key constraints]: ensure that all properties exist and that the combined property values are unique for all nodes with a specific label or all relationships with a specific type.label:enterprise-edition[] To learn more about creating, listing, and dropping these constraints, as well as information about index-backed constraints, constraint creation failures and data violation scenarios, and more, see xref:constraints/managing-constraints.adoc[]. From 9c57b8e1aeaa2308c5a89df2c13791af998f8ad6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Wed, 18 Jun 2025 13:39:40 +0200 Subject: [PATCH 03/72] match modes and NEXT cheat sheet tags (#1310) Co-authored-by: Richard Sill <156673635+rsill-neo4j@users.noreply.github.com> --- modules/ROOT/pages/patterns/match-modes.adoc | 4 ++++ .../queries/composed-queries/sequential-queries.adoc | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/modules/ROOT/pages/patterns/match-modes.adoc b/modules/ROOT/pages/patterns/match-modes.adoc index 29b283bc6..57b941c34 100644 --- a/modules/ROOT/pages/patterns/match-modes.adoc +++ b/modules/ROOT/pages/patterns/match-modes.adoc @@ -115,11 +115,13 @@ _In the `samplePath` with a length of `6` returned by `DIFFERENT RELATIONSHIPS`, However, if the relationship count is increased to `7`, `0` paths are returned. .Find paths with a length of 7 relationships +// tag::patterns_match_modes_different_relationships[] [source, cypher] ---- MATCH p = (:Location {name: 'Kneiphof'})--{7}() RETURN count(p) AS pathCount ---- +// end::patterns_match_modes_different_relationships[] .Result [role="queryresult",options="header,footer",cols="1*(p:Product {name: 'Chocolate'}) @@ -119,6 +120,7 @@ NEXT RETURN customer.firstName AS chocolateCustomer, product.price * (1 - customer.discount) AS chocolatePrice ---- +// end::sequential_queries_basic_example[] .Result [role="queryresult",options="header,footer",cols="2*(:Product)<-[:SUPPLIES]-(s:Supplier) @@ -227,6 +233,7 @@ WHEN size(personalities) > 1 THEN ELSE RETURN customer, personalities[0] AS personality ---- +// end::sequential_queries_chaining_conditional_queries[] .Result [role="queryresult",options="header,footer",cols="2*(p:Product) @@ -273,6 +281,7 @@ ELSE { RETURN customer.firstName AS customer, "club below 1000" AS customerType, finalSum AS sum } ---- +// end::sequential_queries_in_conditional_queries[] .Result [role="queryresult",options="header,footer",cols="3* Date: Wed, 18 Jun 2025 14:46:46 +0200 Subject: [PATCH 04/72] List removed, deprecated, new options of the CREATE db cmd (#1312) Co-authored-by: Reneta Popova --- ...ions-additions-removals-compatibility.adoc | 50 +++++++++++++++++++ package-lock.json | 4 +- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc index 576efb774..59798c060 100644 --- a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc +++ b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc @@ -30,6 +30,27 @@ Features removed in Cypher 25 are still available on Neo4j 2025.06+ databases ei | Feature | Details +a| +label:functionality[] +label:removed[] +[source, cypher, role="noheader"] +---- +CREATE DATABASE db OPTIONS { seedCredentials: ... } +---- +| The option `seedCredentials` is removed from the `CREATE DATABASE` `OPTIONS` map. +For more information, see link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/standard-databases/create-databases/#manage-databases-create-database-options[Operations Manual -> Database administration -> Create databases]. + +a| +label:functionality[] +label:removed[] +[source, cypher, role="noheader"] +---- +CREATE DATABASE db OPTIONS { existingDataSeedInstance: ... } +---- +| The option `existingDataSeedInstance` is removed from the `CREATE DATABASE` `OPTIONS` map and replaced by `existingDataSeedServer`. +For more information, see link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/standard-databases/create-databases/#manage-databases-create-database-options[Operations Manual -> Database administration -> Create databases]. + + a| label:functionality[] label:removed[] @@ -138,6 +159,25 @@ For more information, see the link:{neo4j-docs-base-uri}/operations-manual/curre |=== +=== Deprecated in Cypher 25 + +[cols="2", options="header"] +|=== +| Feature +| Details + +a| +label:functionality[] +label:deprecated[] +[source, cypher, role="noheader"] +---- +CREATE DATABASE db OPTIONS { existingData: ... } +---- +| The option `existingData` is deprecated. +For more information, see link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/standard-databases/create-databases/#manage-databases-create-database-options[Operations Manual -> Database administration -> Create databases]. + +|=== + === Updated in Cypher 25 @@ -360,6 +400,16 @@ CREATE DATABASE db OPTIONS { seedRestoreUntil: ... } This allows a database to be seeded up to a specific date or transaction ID. For more information, see link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/standard-databases/seed-from-uri/[Operations Manual -> Database administration -> Create a database from a URI]. +a| +label:functionality[] +label:new[] +[source, cypher, role="noheader"] +---- +CREATE DATABASE db OPTIONS { seedSourceDatabase: ... } +---- +| You can specify the name of a source database if the `seedURI` points to a folder containing backups for multiple databases. +For more information, see link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/standard-databases/create-databases/#manage-databases-create-database-options[Operations Manual -> Database administration -> Create databases]. + a| label:functionality[] label:new[] diff --git a/package-lock.json b/package-lock.json index e2fe81617..9d9055cee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cypher-manual", - "version": "5.0.0", + "version": "25", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "cypher-manual", - "version": "5.0.0", + "version": "25", "license": "ISC", "dependencies": { "@antora/cli": "^3.1.9", From e509773297beca26aed9f88e17b76ac1df8762ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Thu, 19 Jun 2025 14:05:24 +0200 Subject: [PATCH 05/72] Add missing Cypher 25 updates (GQL extended identifiers + subqeury expression change) (#1313) --- .../pages/appendix/gql-conformance/index.adoc | 2 +- .../gql-conformance/supported-mandatory.adoc | 4 +- ...ions-additions-removals-compatibility.adoc | 66 ++++++++++++++----- modules/ROOT/pages/syntax/parameters.adoc | 4 +- 4 files changed, 53 insertions(+), 23 deletions(-) diff --git a/modules/ROOT/pages/appendix/gql-conformance/index.adoc b/modules/ROOT/pages/appendix/gql-conformance/index.adoc index b269905ad..718d85745 100644 --- a/modules/ROOT/pages/appendix/gql-conformance/index.adoc +++ b/modules/ROOT/pages/appendix/gql-conformance/index.adoc @@ -1,7 +1,7 @@ :description: Overview of Cypher's conformance to GQL. = GQL conformance -*Last updated*: 2 June 2025 + +*Last updated*: 18 June 2025 + *Neo4j version*: 2025.06 GQL is the new link:https://www.iso.org/home.html[ISO] International Standard query language for graph databases. diff --git a/modules/ROOT/pages/appendix/gql-conformance/supported-mandatory.adoc b/modules/ROOT/pages/appendix/gql-conformance/supported-mandatory.adoc index 12bfb44a1..f76c5ca04 100644 --- a/modules/ROOT/pages/appendix/gql-conformance/supported-mandatory.adoc +++ b/modules/ROOT/pages/appendix/gql-conformance/supported-mandatory.adoc @@ -211,10 +211,8 @@ In Cypher, `trim()` removes any whitespace character. | 21.1 | Names and variables | xref:syntax/index.adoc[] -| Cypher supports GQL’s lexical elements, with the following caveats: +| Cypher supports GQL’s lexical elements, with the following caveat: -* GQL allows for extended parameter identifiers. -For example: `RETURN $0hello` is allowed in GQL but not Cypher. * GQL allows identifiers that are not variables to be delimited with both backticks and quotes. Cypher only allows backticks. For example: `MATCH (n) RETURN n."a prop"` is allowed in GQL but not Cypher. diff --git a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc index 59798c060..61354701b 100644 --- a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc +++ b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc @@ -59,10 +59,10 @@ label:removed[] RETURN 1 as my\u0085identifier ---- a| -The Unicode character \`\u0085` has been removed for unescaped identifiers and is now considered a whitespace character. -To continue using it, escape the identifier by adding backticks around it. +The Unicode character `\u0085` (`Next Line`) has been removed for unescaped identifiers and is now considered a whitespace character. +To continue using it, escape the identifier by adding backticks (++``++) around it. This applies to all unescaped identifiers in Cypher, such as label expressions, properties, variable names, or parameters. -In the given example, the quoted identifier would be \`my�identifier`. +In the given example, the quoted identifier would be `my\u0085identifier`. a| label:functionality[] @@ -72,23 +72,24 @@ label:removed[] RETURN 1 as my$Identifier ---- a| -The character with the Unicode representation \`\u0024` has been removed for unescaped identifiers. To continue using it, escape the identifier by adding backticks around the identifier. -This applies to all unescaped identifiers in Cypher, such as label expressions, properties, variable names, or parameters. In the given example, the quoted identifier would be \`my$identifier`. +The character with the Unicode representation `\u0024` (`$`) has been removed for unescaped identifiers. +To continue using it, escape the identifier by adding backticks (++``++) around the identifier. +This applies to all unescaped identifiers in Cypher, such as label expressions, properties, variable names, or parameters. In the given example, the quoted identifier would be `my\u0024identifier`. The following Unicode Characters are removed 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' +`\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` a| label:functionality[] @@ -186,6 +187,35 @@ For more information, see link:{neo4j-docs-base-uri}/operations-manual/current/d | Feature | Details +a| +label:functionality[] +label:updated[] +[source, cypher, role="noheader"] +---- +WITH 1 AS g +RETURN COLLECT { + UNWIND [1,2,3] AS x + WITH * WHERE x < 0 + WITH count(*) AS agg + RETURN agg + g +} AS x +---- + +a| Imported variables are now correctly handled as constants inside xref:subqueries/collect.adoc[`COLLECT`], xref:subqueries/count.adoc[`COUNT`], and xref:subqueries/existential.adoc[`EXISTS`] subquery expressions. +The example query previously returned no results (`[]`) because the imported variable was used incorrectly as an implicit grouping key. +It now returns `[1]`, since the variable is not used as a grouping key, allowing `count(*)` to return `0` and `0 + g` to evaluate to `1`. + +a| +label:functionality[] +label:updated[] +[source, cypher, role="noheader"] +---- +RETURN $0hello +---- + +a| Parameters can start with extended identifier characters (such as numbers), in line with the xref:appendix/gql-conformance/index.adoc[GQL] standard. +For more information, see xref:syntax/parameters.adoc[]. + a| label:functionality[] label:updated[] diff --git a/modules/ROOT/pages/syntax/parameters.adoc b/modules/ROOT/pages/syntax/parameters.adoc index 2ffe9de69..1820abd17 100644 --- a/modules/ROOT/pages/syntax/parameters.adoc +++ b/modules/ROOT/pages/syntax/parameters.adoc @@ -26,7 +26,9 @@ Parameters cannot be used for the following constructs, as these form part of th * Relationship types; `MATCH (n)-[:$param]->(m)` is invalid. * Node labels; `MATCH (n:$param)` is invalid. -Parameters may consist of letters and numbers, and any combination of these, but cannot start with a number or a currency symbol. +Parameter names can start with and contain underscores, letters, numbers, and combining marks such as accents (e.g., `é`). +Currency symbols (e.g., `$` and `€`), non-printable Unicode control characters that only affect formatting (e.g., `\t` for Tab), punctuation (e.g., `!`), and whitespaces are not allowed in any position of a parameter name. +For example, `$héllo`, `$0param`, and `$_param` are valid, while `$€value`, `$hello!`, and `$bad param` are not. Setting parameters when running a query is dependent on the client environment. For example: From 3a2dd812a91b74f749ba75d3ed66cd48456f3fcf Mon Sep 17 00:00:00 2001 From: Neil Dewhurst Date: Mon, 23 Jun 2025 19:52:08 +0100 Subject: [PATCH 06/72] Mark 25 as prerelease - force sitemap to Cypher 5 (#1316) Marking 25 as prerelease will do the following: - Ensure the sitemaps extension treats Cypher 5 as the latest version, so that it will generate a sitemap from Cypher 5 content - Ensure canonical URLs in the HTML `` are accurate. We can then allow new pages in Cypher 25 to be indexed, or we can index the whole of the Cypher manual. --- antora.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/antora.yml b/antora.yml index c0f178920..63677c6f2 100644 --- a/antora.yml +++ b/antora.yml @@ -1,6 +1,7 @@ name: cypher-manual title: Cypher Manual version: '25' +prerelease: true start_page: ROOT:introduction/index.adoc nav: - modules/ROOT/content-nav.adoc From caeeee4a826ae8a7309796d6cf711ac88a79e32b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Mon, 23 Jun 2025 21:21:56 +0200 Subject: [PATCH 07/72] Select Cypher version (#1123) Operations manual PRs mentioned in this PR: - https://github.com/neo4j/docs-operations/pull/2153 - https://github.com/neo4j/docs-operations/pull/2116 TODO: Add clarifying note on Additions page --------- Co-authored-by: Stefano Ottolenghi --- modules/ROOT/content-nav.adoc | 1 + ...ions-additions-removals-compatibility.adoc | 3 +- modules/ROOT/pages/queries/index.adoc | 5 +- .../ROOT/pages/queries/select-version.adoc | 243 ++++++++++++++++++ 4 files changed, 249 insertions(+), 3 deletions(-) create mode 100644 modules/ROOT/pages/queries/select-version.adoc diff --git a/modules/ROOT/content-nav.adoc b/modules/ROOT/content-nav.adoc index 61edc54f4..c58e92758 100644 --- a/modules/ROOT/content-nav.adoc +++ b/modules/ROOT/content-nav.adoc @@ -6,6 +6,7 @@ * xref:queries/index.adoc[] ** xref:queries/concepts.adoc[] ** xref:queries/basic.adoc[] +** xref:queries/select-version.adoc[] ** xref:queries/composed-queries/index.adoc[] *** xref:queries/composed-queries/combined-queries.adoc[] *** xref:queries/composed-queries/conditional-queries.adoc[] diff --git a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc index 61354701b..5715f481c 100644 --- a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc +++ b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc @@ -1,5 +1,5 @@ [[cypher-deprecations-additions-removals-compatibility]] -= Deprecations, additions, and compatibility += Additions, deprecations, removals, and compatibility :description: all of the features that have been removed, deprecated, added, or extended in different Cypher versions. :test-skip: true // all deprecations would fail. @@ -20,6 +20,7 @@ Replacement syntax for deprecated and removed features are also indicated. [IMPORTANT] Cypher 25 was introduced in Neo4j 2025.06 and can only be used on Neo4j 2025.06+ databases. Features removed in Cypher 25 are still available on Neo4j 2025.06+ databases either by prepending a query with `CYPHER 5` or by having Cypher 5 as the default language for the database. +For more information, see xref:queries/select-version.adoc[]. [[cypher-deprecations-additions-removals-2025.06]] == Neo4j 2025.06 diff --git a/modules/ROOT/pages/queries/index.adoc b/modules/ROOT/pages/queries/index.adoc index 063e5f050..f0917ffdf 100644 --- a/modules/ROOT/pages/queries/index.adoc +++ b/modules/ROOT/pages/queries/index.adoc @@ -1,11 +1,12 @@ = Queries :description: This page is an overview of the queries section in the Cypher Manual. -This section provides a brief overview of the core concepts of a Cypher query (nodes, relationships, and paths), and examples of how to query a Neo4j graph database. -It also discusses how to compose combined queries using `UNION`, conditional queries using `WHEN` and sequential queries using `NEXT`. +This section provides a brief overview of the core concepts of a Cypher query (nodes, relationships, and paths), along with examples of how to query a Neo4j graph database. +It also explains how to select the version of Cypher in which queries are run, and how to compose combined queries using `UNION`, conditional queries using `WHEN`, and sequential queries using `NEXT`. * xref:queries/concepts.adoc[] * xref:queries/basic.adoc[] +* xref:queries/select-version.adoc[] * xref:queries/composed-queries/index.adoc[] ** xref:queries/composed-queries/combined-queries.adoc[] ** xref:queries/composed-queries/conditional-queries.adoc[] label:new[Introduced in Neo4j 2025.06] diff --git a/modules/ROOT/pages/queries/select-version.adoc b/modules/ROOT/pages/queries/select-version.adoc new file mode 100644 index 000000000..e21b9102f --- /dev/null +++ b/modules/ROOT/pages/queries/select-version.adoc @@ -0,0 +1,243 @@ +:description: Information about how to select Cypher version for queries or databases. + += Select Cypher version + +Users can specify the version of Cypher in which they want to run their queries, choosing between Cypher 5 and Cypher 25. +The Cypher version can be specified either by configuring a default language for the database or by setting it on a per-query basis. + +[[cypher-versions-explained]] +== Cypher 25, Cypher 5, and Neo4j explained + +Starting in 2025, the Neo4j server transitioned to a calendar-based versioning system. +This means Neo4j will no longer use its previous semantic versioning and release pattern (e.g., 5.25, 5.26). +Instead, releases from 2025 onwards will follow a *YYYY.MM* format, beginning with version 2025.01 released in January 2025, followed by 2025.02 released in February 2025, and so on. + +Cypher 25 is introduced alongside *Neo4j 2025.06*. +It is created as a clone of Cypher 5, but with additional new and updated features, as well as some removed features. +For more information about the new, updated, and removed features included in Cypher 25, see the xref:deprecations-additions-removals-compatibility.adoc#cypher-deprecations-additions-removals-2025.06[Additions, deprecations, removals, and compatibility] page. + +Cypher 25 is in an evolving state, and more features will be added to it with future releases of Neo4j. +In the releases following Neo4j 2026.06, features will only be added to Cypher 25; no features will be removed until the next Cypher release. +*Any new Cypher features introduced in Neo4j 2025.06 or later will be exclusively added to Cypher 25.* + +Users running Neo4j version 2025.06 or later can choose to run their queries using the previous version of Cypher: Cypher 5. +If so, Neo4j will use Cypher 5 as it existed at the time of the Neo4j 2025.06 release (the release in which Cypher 5 was frozen). +*No new features will be added to Cypher 5* (only performance enhancements and eventual bug fixes may be included in server releases following Neo4j 2025.06). +Cypher 5 users must, therefore, migrate to Cypher 25 in order to access new features. +For information about Cypher 5, see the link:https://neo4j.com/docs/cypher-manual/5/introduction/[Cypher 5 Manual]. + +[NOTE] +Although Cypher 5 queries are currently supported on Neo4j 2025.06+ databases, they will eventually need to be migrated to Cypher 25, as support for Cypher 5 will be discontinued in a future release (anticipated no earlier than two additional server LTS cycles). + +[[select-default-cypher-version]] +== Select the default Cypher version for a database + +Databases created on, or migrated to, Neo4j 2025.06 or later will continue to have Cypher 5 as their default language (unless {neo4j-docs-base-uri}/operations-manual/current/configuration/configuration-settings/#config_db.query.default_language[`db.query.default_language`] is set to `CYPHER_25`). +This is true for link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/#manage-database-systems[system, standard, and composite] Neo4j databases. +However, it is possible to set a different default language on both new and existing system, standard, and composite databases. + +To select a default Cypher version when creating a database, add `DEFAULT LANGUAGE ` to the link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/standard-databases/create-databases/[`CREATE DATABASE`] statement. + +[NOTE] +Setting the default language requires the link:{neo4j-docs-base-uri}/operations-manual/current/authentication-authorization/dbms-administration/#access-control-dbms-administration-database-management[`SET DATABASE DEFAULT LANGUAGE` privilege]. + +.Select default Cypher version when creating a database +[.tabbed-example] +===== +[.include-with-Cypher-25] +====== + +.Cypher 25 +[source,cypher] +---- +CREATE DATABASE actors DEFAULT LANGUAGE CYPHER 25 +---- + +====== + +[.include-with-Cypher-5] +====== + +.Cypher 5 +[source,cypher] +---- +CREATE DATABASE movies DEFAULT LANGUAGE CYPHER 5 +---- + +====== +===== + +To alter the default Cypher version on an existing database, add `SET DEFAULT LANGUAGE ` to the link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/standard-databases/alter-databases/[`ALTER DATABASE`] command. + +[NOTE] +Altering the default language requires the link:{neo4j-docs-base-uri}/operations-manual/current/authentication-authorization/dbms-administration/#access-control-dbms-administration-database-management[`SET DATABASE DEFAULT LANGUAGE` privilege]. + +.Alter the default Cypher version on an existing database +[.tabbed-example] +===== +[.include-with-Cypher-25] +====== + +.Cypher 25 +[source,cypher] +---- +ALTER DATABASE movies SET DEFAULT LANGUAGE CYPHER 25 +---- + +====== + +[.include-with-Cypher-5] +====== + +.Cypher 5 +[source,cypher] +---- +ALTER DATABASE actors SET DEFAULT LANGUAGE CYPHER 5 +---- + +====== +===== + +Selecting `CYPHER 25` ensures that all queries run on that database will be executed using the language as it exists in the version of Neo4j that the database is currently running, provided it is on Neo4j 2025.06 or later (unless a query is prepended with xref:selection-query-cypher-version[`CYPHER 5`], which overrides this default). + +Selecting `CYPHER 5` as the default database language ensures that all queries run on that database uses the language as it existed at the time of the Neo4j 2025.06 release (unless a query is prepended with xref:selection-query-cypher-version[`CYPHER 25`], which overrides this default). +Any changes introduced after the 2025.06 release will not affect the semantics of the query. + +[[config-database-upgrades]] +== Cypher versions, configuration settings, and DBMS upgrades + +Changing the Cypher version of new databases in a DBMS can also be done with the setting link:{neo4j-docs-base-uri}/operations-manual/current/configuration/configuration-settings/#config_db.query.default_language[`db.query.default_language`] (default value: `CYPHER_5`). +This setting determines the default language for new databases where it has not been specified as part of a `CREATE` or `ALTER` database command. +For example, `config_db.query.default_language=CYPHER_25` will set Cypher 25 as the default language for a DBMS. +For more information about using configuration settings, see the link:{neo4j-docs-base-uri}/operations-manual/current/configuration/[Operations Manual -> Configuration]. + +The table below outlines which Cypher version is assigned to databases in different upgrade or installation scenarios: + +[cols="3", options="header"] +|=== +| Scenario | `db.query.default_language` | Databases + + +| *Standard DBMS upgrade to Neo4j 2025.06+* +| Unset +| *Existing system database:* `CYPHER 5` + +*Existing user databases:* `CYPHER 5` + +*New user databases default:* `CYPHER 5` + + +| *Custom DBMS upgrade to Neo4j 2025.06+* +| Manually set to `CYPHER_25` by administrator +| *Existing system database:* `CYPHER 5` + +*Existing user databases:* `CYPHER 5` + +*New user databases default:* `CYPHER 25` + + +| *New installation of Neo4j 2025.06+* +| Set to `CYPHER_5` +| *New system database:* `CYPHER 5` + +*New user databases default:* `CYPHER 5` + + +|=== + +For more information about upgrading and migrating Neo4j databases, see the link:{neo4j-docs-base-uri}/upgrade-migration-guide/current/[Upgrade and migration guide]. + +[[migrate-queries-from-5-to-25]] +== Migrating queries from Cypher 5 to Cypher 25 + +It is recommended to modify queries that depend on features deprecated in Cypher 5 and removed in Cypher 25 to align with the changes introduced in Cypher 25. + +For example, Cypher 25 disallowed using a `NODE` or `RELATIONSHIP` instead of a `MAP` on the RHS of a xref:clauses/set.adoc[`SET`] clause, and instead requires the xref:functions/scalar.adoc#functions-properties[`properties()`] function to get the map of properties from nodes or relationships before referencing them in a `SET` clause. +The following example demonstrates how a query that works in Cypher 5 can be rewritten to work in Cypher 25. + +.Original Cypher 5 query +[source, cypher, role=test-skip] +---- +MATCH (n:Order)-[r:SHIPPED_TO]->(:Address) +SET n = r +---- + +.Modified Cypher 25 query +[source, cypher] +---- +MATCH (n:Order)-[r:SHIPPED_TO]->(:Address) +SET n = properties(r) +---- + +Another option is to prepend individual queries with a specific language version. + +[[selection-query-cypher-version]] +== Select Cypher version for individual queries + +To select the Cypher version of a query, prepend it with `CYPHER `. +This selection will override the default language for the database the query is executed against, and allows you to either work with Cypher 25 features in a database that has Cypher 5 as the default language, or to continue running your Cypher 5 queries on a database that has Cypher 25 as the default language. + +Queries run with Cypher 5 will eventually need to be updated to Cypher 25 as support for Cypher 5 will be discontinued in the future (anticipated no earlier than two additional server LTS cycles). +It is, therefore, recommended to set the default language to Cypher 25 and migrate the necessary queries to its supported syntax rather than prepending individual queries with a Cypher version. + +.Select the Cypher version for a query +[.tabbed-example] +===== +[.include-with-Cypher-25] +====== + +.Cypher 25 query on a Neo4j 2025.06+ database with Cypher 5 as default language +[source,cypher] +---- +CYPHER 25 +MATCH (n:Order)-[r:SHIPPED_TO]->(:Address) +SET n = properties(r) +---- + +====== + +[.include-with-Cypher-5] +====== + +.Cypher 5 query on a Neo4j 2025.06+ database with Cypher 25 as default language +[source,cypher] +---- +CYPHER 5 +MATCH (n:Order)-[r:SHIPPED_TO]->(:Address) +SET n = r +---- + +====== +===== + +Selecting `CYPHER 25` ensures that the query will be executed using the language as it exists in the version of Neo4j that the database is currently running, provided it is on Neo4j 2025.06 or later. + +Selecting `CYPHER 5` ensures that the query will be executed using the language as it existed at the time of the Neo4j 2025.06 release. +Any changes introduced after the 2025.06 release will not affect the query. + +[[procedures-and-functions]] +=== Procedures and functions + +link:{neo4j-docs-base-uri}/operations-manual/current/procedures[Procedures] and xref:functions/index.adoc[functions] (including built-in and link:{neo4j-docs-base-uri}/apoc/current/[APOC]) are tied to a specific Cypher language version. +Therefore, procedures and functions in Neo4j 2025.06+ and APOC 2025.06+ (both of which have Cypher 5 as their default language) may behave differently depending on what version of Cypher is used. + +For example, APOC 2025.06 removed Cypher 25 support of the procedure `apoc.create.uuids()`, meaning it is not available to queries running Cypher 25. +However, it can still be used on APOC 2025.06 if queries are prepended with `CYPHER 5`, or if the database’s default version is set to `CYPHER 5`. +In this case, Neo4j will use APOC and Cypher 5 as they existed at the time of the 2025.06 release. + +.Using a procedure removed in Cypher 25 with APOC 2025.06+ +[source, cypher] +---- +CYPHER 5 +CALL apoc.create.uuids(10) +---- + +[[cypher-selection-with-other-query-options]] +=== Combine Cypher version selection with other query options + +It is possible to combine Cypher version selection with other xref:planning-and-tuning/query-tuning.adoc[query options]. +The below example selects both the version and the xref:planning-and-tuning/runtimes/concepts.adoc[runtime] of Cypher for the same query: + +.Combining Cypher version selection with other query options +[source, cypher] +---- +CYPHER 5 runtime=parallel +MATCH (n:Person) +RETURN n.name +---- + From d14b25db738c007f9df47eebc1aef05d5fcbb7d3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Jun 2025 05:52:13 +0200 Subject: [PATCH 08/72] Bump the dev-dependencies group with 2 updates (#1318) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the dev-dependencies group with 2 updates: [express](https://github.com/expressjs/express) and [nodemon](https://github.com/remy/nodemon). Updates `express` from 4.21.0 to 5.1.0
Release notes

Sourced from express's releases.

v5.1.0

What's Changed

... (truncated)

Changelog

Sourced from express's changelog.

5.1.0 / 2025-03-31

  • Add support for Uint8Array in res.send()
  • Add support for ETag option in res.sendFile()
  • Add support for multiple links with the same rel in res.links()
  • Add funding field to package.json
  • perf: use loop for acceptParams
  • refactor: prefix built-in node module imports
  • deps: remove setprototypeof
  • deps: remove safe-buffer
  • deps: remove utils-merge
  • deps: remove methods
  • deps: remove depd
  • deps: debug@^4.4.0
  • deps: body-parser@^2.2.0
  • deps: router@^2.2.0
  • deps: content-type@^1.0.5
  • deps: finalhandler@^2.1.0
  • deps: qs@^6.14.0
  • deps: server-static@2.2.0
  • deps: type-is@2.0.1

5.0.1 / 2024-10-08

5.0.0 / 2024-09-10

  • remove:
    • path-is-absolute dependency - use path.isAbsolute instead
  • breaking:
    • res.status() accepts only integers, and input must be greater than 99 and less than 1000
      • will throw a RangeError: Invalid status code: ${code}. Status code must be greater than 99 and less than 1000. for inputs outside this range
      • will throw a TypeError: Invalid status code: ${code}. Status code must be an integer. for non integer inputs
    • deps: send@1.0.0
    • res.redirect('back') and res.location('back') is no longer a supported magic string, explicitly use req.get('Referrer') || '/'.
  • change:
    • res.clearCookie will ignore user provided maxAge and expires options
  • deps: cookie-signature@^1.2.1
  • deps: debug@4.3.6
  • deps: merge-descriptors@^2.0.0
  • deps: serve-static@^2.1.0
  • deps: qs@6.13.0
  • deps: accepts@^2.0.0
  • deps: mime-types@^3.0.0
    • application/javascript => text/javascript
  • deps: type-is@^2.0.0
  • deps: content-disposition@^1.0.0

... (truncated)

Commits

Updates `nodemon` from 3.1.7 to 3.1.10
Release notes

Sourced from nodemon's releases.

v3.1.10

3.1.10 (2025-04-23)

Bug Fixes

v3.1.9

3.1.9 (2024-12-13)

Bug Fixes

  • maintain backward support for exitcrash (9c9de6e)

v3.1.8

3.1.8 (2024-12-13)

Bug Fixes

Commits

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 1435 ++++++++++++++++++++++++++------------------- package.json | 4 +- 2 files changed, 833 insertions(+), 606 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9d9055cee..340872e31 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,8 +21,8 @@ "asciidoctor-kroki": "^0.18.1" }, "devDependencies": { - "express": "^4.21.0", - "nodemon": "^3.1.7" + "express": "^5.1.0", + "nodemon": "^3.1.10" } }, "node_modules/@antora/asciidoc-loader": { @@ -407,13 +407,37 @@ } }, "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "mime-db": "^1.54.0" }, "engines": { "node": ">= 0.6" @@ -437,12 +461,6 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, "node_modules/asciidoctor-kroki": { "version": "0.18.1", "resolved": "https://registry.npmjs.org/asciidoctor-kroki/-/asciidoctor-kroki-0.18.1.tgz", @@ -539,27 +557,24 @@ } }, "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", "dev": true, + "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=18" } }, "node_modules/brace-expansion": { @@ -618,6 +633,7 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -633,17 +649,29 @@ "node": ">=4" } }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, + "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -728,10 +756,11 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -744,6 +773,7 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -761,19 +791,24 @@ } }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } }, "node_modules/crc-32": { "version": "1.2.2", @@ -795,12 +830,21 @@ } }, "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/decompress-response": { @@ -817,58 +861,49 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/diff3": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/diff3/-/diff3-0.0.3.tgz", "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==" }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -882,13 +917,11 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -898,6 +931,20 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, "engines": { "node": ">= 0.4" } @@ -906,13 +953,15 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -934,45 +983,69 @@ } }, "node_modules/express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", "dev": true, + "license": "MIT", "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" }, "engines": { - "node": ">= 0.10.0" + "node": ">= 0.6" } }, "node_modules/fast-copy": { @@ -1033,18 +1106,18 @@ } }, "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" }, "engines": { "node": ">= 0.8" @@ -1060,12 +1133,13 @@ } }, "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/fs.realpath": { @@ -1092,21 +1166,28 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -1115,6 +1196,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", @@ -1143,12 +1238,13 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1183,35 +1279,12 @@ "node": ">=4" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1224,6 +1297,7 @@ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -1249,6 +1323,7 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -1260,13 +1335,24 @@ "node": ">= 0.8" } }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" @@ -1367,6 +1453,13 @@ "node": ">=0.12.0" } }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, "node_modules/isomorphic-git": { "version": "1.25.10", "resolved": "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.25.10.tgz", @@ -1443,20 +1536,35 @@ "node": ">=10" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -1469,15 +1577,6 @@ "node": ">= 8" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/micromatch": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", @@ -1490,18 +1589,6 @@ "node": ">=8.6" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -1574,10 +1661,11 @@ } }, "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" }, "node_modules/multi-progress": { "version": "4.0.0", @@ -1588,10 +1676,11 @@ } }, "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1602,10 +1691,11 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node_modules/nodemon": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.7.tgz", - "integrity": "sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", + "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==", "dev": true, + "license": "MIT", "dependencies": { "chokidar": "^3.5.2", "debug": "^4", @@ -1629,29 +1719,6 @@ "url": "https://opencollective.com/nodemon" } }, - "node_modules/nodemon/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/nodemon/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/nopt": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", @@ -1677,10 +1744,11 @@ } }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1701,6 +1769,7 @@ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -1726,6 +1795,7 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -1739,10 +1809,14 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", - "dev": true + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } }, "node_modules/pend": { "version": "1.2.0", @@ -1907,12 +1981,13 @@ } }, "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -1955,19 +2030,21 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", - "iconv-lite": "0.4.24", + "iconv-lite": "0.6.3", "unpipe": "1.0.0" }, "engines": { @@ -2037,6 +2114,23 @@ "node": ">=0.10.0" } }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -2095,7 +2189,8 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/secure-json-parse": { "version": "2.7.0", @@ -2118,81 +2213,73 @@ } }, "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 18" } }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "node_modules/send/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">= 0.6" } }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "node_modules/send/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", "dev": true, + "license": "MIT", "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" + "mime-db": "^1.54.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.6" } }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", "dev": true, + "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" }, "engines": { - "node": ">= 0.4" + "node": ">= 18" } }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/sha.js": { "version": "2.4.11", @@ -2212,15 +2299,73 @@ "integrity": "sha512-RPQhIndEIVUCjkfkQ6rs6sOR6pkxJWCNdxtfG5pP0RVgUYbK5911kLTF0TNcCC0G3YCGd492rMollFT2aTd9iQ==" }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -2309,10 +2454,11 @@ } }, "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -2401,6 +2547,7 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6" } @@ -2418,13 +2565,38 @@ } }, "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "dev": true, + "license": "MIT", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" }, "engines": { "node": ">= 0.6" @@ -2453,6 +2625,7 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -2470,15 +2643,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -2856,13 +3020,30 @@ } }, "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "dev": true, "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "dependencies": { + "mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true + }, + "mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "requires": { + "mime-db": "^1.54.0" + } + } } }, "anymatch": { @@ -2880,12 +3061,6 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, "asciidoctor-kroki": { "version": "0.18.1", "resolved": "https://registry.npmjs.org/asciidoctor-kroki/-/asciidoctor-kroki-0.18.1.tgz", @@ -2952,23 +3127,20 @@ "dev": true }, "body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", "dev": true, "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" } }, "brace-expansion": { @@ -3016,17 +3188,24 @@ "xdg-basedir": "^3.0.0" } }, - "call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, "requires": { - "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "function-bind": "^1.1.2" + } + }, + "call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" } }, "chokidar": { @@ -3087,9 +3266,9 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", "dev": true, "requires": { "safe-buffer": "5.2.1" @@ -3111,15 +3290,15 @@ } }, "cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true }, "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "dev": true }, "crc-32": { @@ -3133,12 +3312,12 @@ "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==" }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.3" } }, "decompress-response": { @@ -3149,34 +3328,28 @@ "mimic-response": "^3.1.0" } }, - "define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - } - }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true - }, "diff3": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/diff3/-/diff3-0.0.3.tgz", "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==" }, + "dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -3198,13 +3371,10 @@ } }, "es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.4" - } + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true }, "es-errors": { "version": "1.3.0", @@ -3212,6 +3382,15 @@ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true }, + "es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "requires": { + "es-errors": "^1.3.0" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -3235,42 +3414,55 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, "express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", "dev": true, "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "dependencies": { + "mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true + }, + "mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "requires": { + "mime-db": "^1.54.0" + } + } } }, "fast-copy": { @@ -3322,18 +3514,17 @@ } }, "finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", "dev": true, "requires": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" } }, "forwarded": { @@ -3343,9 +3534,9 @@ "dev": true }, "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "dev": true }, "fs.realpath": { @@ -3367,16 +3558,31 @@ "dev": true }, "get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "requires": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + } + }, + "get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "requires": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" } }, "glob": { @@ -3401,13 +3607,10 @@ } }, "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true }, "handlebars": { "version": "4.7.8", @@ -3427,25 +3630,10 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, - "has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "requires": { - "es-define-property": "^1.0.0" - } - }, - "has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true - }, "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true }, "hasown": { @@ -3478,15 +3666,23 @@ "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" + }, + "dependencies": { + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } } }, "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "ieee754": { @@ -3552,6 +3748,12 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, + "is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true + }, "isomorphic-git": { "version": "1.25.10", "resolved": "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.25.10.tgz", @@ -3609,16 +3811,22 @@ "yallist": "^4.0.0" } }, + "math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true + }, "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "dev": true }, "merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "dev": true }, "merge2": { @@ -3626,12 +3834,6 @@ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true - }, "micromatch": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", @@ -3641,12 +3843,6 @@ "picomatch": "^2.3.1" } }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -3692,9 +3888,9 @@ "integrity": "sha512-sjAkg21peAG9HS+Dkx7hlG9Ztx7HLeKnvB3NQRcu/mltCVmvkF0pisbiTSfDVYTT86XEfZrTUosLdZLStquZUw==" }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "multi-progress": { @@ -3704,9 +3900,9 @@ "requires": {} }, "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "dev": true }, "neo-async": { @@ -3715,9 +3911,9 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "nodemon": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.7.tgz", - "integrity": "sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", + "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==", "dev": true, "requires": { "chokidar": "^3.5.2", @@ -3730,23 +3926,6 @@ "supports-color": "^5.5.0", "touch": "^3.1.0", "undefsafe": "^2.0.5" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, "nopt": { @@ -3765,9 +3944,9 @@ "dev": true }, "object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true }, "on-exit-leak-free": { @@ -3809,9 +3988,9 @@ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, "path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", "dev": true }, "pend": { @@ -3951,12 +4130,12 @@ } }, "qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "dev": true, "requires": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" } }, "queue-microtask": { @@ -3981,14 +4160,14 @@ "dev": true }, "raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", "dev": true, "requires": { "bytes": "3.1.2", "http-errors": "2.0.0", - "iconv-lite": "0.4.24", + "iconv-lite": "0.6.3", "unpipe": "1.0.0" } }, @@ -4036,6 +4215,19 @@ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, + "router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dev": true, + "requires": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + } + }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -4080,64 +4272,51 @@ } }, "send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", "dev": true, "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" }, "dependencies": { - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "dev": true }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "requires": { + "mime-db": "^1.54.0" + } } } }, "serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", "dev": true, "requires": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - } - }, - "set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" } }, "setprototypeof": { @@ -4161,15 +4340,51 @@ "integrity": "sha512-RPQhIndEIVUCjkfkQ6rs6sOR6pkxJWCNdxtfG5pP0RVgUYbK5911kLTF0TNcCC0G3YCGd492rMollFT2aTd9iQ==" }, "side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + } + }, + "side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + } + }, + "side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, "requires": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + } + }, + "side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" } }, "simple-concat": { @@ -4215,9 +4430,9 @@ "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==" }, "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "dev": true }, "streamx": { @@ -4301,13 +4516,31 @@ } }, "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "dev": true, "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "dependencies": { + "mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true + }, + "mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "requires": { + "mime-db": "^1.54.0" + } + } } }, "uglify-js": { @@ -4338,12 +4571,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true - }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/package.json b/package.json index 046f3dd9c..a114ccd79 100644 --- a/package.json +++ b/package.json @@ -31,8 +31,8 @@ "asciidoctor-kroki": "^0.18.1" }, "devDependencies": { - "express": "^4.21.0", - "nodemon": "^3.1.7" + "express": "^5.1.0", + "nodemon": "^3.1.10" }, "overrides": { "@antora/site-generator-default": { From 0c0caa39e0e17b4c1718ed205aacd07ecc789f5f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Jun 2025 06:31:10 +0200 Subject: [PATCH 09/72] Bump the prod-dependencies group with 5 updates (#1319) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the prod-dependencies group with 5 updates: | Package | From | To | | --- | --- | --- | | [@antora/cli](https://gitlab.com/antora/antora) | `3.1.9` | `3.1.10` | | [@antora/site-generator-default](https://gitlab.com/antora/antora) | `3.1.9` | `3.1.10` | | @neo4j-antora/antora-add-notes | `0.3.1` | `0.3.2` | | @neo4j-antora/antora-modify-sitemaps | `0.4.4` | `0.7.1` | | @neo4j-antora/antora-table-footnotes | `0.3.2` | `0.3.3` | Updates `@antora/cli` from 3.1.9 to 3.1.10
Changelog

Sourced from @​antora/cli's changelog.

= Antora Changelog

This document provides a summary of all notable changes to the core Antora components by release. For a detailed view of what's changed, refer to the repository's https://gitlab.com/antora/antora/commits/main[commit history].

This project utilizes semantic versioning.

== Unreleased

=== Added

  • page-composer: Add file property to UI model of page that resolves to raw virtual file of page (#1165)
  • page-composer: Add built-in resolveResource UI helper to resolve raw virtual file of resource by reference (#1167)

=== Changed

  • page-composer: resolvePage and resolvePageURL helpers resolve current page when called with no arguments (#1166)

=== Fixed

  • page-composer: Fix crash if resolvePage or resolvePageURL helpers are called with no arguments
  • asciidoc-loader: Restore support for relative path token for include file in example or partial family (#1173)

== 3.2.0-alpha.8 (2024-12-05)

=== Changed

  • content-aggregator: Don't apply camelCase transformation to descendant keys of the ext key in component version descriptor (#1145)
  • content-aggregator: Include - segment in edit URL for file hosted on gitlab.com to avoid redirct
  • Apply code formatting changes to comply with biome toolchain (#1157)
  • Add directory property to repository entry in package files
  • Upgrade @​antora/expand-path-helper to 3.0.x (content-aggregator, ui-loader, file-publisher, logger)
  • Upgrade @​antora/user-require-helper to 3.0.x (content-aggregator, asciidoc-loader, file-publisher, site-generator, cli)

=== Fixed

  • content-aggregator: Gracefully handle case when value of nav key in component version descriptor is not an array (#1147)
  • page-composer: Use navtitle as content of orphan breadcrumb entry instead of doctitle (aka page title) (#1159)
  • site-generator: Fully support static register method on Class or Object exported by extension (#1158)

== 3.2.0-alpha.7 (2024-12-05)

Release failed.

== 3.2.0-alpha.6 (2024-07-23)

=== Changed

  • Replace "AsciiDoc extension" with "Asciidoctor extension" in log messages

... (truncated)

Commits
  • 854ac81 release 3.1.10
  • af08e08 fix issue references on what's new page
  • 43cdee8 fix broken internal reference on images page
  • 36207a5 add section to images page to document how to make a link to an image
  • ca6a33d improve introduction of images and attachment by mentioning use of xref macro
  • 3bab6c6 mention that xref can be used to create a link to an image
  • c741759 update what's new page for upcoming 3.1.10 release
  • 5742a22 fix issue references in CHANGELOG [skip ci]
  • 6b67ddc allow coverage npm script to be run per package and document how to invoke it...
  • 6280687 use curl to fetch the release script instead of wget [skip ci]
  • Additional commits viewable in compare view

Updates `@antora/site-generator-default` from 3.1.9 to 3.1.10
Changelog

Sourced from @​antora/site-generator-default's changelog.

= Antora Changelog

This document provides a summary of all notable changes to the core Antora components by release. For a detailed view of what's changed, refer to the repository's https://gitlab.com/antora/antora/commits/main[commit history].

This project utilizes semantic versioning.

== Unreleased

=== Added

  • page-composer: Add file property to UI model of page that resolves to raw virtual file of page (#1165)
  • page-composer: Add built-in resolveResource UI helper to resolve raw virtual file of resource by reference (#1167)

=== Changed

  • page-composer: resolvePage and resolvePageURL helpers resolve current page when called with no arguments (#1166)

=== Fixed

  • page-composer: Fix crash if resolvePage or resolvePageURL helpers are called with no arguments
  • asciidoc-loader: Restore support for relative path token for include file in example or partial family (#1173)

== 3.2.0-alpha.8 (2024-12-05)

=== Changed

  • content-aggregator: Don't apply camelCase transformation to descendant keys of the ext key in component version descriptor (#1145)
  • content-aggregator: Include - segment in edit URL for file hosted on gitlab.com to avoid redirct
  • Apply code formatting changes to comply with biome toolchain (#1157)
  • Add directory property to repository entry in package files
  • Upgrade @​antora/expand-path-helper to 3.0.x (content-aggregator, ui-loader, file-publisher, logger)
  • Upgrade @​antora/user-require-helper to 3.0.x (content-aggregator, asciidoc-loader, file-publisher, site-generator, cli)

=== Fixed

  • content-aggregator: Gracefully handle case when value of nav key in component version descriptor is not an array (#1147)
  • page-composer: Use navtitle as content of orphan breadcrumb entry instead of doctitle (aka page title) (#1159)
  • site-generator: Fully support static register method on Class or Object exported by extension (#1158)

== 3.2.0-alpha.7 (2024-12-05)

Release failed.

== 3.2.0-alpha.6 (2024-07-23)

=== Changed

  • Replace "AsciiDoc extension" with "Asciidoctor extension" in log messages

... (truncated)

Commits
  • 854ac81 release 3.1.10
  • af08e08 fix issue references on what's new page
  • 43cdee8 fix broken internal reference on images page
  • 36207a5 add section to images page to document how to make a link to an image
  • ca6a33d improve introduction of images and attachment by mentioning use of xref macro
  • 3bab6c6 mention that xref can be used to create a link to an image
  • c741759 update what's new page for upcoming 3.1.10 release
  • 5742a22 fix issue references in CHANGELOG [skip ci]
  • 6b67ddc allow coverage npm script to be run per package and document how to invoke it...
  • 6280687 use curl to fetch the release script instead of wget [skip ci]
  • Additional commits viewable in compare view

Updates `@neo4j-antora/antora-add-notes` from 0.3.1 to 0.3.2 Updates `@neo4j-antora/antora-modify-sitemaps` from 0.4.4 to 0.7.1 Updates `@neo4j-antora/antora-table-footnotes` from 0.3.2 to 0.3.3 Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 748 ++++++++++++++++++++++++---------------------- package.json | 10 +- 2 files changed, 391 insertions(+), 367 deletions(-) diff --git a/package-lock.json b/package-lock.json index 340872e31..b4c688bc1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,12 +9,12 @@ "version": "25", "license": "ISC", "dependencies": { - "@antora/cli": "^3.1.9", - "@antora/site-generator-default": "^3.1.9", - "@neo4j-antora/antora-add-notes": "^0.3.1", - "@neo4j-antora/antora-modify-sitemaps": "^0.4.4", + "@antora/cli": "^3.1.10", + "@antora/site-generator-default": "^3.1.10", + "@neo4j-antora/antora-add-notes": "^0.3.2", + "@neo4j-antora/antora-modify-sitemaps": "^0.7.1", "@neo4j-antora/antora-page-roles": "^0.3.1", - "@neo4j-antora/antora-table-footnotes": "^0.3.2", + "@neo4j-antora/antora-table-footnotes": "^0.3.3", "@neo4j-antora/mark-terms": "1.1.0", "@neo4j-documentation/macros": "^1.0.4", "@neo4j-documentation/remote-include": "^1.0.0", @@ -26,12 +26,13 @@ } }, "node_modules/@antora/asciidoc-loader": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/asciidoc-loader/-/asciidoc-loader-3.1.9.tgz", - "integrity": "sha512-flE27T2yI8TX7rUNjbBHWN3iR6s+kBuRBbUPncUFcWjx6mXzll8JLiTkxnc8JXHGzgKlveT+t5AkPYGACLfasg==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/asciidoc-loader/-/asciidoc-loader-3.1.10.tgz", + "integrity": "sha512-np0JkOV37CK7V4eDZUZXf4fQuCKYW3Alxl8FlyzBevXi2Ujv29O82JLbHbv1cyTsvGkGNNB+gzJIx9XBsQ7+Nw==", + "license": "MPL-2.0", "dependencies": { - "@antora/logger": "3.1.9", - "@antora/user-require-helper": "~2.0", + "@antora/logger": "3.1.10", + "@antora/user-require-helper": "~3.0", "@asciidoctor/core": "~2.2" }, "engines": { @@ -39,13 +40,14 @@ } }, "node_modules/@antora/cli": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/cli/-/cli-3.1.9.tgz", - "integrity": "sha512-kCUqWX3G/9Pvf8SWZ45ioHwWdOc9uamy2E5/FFwyGiTeu4ubNbadOauLVvMzSZHUxVDnGxXwCsmmQ2HwM919ew==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/cli/-/cli-3.1.10.tgz", + "integrity": "sha512-gp8u9aVM0w1DtWSsB5PwvEfFYKrooPENLhN58RAfdgTrcsTsWw+CDysFZPgEaHB0Y1ZbanR82ZH/f6JVKGcZfQ==", + "license": "MPL-2.0", "dependencies": { - "@antora/logger": "3.1.9", - "@antora/playbook-builder": "3.1.9", - "@antora/user-require-helper": "~2.0", + "@antora/logger": "3.1.10", + "@antora/playbook-builder": "3.1.10", + "@antora/user-require-helper": "~3.0", "commander": "~11.1" }, "bin": { @@ -56,13 +58,14 @@ } }, "node_modules/@antora/content-aggregator": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/content-aggregator/-/content-aggregator-3.1.9.tgz", - "integrity": "sha512-g+UzevPSm5c4R0j1U9uysJfdIUfp++QOHIEBmqjhfx/aIEnOL70zA+WF55Mm+syAfzU3877puI27sOp8qtPglw==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/content-aggregator/-/content-aggregator-3.1.10.tgz", + "integrity": "sha512-OT6ZcCA7LrtNfrAZUr3hFh+Z/1isKpsfnqFjCDC66NEMqIyzJO99jq0CM66rYlYhyX7mb5BwEua8lHcwpOXNow==", + "license": "MPL-2.0", "dependencies": { - "@antora/expand-path-helper": "~2.0", - "@antora/logger": "3.1.9", - "@antora/user-require-helper": "~2.0", + "@antora/expand-path-helper": "~3.0", + "@antora/logger": "3.1.10", + "@antora/user-require-helper": "~3.0", "braces": "~3.0", "cache-directory": "~2.0", "fast-glob": "~3.3", @@ -84,6 +87,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -92,12 +96,13 @@ } }, "node_modules/@antora/content-classifier": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/content-classifier/-/content-classifier-3.1.9.tgz", - "integrity": "sha512-PVJqwp5uvZE1PlpeJtb0p6al75fN+fmXGIC6DHcKysRnr0xo+sgz8X2r4mnNWdTWRqum2yVigMmmuXYTg3cJlQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/content-classifier/-/content-classifier-3.1.10.tgz", + "integrity": "sha512-3JJl4IIiTX00v/MirK603NoqIcHjGYAaRWt3Q4U03tI1Fv2Aho/ypO3FE45069jFf0Dx2uDJfp5kapb9gaIjdQ==", + "license": "MPL-2.0", "dependencies": { - "@antora/asciidoc-loader": "3.1.9", - "@antora/logger": "3.1.9", + "@antora/asciidoc-loader": "3.1.10", + "@antora/logger": "3.1.10", "mime-types": "~2.1", "vinyl": "~3.0" }, @@ -106,31 +111,34 @@ } }, "node_modules/@antora/document-converter": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/document-converter/-/document-converter-3.1.9.tgz", - "integrity": "sha512-pH7tQaIjcPsFdYkaBEAvA/5ki04IQwQGHoR+2jadKdMl6P+J5KA1VzNnMgyIL6gHn7auJIkoOKadfItRB9lHGQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/document-converter/-/document-converter-3.1.10.tgz", + "integrity": "sha512-qi9ctgcKal8tZtWflVo66w+4zCJoBmUKRV+eA9aRRR09KDdU9r514vu1adWNgniPppISr90zD13V5l2JUy/2CQ==", + "license": "MPL-2.0", "dependencies": { - "@antora/asciidoc-loader": "3.1.9" + "@antora/asciidoc-loader": "3.1.10" }, "engines": { "node": ">=16.0.0" } }, "node_modules/@antora/expand-path-helper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@antora/expand-path-helper/-/expand-path-helper-2.0.0.tgz", - "integrity": "sha512-CSMBGC+tI21VS2kGW3PV7T2kQTM5eT3f2GTPVLttwaNYbNxDve08en/huzszHJfxo11CcEs26Ostr0F2c1QqeA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@antora/expand-path-helper/-/expand-path-helper-3.0.0.tgz", + "integrity": "sha512-7PdEIhk97v85/CSm3HynCsX14TR6oIVz1s233nNLsiWubE8tTnpPt4sNRJR+hpmIZ6Bx9c6QDp3XIoiyu/WYYA==", + "license": "MPL-2.0", "engines": { - "node": ">=10.17.0" + "node": ">=16.0.0" } }, "node_modules/@antora/file-publisher": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/file-publisher/-/file-publisher-3.1.9.tgz", - "integrity": "sha512-C0VwVjuFbE1CVpZDgwYR1gZCNr1tMw5vueyF9wHZH0KCqAsp9iwo7bwj8wKWMPogxcxdYhnAvtDJnYmYFCuDWQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/file-publisher/-/file-publisher-3.1.10.tgz", + "integrity": "sha512-DPR/0d1P+kr3qV4T0Gh81POEO/aCmNWIp/oLUYAhr0HHOcFzgpTUUoLStgcYynZPFRIB7EYKSab+oYSCK17DGA==", + "license": "MPL-2.0", "dependencies": { - "@antora/expand-path-helper": "~2.0", - "@antora/user-require-helper": "~2.0", + "@antora/expand-path-helper": "~3.0", + "@antora/user-require-helper": "~3.0", "vinyl": "~3.0", "yazl": "~2.5" }, @@ -139,11 +147,12 @@ } }, "node_modules/@antora/logger": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/logger/-/logger-3.1.9.tgz", - "integrity": "sha512-MKuANodcX0lfRyiB+Rxl/Kv7UOxc2glzTYFoIoBB7uzxF0A+AhvUJDmpGQFRFN2ihxy99N3nLJmZpDebwXyE+A==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/logger/-/logger-3.1.10.tgz", + "integrity": "sha512-WSuIxEP2tVrhWtTj/sIrwBDjpi4ldB/1Kpiu4PXmY4/qeWP8thW6u8nXdwdDcWss5zqkZWjourvWKwVq7y8Wjg==", + "license": "MPL-2.0", "dependencies": { - "@antora/expand-path-helper": "~2.0", + "@antora/expand-path-helper": "~3.0", "pino": "~9.2", "pino-pretty": "~11.2", "sonic-boom": "~4.0" @@ -153,22 +162,24 @@ } }, "node_modules/@antora/navigation-builder": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/navigation-builder/-/navigation-builder-3.1.9.tgz", - "integrity": "sha512-zyl2yNjK31Dl6TRJgnoFb4Czwt9ar3wLTycAdMeZ+U/8YcAUHD8z7NCssPFFvZ0BbUr00NP+gbqDmCr6yz32NQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/navigation-builder/-/navigation-builder-3.1.10.tgz", + "integrity": "sha512-aLMK49nYsSB3mEZbLkmUXDAUYmscv2AFWu+5c3eqVGkQ6Wgyd79WQ6Bz3/TN9YqkzGL+PqGs0G39F0VQzD23Hw==", + "license": "MPL-2.0", "dependencies": { - "@antora/asciidoc-loader": "3.1.9" + "@antora/asciidoc-loader": "3.1.10" }, "engines": { "node": ">=16.0.0" } }, "node_modules/@antora/page-composer": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/page-composer/-/page-composer-3.1.9.tgz", - "integrity": "sha512-X6Qj+J5dfFAGXoCAOaA+R6xRp8UoNMDHsRsB1dUTT2QNzk1Lrq6YkYyljdD2cxkWjLVqQ/pQSP+BJVNFGbqDAQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/page-composer/-/page-composer-3.1.10.tgz", + "integrity": "sha512-JoEg8J8HVsnPmAgUrYSGzf0C8rQefXyCi/18ucy0utyfUvlJNsZvUbGUPx62Het9p0JP0FkAz2MTLyDlNdArVg==", + "license": "MPL-2.0", "dependencies": { - "@antora/logger": "3.1.9", + "@antora/logger": "3.1.10", "handlebars": "~4.7", "require-from-string": "~2.0" }, @@ -177,9 +188,10 @@ } }, "node_modules/@antora/playbook-builder": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/playbook-builder/-/playbook-builder-3.1.9.tgz", - "integrity": "sha512-MJ/OWz4pReC98nygGTXC5bOL/TDDtCYpSkHFBz2ST4L6tuM8rv9c5+cp//JkwY/QlTOvcuJ0f2xq4a7a5nI7Qw==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/playbook-builder/-/playbook-builder-3.1.10.tgz", + "integrity": "sha512-UB8UmRYfkKgActTUlotdVS4FKGjaZgTnSXE7Fns1xb3/3HRanWvI+Yze1OmCkGC33cTpoQFnSYp7ySEH8LaiBw==", + "license": "MPL-2.0", "dependencies": { "@iarna/toml": "~2.2", "convict": "~6.2", @@ -191,9 +203,10 @@ } }, "node_modules/@antora/redirect-producer": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/redirect-producer/-/redirect-producer-3.1.9.tgz", - "integrity": "sha512-9OLwoMhqifsBxTebInh/5W16GdDsdj+YkKG3TiCASlAOYsDbuhbeRPFUlyKKSRkMrtKKnFgHR0Z3DNPXYlH2NQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/redirect-producer/-/redirect-producer-3.1.10.tgz", + "integrity": "sha512-IbWJGh6LmsxJQ821h0B9JfooofFZBgFLZxsbp/IoTLkBFGLFAY5tDRvB6rvubfNLRoSjM8VjEUXGqVLlwZOb+g==", + "license": "MPL-2.0", "dependencies": { "vinyl": "~3.0" }, @@ -202,46 +215,49 @@ } }, "node_modules/@antora/site-generator": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/site-generator/-/site-generator-3.1.9.tgz", - "integrity": "sha512-YYESPG22tGX1CxRPSAr6acKILCO8JfGkM1OYc7Sw3D7ZvCy1YgZMAaTYK0T5yl9LXg+l/UZi1xq/Ej0qHnYQiw==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/site-generator/-/site-generator-3.1.10.tgz", + "integrity": "sha512-NCULYtwUjIyr5FGCymhfG/zDVUmZ6pfmCPorka8mAzo4/GDx1T7bgaRL9rEIyf2AMqcm7apQiAz03mpU4kucsw==", + "license": "MPL-2.0", "dependencies": { - "@antora/asciidoc-loader": "3.1.9", - "@antora/content-aggregator": "3.1.9", - "@antora/content-classifier": "3.1.9", - "@antora/document-converter": "3.1.9", - "@antora/file-publisher": "3.1.9", - "@antora/logger": "3.1.9", - "@antora/navigation-builder": "3.1.9", - "@antora/page-composer": "3.1.9", - "@antora/playbook-builder": "3.1.9", - "@antora/redirect-producer": "3.1.9", - "@antora/site-mapper": "3.1.9", - "@antora/site-publisher": "3.1.9", - "@antora/ui-loader": "3.1.9", - "@antora/user-require-helper": "~2.0" + "@antora/asciidoc-loader": "3.1.10", + "@antora/content-aggregator": "3.1.10", + "@antora/content-classifier": "3.1.10", + "@antora/document-converter": "3.1.10", + "@antora/file-publisher": "3.1.10", + "@antora/logger": "3.1.10", + "@antora/navigation-builder": "3.1.10", + "@antora/page-composer": "3.1.10", + "@antora/playbook-builder": "3.1.10", + "@antora/redirect-producer": "3.1.10", + "@antora/site-mapper": "3.1.10", + "@antora/site-publisher": "3.1.10", + "@antora/ui-loader": "3.1.10", + "@antora/user-require-helper": "~3.0" }, "engines": { "node": ">=16.0.0" } }, "node_modules/@antora/site-generator-default": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/site-generator-default/-/site-generator-default-3.1.9.tgz", - "integrity": "sha512-m/QCv2o/24VmWZaeqtc6nNEky///GTLLx/pyyihP7uWKvZ0AhGPp6Agv1yaShjKIthBzHJ3JozaMPev2leor+A==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/site-generator-default/-/site-generator-default-3.1.10.tgz", + "integrity": "sha512-dMhjbklthysj3espwYNkTkADm2Z3EbWThq9gJv/ZuSXGZSXVSwt8b3mBpCTwxOeAKIldnj3fc1pzQxei/7PC2w==", + "license": "MPL-2.0", "dependencies": { - "@antora/site-generator": "3.1.9" + "@antora/site-generator": "3.1.10" }, "engines": { "node": ">=16.0.0" } }, "node_modules/@antora/site-mapper": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/site-mapper/-/site-mapper-3.1.9.tgz", - "integrity": "sha512-9FCObL+JIjBoby8z+beu2uuvAtCjm5EsEQt+16gCIMX1ktVP3W3gVsdRSvVcGcVEpizILFhMawkcQknZPUp5mg==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/site-mapper/-/site-mapper-3.1.10.tgz", + "integrity": "sha512-KY1j/y0uxC2Y7RAo4r4yKv9cgFm8aZoRylZXEODJnwj3tffbZ2ZdRzSWHp6fN0QX/Algrr9JNd9CWrjcj2f3Zw==", + "license": "MPL-2.0", "dependencies": { - "@antora/content-classifier": "3.1.9", + "@antora/content-classifier": "3.1.10", "vinyl": "~3.0" }, "engines": { @@ -249,22 +265,24 @@ } }, "node_modules/@antora/site-publisher": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/site-publisher/-/site-publisher-3.1.9.tgz", - "integrity": "sha512-L5To8f4QswZliXu6yB6O7O8CuBbLctjNbxZqP3m0FP7VaOONp85ftzEq1BFEm4BXXSwH1n4ujZx1qGBHP9ooOQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/site-publisher/-/site-publisher-3.1.10.tgz", + "integrity": "sha512-G4xcUWvgth8oeEQwiu9U1cE0miQtYHwKHOobUbDBt2Y6LlC5H31zQQmAyvMwTsGRlvYRgLVtG6j9d6JBwQ6w9Q==", + "license": "MPL-2.0", "dependencies": { - "@antora/file-publisher": "3.1.9" + "@antora/file-publisher": "3.1.10" }, "engines": { "node": ">=16.0.0" } }, "node_modules/@antora/ui-loader": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/ui-loader/-/ui-loader-3.1.9.tgz", - "integrity": "sha512-g0/9dRE5JVMYukIU3x+Rvr41bPdK3sUD2xQIAniRjE6usIZs1mEsTGshVKVEoOqqnSekXE85HVhybjNHsC+qbQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/ui-loader/-/ui-loader-3.1.10.tgz", + "integrity": "sha512-H1f5wI5a5HjLuE/Wexvc8NZy8w83Bhqjka7t1DbwOOqP+LyxFGLx/QbBVKdTtgFNDHVMtNBlplQq0ixeoTSh0A==", + "license": "MPL-2.0", "dependencies": { - "@antora/expand-path-helper": "~2.0", + "@antora/expand-path-helper": "~3.0", "braces": "~3.0", "cache-directory": "~2.0", "fast-glob": "~3.3", @@ -284,6 +302,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -292,20 +311,22 @@ } }, "node_modules/@antora/user-require-helper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@antora/user-require-helper/-/user-require-helper-2.0.0.tgz", - "integrity": "sha512-5fMfBZfw4zLoFdDAPMQX6Frik90uvfD8rXOA4UpXPOUikkX4uT1Rk6m0/4oi8oS3fcjiIl0k/7Nc+eTxW5TcQQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@antora/user-require-helper/-/user-require-helper-3.0.0.tgz", + "integrity": "sha512-KIXb8WYhnrnwH7Jj21l1w+et9k5GvcgcqvLOwxqWLEd0uVZOiMFdqFjqbVm3M+zcrs1JXWMeh2LLvxBbQs3q/Q==", + "license": "MPL-2.0", "dependencies": { - "@antora/expand-path-helper": "~2.0" + "@antora/expand-path-helper": "~3.0" }, "engines": { - "node": ">=10.17.0" + "node": ">=16.0.0" } }, "node_modules/@asciidoctor/core": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/@asciidoctor/core/-/core-2.2.6.tgz", - "integrity": "sha512-TmB2K5UfpDpSbCNBBntXzKHcAk2EA3/P68jmWvmJvglVUdkO9V6kTAuXVe12+h6C4GK0ndwuCrHHtEVcL5t6pQ==", + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@asciidoctor/core/-/core-2.2.8.tgz", + "integrity": "sha512-oozXk7ZO1RAd/KLFLkKOhqTcG4GO3CV44WwOFg2gMcCsqCUTarvMT7xERIoWW2WurKbB0/ce+98r01p8xPOlBw==", + "license": "MIT", "dependencies": { "asciidoctor-opal-runtime": "0.3.3", "unxhr": "1.0.1" @@ -322,15 +343,19 @@ "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==" }, "node_modules/@neo4j-antora/antora-add-notes": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@neo4j-antora/antora-add-notes/-/antora-add-notes-0.3.1.tgz", - "integrity": "sha512-0zapKJr9U+cNBaz5m342Zqb5+1VuaFuybhGtSzEdiG4MRmvsAZunxLX7lSG0cWm6L4DlQa0jzOKYYzpkqoap/g==" + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@neo4j-antora/antora-add-notes/-/antora-add-notes-0.3.2.tgz", + "integrity": "sha512-Jsv17dEBELSkqplEIZE9b5I2zjYPvoHi4momLRt1FfBRQnBTWbk4kkf2JQojRJ8mQEVscj2tApfTDOAUtAOSLA==", + "license": "MIT" }, "node_modules/@neo4j-antora/antora-modify-sitemaps": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@neo4j-antora/antora-modify-sitemaps/-/antora-modify-sitemaps-0.4.4.tgz", - "integrity": "sha512-IkXoilOJquZPB5G5ZhrgfSN6U3E2YToWakehtF55RA+CNQS0KboTAB2vUH01+Tkmkd8K6UElf41A6cGnnrvs0g==", - "license": "MIT" + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@neo4j-antora/antora-modify-sitemaps/-/antora-modify-sitemaps-0.7.1.tgz", + "integrity": "sha512-1XA4mfThu31PFEYvP8emBUruf7AT3C3/kjRv1yiB1NXcHESLM2mhpT64YwPNq6SRSGdWEGwQceSsM+CuHLZCwA==", + "license": "MIT", + "dependencies": { + "semver": "^7.6.3" + } }, "node_modules/@neo4j-antora/antora-page-roles": { "version": "0.3.2", @@ -338,9 +363,13 @@ "integrity": "sha512-RqmMHcTyM87lJAhjSPdkoUzFxQCjsM2N4+ryVK4GIahAJyNV9OYydBrsjGrDbIh6F4YS+LWG+SXyvLD2zJ1keQ==" }, "node_modules/@neo4j-antora/antora-table-footnotes": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@neo4j-antora/antora-table-footnotes/-/antora-table-footnotes-0.3.2.tgz", - "integrity": "sha512-DXEGVHMJumoKiY/ZCaGRTXl2OhPziPCHT+arj18TmpU50sUs+hyjOPuTkUXUvBwNZwm109Nm1PJPvKLVIJCZSg==" + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@neo4j-antora/antora-table-footnotes/-/antora-table-footnotes-0.3.3.tgz", + "integrity": "sha512-0vKB9nMJpfZdKTJc5vOJrNCFTcae61rnw9XyPQX2aibJN4vUTEeKhIS6IaVJWW5M1CflVIU3LoZDpDzeA/GEHw==", + "license": "MIT", + "peerDependencies": { + "@asciidoctor/core": "2.2.8" + } }, "node_modules/@neo4j-antora/mark-terms": { "version": "1.1.0", @@ -361,6 +390,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -373,6 +403,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", "engines": { "node": ">= 8" } @@ -381,6 +412,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -502,7 +534,8 @@ "node_modules/async-lock": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", - "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==" + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", + "license": "MIT" }, "node_modules/atomic-sleep": { "version": "1.0.0", @@ -513,9 +546,10 @@ } }, "node_modules/b4a": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", - "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==" + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "license": "Apache-2.0" }, "node_modules/balanced-match": { "version": "1.0.2", @@ -523,9 +557,10 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/bare-events": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", - "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "license": "Apache-2.0", "optional": true }, "node_modules/base64-js": { @@ -624,6 +659,7 @@ "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", "engines": { "node": "*" } @@ -642,6 +678,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/cache-directory/-/cache-directory-2.0.0.tgz", "integrity": "sha512-7YKEapH+2Uikde8hySyfobXBqPKULDyHNl/lhKm7cKf/GJFdG/tU/WpLrOg2y9aUrQrWUilYqawFIiGJPS6gDA==", + "license": "LGPL-3.0+", "dependencies": { "xdg-basedir": "^3.0.0" }, @@ -722,21 +759,18 @@ "node_modules/clean-git-ref": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/clean-git-ref/-/clean-git-ref-2.0.1.tgz", - "integrity": "sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==" + "integrity": "sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==", + "license": "Apache-2.0" }, "node_modules/clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "license": "MIT", "engines": { "node": ">=0.8" } }, - "node_modules/clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==" - }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -814,6 +848,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", "bin": { "crc32": "bin/crc32.njs" }, @@ -851,6 +886,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" }, @@ -874,7 +910,8 @@ "node_modules/diff3": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/diff3/-/diff3-0.0.3.tgz", - "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==" + "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==", + "license": "MIT" }, "node_modules/dunder-proto": { "version": "1.0.1", @@ -1056,18 +1093,20 @@ "node_modules/fast-fifo": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -1087,9 +1126,10 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -1230,6 +1270,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -1254,6 +1295,7 @@ "version": "4.7.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "license": "MIT", "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", @@ -1314,6 +1356,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz", "integrity": "sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==", + "license": "MIT", "engines": { "node": ">=14" } @@ -1378,9 +1421,10 @@ ] }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", "engines": { "node": ">= 4" } @@ -1464,6 +1508,7 @@ "version": "1.25.10", "resolved": "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.25.10.tgz", "integrity": "sha512-IxGiaKBwAdcgBXwIcxJU6rHLk+NrzYaaPKXXQffcA0GW3IUrQXdUPDXDo+hkGVcYruuz/7JlGBiuaeTCgIgivQ==", + "license": "MIT", "dependencies": { "async-lock": "^1.4.1", "clean-git-ref": "^2.0.1", @@ -1487,7 +1532,8 @@ "node_modules/isomorphic-git/node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" }, "node_modules/joycon": { "version": "3.1.1", @@ -1524,18 +1570,6 @@ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -1573,14 +1607,16 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -1593,6 +1629,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1601,6 +1638,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -1612,6 +1650,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -1642,6 +1681,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/minimisted/-/minimisted-2.0.1.tgz", "integrity": "sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==", + "license": "MIT", "dependencies": { "minimist": "^1.2.5" } @@ -1671,6 +1711,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/multi-progress/-/multi-progress-4.0.0.tgz", "integrity": "sha512-9zcjyOou3FFCKPXsmkbC3ethv51SFPoA4dJD6TscIp2pUmy26kBDZW6h9XofPELrzseSkuD7r0V+emGEeo39Pg==", + "license": "MIT", "peerDependencies": { "progress": "^2.0.0" } @@ -1688,7 +1729,8 @@ "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" }, "node_modules/nodemon": { "version": "3.1.10", @@ -1821,7 +1863,8 @@ "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" }, "node_modules/picomatch": { "version": "2.3.1", @@ -1838,6 +1881,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "license": "MIT", "engines": { "node": ">=6" } @@ -1948,6 +1992,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -2013,12 +2058,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] - }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" + ], + "license": "MIT" }, "node_modules/quick-format-unescaped": { "version": "4.0.4", @@ -2055,6 +2096,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -2087,12 +2129,14 @@ "node_modules/remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "license": "ISC" }, "node_modules/replace-ext": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "license": "MIT", "engines": { "node": ">= 10" } @@ -2101,14 +2145,16 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -2149,6 +2195,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -2198,13 +2245,10 @@ "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -2285,6 +2329,7 @@ "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "license": "(MIT AND BSD-3-Clause)", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -2296,7 +2341,8 @@ "node_modules/should-proxy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/should-proxy/-/should-proxy-1.0.4.tgz", - "integrity": "sha512-RPQhIndEIVUCjkfkQ6rs6sOR6pkxJWCNdxtfG5pP0RVgUYbK5911kLTF0TNcCC0G3YCGd492rMollFT2aTd9iQ==" + "integrity": "sha512-RPQhIndEIVUCjkfkQ6rs6sOR6pkxJWCNdxtfG5pP0RVgUYbK5911kLTF0TNcCC0G3YCGd492rMollFT2aTd9iQ==", + "license": "MIT" }, "node_modules/side-channel": { "version": "1.1.0", @@ -2391,7 +2437,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/simple-get": { "version": "4.0.1", @@ -2411,6 +2458,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", @@ -2441,6 +2489,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -2464,12 +2513,12 @@ } }, "node_modules/streamx": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", - "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", + "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", + "license": "MIT", "dependencies": { "fast-fifo": "^1.3.2", - "queue-tick": "^1.0.1", "text-decoder": "^1.1.0" }, "optionalDependencies": { @@ -2511,14 +2560,16 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "license": "MIT", "dependencies": { "streamx": "^2.12.5" } }, "node_modules/text-decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.1.tgz", - "integrity": "sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "license": "Apache-2.0", "dependencies": { "b4a": "^1.6.4" } @@ -2603,9 +2654,10 @@ } }, "node_modules/uglify-js": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.1.tgz", - "integrity": "sha512-y/2wiW+ceTYR2TSSptAhfnEtpLaQ4Ups5zrjB2d3kuVxHj16j/QJwPl5PvuGy9uARb39J0+iKxcRPvtpsx4A4A==", + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "license": "BSD-2-Clause", "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -2641,7 +2693,8 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" }, "node_modules/vary": { "version": "1.1.2", @@ -2653,12 +2706,12 @@ } }, "node_modules/vinyl": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.0.tgz", - "integrity": "sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.1.tgz", + "integrity": "sha512-0QwqXteBNXgnLCdWdvPQBX6FXRHtIH3VhJPTd5Lwn28tJXc34YqSCWUmkOvtJHBmB3gGoPtrOKk3Ts8/kEZ9aA==", + "license": "MIT", "dependencies": { "clone": "^2.1.2", - "clone-stats": "^1.0.0", "remove-trailing-separator": "^1.1.0", "replace-ext": "^2.0.0", "teex": "^1.0.1" @@ -2670,7 +2723,8 @@ "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "license": "MIT" }, "node_modules/wrappy": { "version": "1.0.2", @@ -2681,16 +2735,11 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", "integrity": "sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==", + "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", @@ -2703,6 +2752,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.1.3.tgz", "integrity": "sha512-JCCdmlJJWv7L0q/KylOekyRaUrdEoUxWkWVcgorosTROCFWiS9p2NNPE9Yb91ak7b1N5SxAZEliWpspbZccivw==", + "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3", "pend": "~1.2.0" @@ -2715,6 +2765,7 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3" } @@ -2722,34 +2773,34 @@ }, "dependencies": { "@antora/asciidoc-loader": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/asciidoc-loader/-/asciidoc-loader-3.1.9.tgz", - "integrity": "sha512-flE27T2yI8TX7rUNjbBHWN3iR6s+kBuRBbUPncUFcWjx6mXzll8JLiTkxnc8JXHGzgKlveT+t5AkPYGACLfasg==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/asciidoc-loader/-/asciidoc-loader-3.1.10.tgz", + "integrity": "sha512-np0JkOV37CK7V4eDZUZXf4fQuCKYW3Alxl8FlyzBevXi2Ujv29O82JLbHbv1cyTsvGkGNNB+gzJIx9XBsQ7+Nw==", "requires": { - "@antora/logger": "3.1.9", - "@antora/user-require-helper": "~2.0", + "@antora/logger": "3.1.10", + "@antora/user-require-helper": "~3.0", "@asciidoctor/core": "~2.2" } }, "@antora/cli": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/cli/-/cli-3.1.9.tgz", - "integrity": "sha512-kCUqWX3G/9Pvf8SWZ45ioHwWdOc9uamy2E5/FFwyGiTeu4ubNbadOauLVvMzSZHUxVDnGxXwCsmmQ2HwM919ew==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/cli/-/cli-3.1.10.tgz", + "integrity": "sha512-gp8u9aVM0w1DtWSsB5PwvEfFYKrooPENLhN58RAfdgTrcsTsWw+CDysFZPgEaHB0Y1ZbanR82ZH/f6JVKGcZfQ==", "requires": { - "@antora/logger": "3.1.9", - "@antora/playbook-builder": "3.1.9", - "@antora/user-require-helper": "~2.0", + "@antora/logger": "3.1.10", + "@antora/playbook-builder": "3.1.10", + "@antora/user-require-helper": "~3.0", "commander": "~11.1" } }, "@antora/content-aggregator": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/content-aggregator/-/content-aggregator-3.1.9.tgz", - "integrity": "sha512-g+UzevPSm5c4R0j1U9uysJfdIUfp++QOHIEBmqjhfx/aIEnOL70zA+WF55Mm+syAfzU3877puI27sOp8qtPglw==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/content-aggregator/-/content-aggregator-3.1.10.tgz", + "integrity": "sha512-OT6ZcCA7LrtNfrAZUr3hFh+Z/1isKpsfnqFjCDC66NEMqIyzJO99jq0CM66rYlYhyX7mb5BwEua8lHcwpOXNow==", "requires": { - "@antora/expand-path-helper": "~2.0", - "@antora/logger": "3.1.9", - "@antora/user-require-helper": "~2.0", + "@antora/expand-path-helper": "~3.0", + "@antora/logger": "3.1.10", + "@antora/user-require-helper": "~3.0", "braces": "~3.0", "cache-directory": "~2.0", "fast-glob": "~3.3", @@ -2772,73 +2823,73 @@ } }, "@antora/content-classifier": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/content-classifier/-/content-classifier-3.1.9.tgz", - "integrity": "sha512-PVJqwp5uvZE1PlpeJtb0p6al75fN+fmXGIC6DHcKysRnr0xo+sgz8X2r4mnNWdTWRqum2yVigMmmuXYTg3cJlQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/content-classifier/-/content-classifier-3.1.10.tgz", + "integrity": "sha512-3JJl4IIiTX00v/MirK603NoqIcHjGYAaRWt3Q4U03tI1Fv2Aho/ypO3FE45069jFf0Dx2uDJfp5kapb9gaIjdQ==", "requires": { - "@antora/asciidoc-loader": "3.1.9", - "@antora/logger": "3.1.9", + "@antora/asciidoc-loader": "3.1.10", + "@antora/logger": "3.1.10", "mime-types": "~2.1", "vinyl": "~3.0" } }, "@antora/document-converter": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/document-converter/-/document-converter-3.1.9.tgz", - "integrity": "sha512-pH7tQaIjcPsFdYkaBEAvA/5ki04IQwQGHoR+2jadKdMl6P+J5KA1VzNnMgyIL6gHn7auJIkoOKadfItRB9lHGQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/document-converter/-/document-converter-3.1.10.tgz", + "integrity": "sha512-qi9ctgcKal8tZtWflVo66w+4zCJoBmUKRV+eA9aRRR09KDdU9r514vu1adWNgniPppISr90zD13V5l2JUy/2CQ==", "requires": { - "@antora/asciidoc-loader": "3.1.9" + "@antora/asciidoc-loader": "3.1.10" } }, "@antora/expand-path-helper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@antora/expand-path-helper/-/expand-path-helper-2.0.0.tgz", - "integrity": "sha512-CSMBGC+tI21VS2kGW3PV7T2kQTM5eT3f2GTPVLttwaNYbNxDve08en/huzszHJfxo11CcEs26Ostr0F2c1QqeA==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@antora/expand-path-helper/-/expand-path-helper-3.0.0.tgz", + "integrity": "sha512-7PdEIhk97v85/CSm3HynCsX14TR6oIVz1s233nNLsiWubE8tTnpPt4sNRJR+hpmIZ6Bx9c6QDp3XIoiyu/WYYA==" }, "@antora/file-publisher": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/file-publisher/-/file-publisher-3.1.9.tgz", - "integrity": "sha512-C0VwVjuFbE1CVpZDgwYR1gZCNr1tMw5vueyF9wHZH0KCqAsp9iwo7bwj8wKWMPogxcxdYhnAvtDJnYmYFCuDWQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/file-publisher/-/file-publisher-3.1.10.tgz", + "integrity": "sha512-DPR/0d1P+kr3qV4T0Gh81POEO/aCmNWIp/oLUYAhr0HHOcFzgpTUUoLStgcYynZPFRIB7EYKSab+oYSCK17DGA==", "requires": { - "@antora/expand-path-helper": "~2.0", - "@antora/user-require-helper": "~2.0", + "@antora/expand-path-helper": "~3.0", + "@antora/user-require-helper": "~3.0", "vinyl": "~3.0", "yazl": "~2.5" } }, "@antora/logger": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/logger/-/logger-3.1.9.tgz", - "integrity": "sha512-MKuANodcX0lfRyiB+Rxl/Kv7UOxc2glzTYFoIoBB7uzxF0A+AhvUJDmpGQFRFN2ihxy99N3nLJmZpDebwXyE+A==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/logger/-/logger-3.1.10.tgz", + "integrity": "sha512-WSuIxEP2tVrhWtTj/sIrwBDjpi4ldB/1Kpiu4PXmY4/qeWP8thW6u8nXdwdDcWss5zqkZWjourvWKwVq7y8Wjg==", "requires": { - "@antora/expand-path-helper": "~2.0", + "@antora/expand-path-helper": "~3.0", "pino": "~9.2", "pino-pretty": "~11.2", "sonic-boom": "~4.0" } }, "@antora/navigation-builder": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/navigation-builder/-/navigation-builder-3.1.9.tgz", - "integrity": "sha512-zyl2yNjK31Dl6TRJgnoFb4Czwt9ar3wLTycAdMeZ+U/8YcAUHD8z7NCssPFFvZ0BbUr00NP+gbqDmCr6yz32NQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/navigation-builder/-/navigation-builder-3.1.10.tgz", + "integrity": "sha512-aLMK49nYsSB3mEZbLkmUXDAUYmscv2AFWu+5c3eqVGkQ6Wgyd79WQ6Bz3/TN9YqkzGL+PqGs0G39F0VQzD23Hw==", "requires": { - "@antora/asciidoc-loader": "3.1.9" + "@antora/asciidoc-loader": "3.1.10" } }, "@antora/page-composer": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/page-composer/-/page-composer-3.1.9.tgz", - "integrity": "sha512-X6Qj+J5dfFAGXoCAOaA+R6xRp8UoNMDHsRsB1dUTT2QNzk1Lrq6YkYyljdD2cxkWjLVqQ/pQSP+BJVNFGbqDAQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/page-composer/-/page-composer-3.1.10.tgz", + "integrity": "sha512-JoEg8J8HVsnPmAgUrYSGzf0C8rQefXyCi/18ucy0utyfUvlJNsZvUbGUPx62Het9p0JP0FkAz2MTLyDlNdArVg==", "requires": { - "@antora/logger": "3.1.9", + "@antora/logger": "3.1.10", "handlebars": "~4.7", "require-from-string": "~2.0" } }, "@antora/playbook-builder": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/playbook-builder/-/playbook-builder-3.1.9.tgz", - "integrity": "sha512-MJ/OWz4pReC98nygGTXC5bOL/TDDtCYpSkHFBz2ST4L6tuM8rv9c5+cp//JkwY/QlTOvcuJ0f2xq4a7a5nI7Qw==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/playbook-builder/-/playbook-builder-3.1.10.tgz", + "integrity": "sha512-UB8UmRYfkKgActTUlotdVS4FKGjaZgTnSXE7Fns1xb3/3HRanWvI+Yze1OmCkGC33cTpoQFnSYp7ySEH8LaiBw==", "requires": { "@iarna/toml": "~2.2", "convict": "~6.2", @@ -2847,65 +2898,65 @@ } }, "@antora/redirect-producer": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/redirect-producer/-/redirect-producer-3.1.9.tgz", - "integrity": "sha512-9OLwoMhqifsBxTebInh/5W16GdDsdj+YkKG3TiCASlAOYsDbuhbeRPFUlyKKSRkMrtKKnFgHR0Z3DNPXYlH2NQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/redirect-producer/-/redirect-producer-3.1.10.tgz", + "integrity": "sha512-IbWJGh6LmsxJQ821h0B9JfooofFZBgFLZxsbp/IoTLkBFGLFAY5tDRvB6rvubfNLRoSjM8VjEUXGqVLlwZOb+g==", "requires": { "vinyl": "~3.0" } }, "@antora/site-generator": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/site-generator/-/site-generator-3.1.9.tgz", - "integrity": "sha512-YYESPG22tGX1CxRPSAr6acKILCO8JfGkM1OYc7Sw3D7ZvCy1YgZMAaTYK0T5yl9LXg+l/UZi1xq/Ej0qHnYQiw==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/site-generator/-/site-generator-3.1.10.tgz", + "integrity": "sha512-NCULYtwUjIyr5FGCymhfG/zDVUmZ6pfmCPorka8mAzo4/GDx1T7bgaRL9rEIyf2AMqcm7apQiAz03mpU4kucsw==", "requires": { - "@antora/asciidoc-loader": "3.1.9", - "@antora/content-aggregator": "3.1.9", - "@antora/content-classifier": "3.1.9", - "@antora/document-converter": "3.1.9", - "@antora/file-publisher": "3.1.9", - "@antora/logger": "3.1.9", - "@antora/navigation-builder": "3.1.9", - "@antora/page-composer": "3.1.9", - "@antora/playbook-builder": "3.1.9", - "@antora/redirect-producer": "3.1.9", - "@antora/site-mapper": "3.1.9", - "@antora/site-publisher": "3.1.9", - "@antora/ui-loader": "3.1.9", - "@antora/user-require-helper": "~2.0" + "@antora/asciidoc-loader": "3.1.10", + "@antora/content-aggregator": "3.1.10", + "@antora/content-classifier": "3.1.10", + "@antora/document-converter": "3.1.10", + "@antora/file-publisher": "3.1.10", + "@antora/logger": "3.1.10", + "@antora/navigation-builder": "3.1.10", + "@antora/page-composer": "3.1.10", + "@antora/playbook-builder": "3.1.10", + "@antora/redirect-producer": "3.1.10", + "@antora/site-mapper": "3.1.10", + "@antora/site-publisher": "3.1.10", + "@antora/ui-loader": "3.1.10", + "@antora/user-require-helper": "~3.0" } }, "@antora/site-generator-default": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/site-generator-default/-/site-generator-default-3.1.9.tgz", - "integrity": "sha512-m/QCv2o/24VmWZaeqtc6nNEky///GTLLx/pyyihP7uWKvZ0AhGPp6Agv1yaShjKIthBzHJ3JozaMPev2leor+A==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/site-generator-default/-/site-generator-default-3.1.10.tgz", + "integrity": "sha512-dMhjbklthysj3espwYNkTkADm2Z3EbWThq9gJv/ZuSXGZSXVSwt8b3mBpCTwxOeAKIldnj3fc1pzQxei/7PC2w==", "requires": { - "@antora/site-generator": "3.1.9" + "@antora/site-generator": "3.1.10" } }, "@antora/site-mapper": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/site-mapper/-/site-mapper-3.1.9.tgz", - "integrity": "sha512-9FCObL+JIjBoby8z+beu2uuvAtCjm5EsEQt+16gCIMX1ktVP3W3gVsdRSvVcGcVEpizILFhMawkcQknZPUp5mg==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/site-mapper/-/site-mapper-3.1.10.tgz", + "integrity": "sha512-KY1j/y0uxC2Y7RAo4r4yKv9cgFm8aZoRylZXEODJnwj3tffbZ2ZdRzSWHp6fN0QX/Algrr9JNd9CWrjcj2f3Zw==", "requires": { - "@antora/content-classifier": "3.1.9", + "@antora/content-classifier": "3.1.10", "vinyl": "~3.0" } }, "@antora/site-publisher": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/site-publisher/-/site-publisher-3.1.9.tgz", - "integrity": "sha512-L5To8f4QswZliXu6yB6O7O8CuBbLctjNbxZqP3m0FP7VaOONp85ftzEq1BFEm4BXXSwH1n4ujZx1qGBHP9ooOQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/site-publisher/-/site-publisher-3.1.10.tgz", + "integrity": "sha512-G4xcUWvgth8oeEQwiu9U1cE0miQtYHwKHOobUbDBt2Y6LlC5H31zQQmAyvMwTsGRlvYRgLVtG6j9d6JBwQ6w9Q==", "requires": { - "@antora/file-publisher": "3.1.9" + "@antora/file-publisher": "3.1.10" } }, "@antora/ui-loader": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@antora/ui-loader/-/ui-loader-3.1.9.tgz", - "integrity": "sha512-g0/9dRE5JVMYukIU3x+Rvr41bPdK3sUD2xQIAniRjE6usIZs1mEsTGshVKVEoOqqnSekXE85HVhybjNHsC+qbQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/@antora/ui-loader/-/ui-loader-3.1.10.tgz", + "integrity": "sha512-H1f5wI5a5HjLuE/Wexvc8NZy8w83Bhqjka7t1DbwOOqP+LyxFGLx/QbBVKdTtgFNDHVMtNBlplQq0ixeoTSh0A==", "requires": { - "@antora/expand-path-helper": "~2.0", + "@antora/expand-path-helper": "~3.0", "braces": "~3.0", "cache-directory": "~2.0", "fast-glob": "~3.3", @@ -2926,17 +2977,17 @@ } }, "@antora/user-require-helper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@antora/user-require-helper/-/user-require-helper-2.0.0.tgz", - "integrity": "sha512-5fMfBZfw4zLoFdDAPMQX6Frik90uvfD8rXOA4UpXPOUikkX4uT1Rk6m0/4oi8oS3fcjiIl0k/7Nc+eTxW5TcQQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@antora/user-require-helper/-/user-require-helper-3.0.0.tgz", + "integrity": "sha512-KIXb8WYhnrnwH7Jj21l1w+et9k5GvcgcqvLOwxqWLEd0uVZOiMFdqFjqbVm3M+zcrs1JXWMeh2LLvxBbQs3q/Q==", "requires": { - "@antora/expand-path-helper": "~2.0" + "@antora/expand-path-helper": "~3.0" } }, "@asciidoctor/core": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/@asciidoctor/core/-/core-2.2.6.tgz", - "integrity": "sha512-TmB2K5UfpDpSbCNBBntXzKHcAk2EA3/P68jmWvmJvglVUdkO9V6kTAuXVe12+h6C4GK0ndwuCrHHtEVcL5t6pQ==", + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@asciidoctor/core/-/core-2.2.8.tgz", + "integrity": "sha512-oozXk7ZO1RAd/KLFLkKOhqTcG4GO3CV44WwOFg2gMcCsqCUTarvMT7xERIoWW2WurKbB0/ce+98r01p8xPOlBw==", "requires": { "asciidoctor-opal-runtime": "0.3.3", "unxhr": "1.0.1" @@ -2948,14 +2999,17 @@ "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==" }, "@neo4j-antora/antora-add-notes": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@neo4j-antora/antora-add-notes/-/antora-add-notes-0.3.1.tgz", - "integrity": "sha512-0zapKJr9U+cNBaz5m342Zqb5+1VuaFuybhGtSzEdiG4MRmvsAZunxLX7lSG0cWm6L4DlQa0jzOKYYzpkqoap/g==" + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@neo4j-antora/antora-add-notes/-/antora-add-notes-0.3.2.tgz", + "integrity": "sha512-Jsv17dEBELSkqplEIZE9b5I2zjYPvoHi4momLRt1FfBRQnBTWbk4kkf2JQojRJ8mQEVscj2tApfTDOAUtAOSLA==" }, "@neo4j-antora/antora-modify-sitemaps": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@neo4j-antora/antora-modify-sitemaps/-/antora-modify-sitemaps-0.4.4.tgz", - "integrity": "sha512-IkXoilOJquZPB5G5ZhrgfSN6U3E2YToWakehtF55RA+CNQS0KboTAB2vUH01+Tkmkd8K6UElf41A6cGnnrvs0g==" + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@neo4j-antora/antora-modify-sitemaps/-/antora-modify-sitemaps-0.7.1.tgz", + "integrity": "sha512-1XA4mfThu31PFEYvP8emBUruf7AT3C3/kjRv1yiB1NXcHESLM2mhpT64YwPNq6SRSGdWEGwQceSsM+CuHLZCwA==", + "requires": { + "semver": "^7.6.3" + } }, "@neo4j-antora/antora-page-roles": { "version": "0.3.2", @@ -2963,9 +3017,10 @@ "integrity": "sha512-RqmMHcTyM87lJAhjSPdkoUzFxQCjsM2N4+ryVK4GIahAJyNV9OYydBrsjGrDbIh6F4YS+LWG+SXyvLD2zJ1keQ==" }, "@neo4j-antora/antora-table-footnotes": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@neo4j-antora/antora-table-footnotes/-/antora-table-footnotes-0.3.2.tgz", - "integrity": "sha512-DXEGVHMJumoKiY/ZCaGRTXl2OhPziPCHT+arj18TmpU50sUs+hyjOPuTkUXUvBwNZwm109Nm1PJPvKLVIJCZSg==" + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@neo4j-antora/antora-table-footnotes/-/antora-table-footnotes-0.3.3.tgz", + "integrity": "sha512-0vKB9nMJpfZdKTJc5vOJrNCFTcae61rnw9XyPQX2aibJN4vUTEeKhIS6IaVJWW5M1CflVIU3LoZDpDzeA/GEHw==", + "requires": {} }, "@neo4j-antora/mark-terms": { "version": "1.1.0", @@ -3100,9 +3155,9 @@ "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" }, "b4a": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", - "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==" + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==" }, "balanced-match": { "version": "1.0.2", @@ -3110,9 +3165,9 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "bare-events": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", - "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", "optional": true }, "base64-js": { @@ -3245,11 +3300,6 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==" - }, "colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -3476,15 +3526,15 @@ "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" }, "fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "6.0.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" } }, "fast-redact": { @@ -3498,9 +3548,9 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, "fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "requires": { "reusify": "^1.0.4" } @@ -3691,9 +3741,9 @@ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==" + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==" }, "ignore-by-default": { "version": "1.0.1", @@ -3802,15 +3852,6 @@ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, "math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -3835,9 +3876,9 @@ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "requires": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -4143,11 +4184,6 @@ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, - "queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" - }, "quick-format-unescaped": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", @@ -4211,9 +4247,9 @@ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==" }, "router": { "version": "2.2.0", @@ -4263,13 +4299,9 @@ "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" }, "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==" }, "send": { "version": "1.2.0", @@ -4436,13 +4468,12 @@ "dev": true }, "streamx": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", - "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", + "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", "requires": { "bare-events": "^2.2.0", "fast-fifo": "^1.3.2", - "queue-tick": "^1.0.1", "text-decoder": "^1.1.0" } }, @@ -4477,9 +4508,9 @@ } }, "text-decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.1.tgz", - "integrity": "sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", "requires": { "b4a": "^1.6.4" } @@ -4544,9 +4575,9 @@ } }, "uglify-js": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.1.tgz", - "integrity": "sha512-y/2wiW+ceTYR2TSSptAhfnEtpLaQ4Ups5zrjB2d3kuVxHj16j/QJwPl5PvuGy9uARb39J0+iKxcRPvtpsx4A4A==", + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", "optional": true }, "undefsafe": { @@ -4578,12 +4609,11 @@ "dev": true }, "vinyl": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.0.tgz", - "integrity": "sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.1.tgz", + "integrity": "sha512-0QwqXteBNXgnLCdWdvPQBX6FXRHtIH3VhJPTd5Lwn28tJXc34YqSCWUmkOvtJHBmB3gGoPtrOKk3Ts8/kEZ9aA==", "requires": { "clone": "^2.1.2", - "clone-stats": "^1.0.0", "remove-trailing-separator": "^1.1.0", "replace-ext": "^2.0.0", "teex": "^1.0.1" @@ -4604,12 +4634,6 @@ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", "integrity": "sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==" }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", diff --git a/package.json b/package.json index a114ccd79..5dedcd33e 100644 --- a/package.json +++ b/package.json @@ -19,12 +19,12 @@ "author": "Neo4j", "license": "ISC", "dependencies": { - "@antora/cli": "^3.1.9", - "@antora/site-generator-default": "^3.1.9", - "@neo4j-antora/antora-add-notes": "^0.3.1", - "@neo4j-antora/antora-modify-sitemaps": "^0.4.4", + "@antora/cli": "^3.1.10", + "@antora/site-generator-default": "^3.1.10", + "@neo4j-antora/antora-add-notes": "^0.3.2", + "@neo4j-antora/antora-modify-sitemaps": "^0.7.1", "@neo4j-antora/antora-page-roles": "^0.3.1", - "@neo4j-antora/antora-table-footnotes": "^0.3.2", + "@neo4j-antora/antora-table-footnotes": "^0.3.3", "@neo4j-antora/mark-terms": "1.1.0", "@neo4j-documentation/macros": "^1.0.4", "@neo4j-documentation/remote-include": "^1.0.0", From 6a05b2f3e1e9b69d84790460a0f96805528bf672 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Tue, 24 Jun 2025 10:07:52 +0200 Subject: [PATCH 10/72] introduction note about Cypher 25 (#1320) --- modules/ROOT/pages/introduction/index.adoc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/modules/ROOT/pages/introduction/index.adoc b/modules/ROOT/pages/introduction/index.adoc index 01fef1f03..db46e6935 100644 --- a/modules/ROOT/pages/introduction/index.adoc +++ b/modules/ROOT/pages/introduction/index.adoc @@ -7,11 +7,17 @@ ifndef::backend-pdf[] :description: This section provides an introduction to the Cypher query language. endif::[] -Welcome to the Neo4j Cypher Manual. +Welcome to the Neo4j Cypher Manual. -Cypher is Neo4j’s declarative query language, allowing users to unlock the full potential of property graph databases. +Cypher is Neo4j’s declarative query language, allowing users to unlock the full potential of property graph databases. -The Cypher Manual aims to be as instructive as possible to readers from a variety of backgrounds and professions, such as developers, administrators, and academic researchers. +[NOTE] +This manual covers Cypher 25. +As of Neo4j 2025.06, all new Cypher features are exclusively added to Cypher 25, while Cypher 5 is frozen. +For information about how to how to use Cypher 25, see xref:queries/select-version.adoc[]. +For information about new features added to Cypher 25, see xref:deprecations-additions-removals-compatibility.adoc[]. + +The Cypher Manual aims to be as instructive as possible to readers from a variety of backgrounds and professions, such as developers, administrators, and academic researchers. If you are new to Cypher and Neo4j, you can visit the link:{neo4j-docs-base-uri}/getting-started/current/cypher-intro/[Getting Started Guide -> Introduction to Cypher] chapter. Additionally, https://graphacademy.neo4j.com/[Neo4j GraphAcademy] has a variety of free courses tailored for all levels of experience. From 17d3ce36c6b825008e7a884166dc6e6627e4acff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nadja=20M=C3=BCller?= <73830555+nadja-muller@users.noreply.github.com> Date: Tue, 24 Jun 2025 12:30:53 +0200 Subject: [PATCH 11/72] update removals & deprecations for graph references (#1315) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit see also: https://github.com/neo4j/docs-status-codes/pull/340 --------- Co-authored-by: Jens Pryce-Åklundh <112686610+JPryce-Aklundh@users.noreply.github.com> --- ...ions-additions-removals-compatibility.adoc | 42 +++++++++++++++---- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc index 5715f481c..ba704be56 100644 --- a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc +++ b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc @@ -51,6 +51,20 @@ CREATE DATABASE db OPTIONS { existingDataSeedInstance: ... } | The option `existingDataSeedInstance` is removed from the `CREATE DATABASE` `OPTIONS` map and replaced by `existingDataSeedServer`. For more information, see link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/standard-databases/create-databases/#manage-databases-create-database-options[Operations Manual -> Database administration -> Create databases]. +a| +[#_graph_reference_removed_name_parts_quoting] +label:functionality[] +label:removed[] +[source, cypher, role=noheader] +---- +CREATE ALIAS composite.`1` FOR DATABASE neo4j +---- +[source, cypher, role=noheader] +---- +USE composite.`1` +---- +| Graph references with separately backticked name parts have been removed. Use parameters or backtick the entire name, e.g. `USE `composite.1`` + a| label:functionality[] @@ -278,6 +292,7 @@ Several xref:clauses/transaction-clauses.adoc#query-listing-transactions[`SHOW * The current query-related columns — `currentQuery`, `currentQueryId`, `parameters`, `planner`, `runtime`, `indexes`, `currentQueryStartTime`, `currentQueryElapsedTime`, `currentQueryCpuTime`, `currentQueryIdleTime`, and `currentQueryStatus` — now return `null` when no query is executing. a| +[#_graph_reference_updated_graph_by_name_quotes] label:functionality[] label:updated[] [source, cypher, role="noheader"] @@ -732,9 +747,16 @@ label:deprecated[] USE my.db ... ---- -| In xref:clauses/use.adoc[`USE`] clauses, databases and aliases with unquoted `.` are deprecated unless the `.` is used to indicate that the database or alias belongs to a composite database. -Names containing `.` should be quoted using backticks. -For example, `USE `my.db`` is valid. +a| The use of unquoted `.` characters in xref:clauses/use.adoc[`USE`] clauses when specifying databases and aliases was deprecated in 5.26, except when `.` indicated that the database or alias belonged to a composite database. +However, this deprecation was withdrawn in Neo4j 2025.06, and replaced by the following updates in Cypher 25: + +* xref::deprecations-additions-removals-compatibility.adoc#_graph_reference_removed_name_parts_quoting[Removed support for quoted name parts in graph references] + +* xref::deprecations-additions-removals-compatibility.adoc#_graph_reference_updated_graph_by_name_quotes[Update to graph functions] + +This is because the previous quoting rules were inconsistent and ambiguous. +The rules are clarified and improved in Cypher 25. +For more information, see xref::values-and-types/graph-references.adoc#rules[Graph reference rules] |=== @@ -3353,12 +3375,16 @@ label:deprecated[] CREATE DATABASE databaseName.withDot ... ---- a| -Creating a database with dots in the name has been deprecated, instead quote the database name using backticks: +Creating a database with . characters was deprecated in 5.0. +However, this deprecation was withdrawn in 2025.06, and replaced by the following updates in Cypher 25: -[source, cypher, role="noheader"] ----- -CREATE DATABASE `databaseName.withDot` ... ----- +* xref::deprecations-additions-removals-compatibility.adoc#_graph_reference_removed_name_parts_quoting[Removed support for quoted name parts in graph references] + +* xref::deprecations-additions-removals-compatibility.adoc#_graph_reference_updated_graph_by_name_quotes[Update to graph functions] + +This is because the previous quoting rules were inconsistent and ambiguous. +The rules are clarified and improved in Cypher 25. +For more information, see xref::values-and-types/graph-references.adoc#rules[Graph reference rules] a| [[cypher-5_0-d_4]] From dac419b6b24bfd0ee9816cab7c5b1360ab3ab4b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Tue, 24 Jun 2025 14:07:30 +0200 Subject: [PATCH 12/72] fix link --- modules/ROOT/pages/queries/select-version.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/queries/select-version.adoc b/modules/ROOT/pages/queries/select-version.adoc index e21b9102f..36dc28eb0 100644 --- a/modules/ROOT/pages/queries/select-version.adoc +++ b/modules/ROOT/pages/queries/select-version.adoc @@ -32,7 +32,7 @@ Although Cypher 5 queries are currently supported on Neo4j 2025.06+ databases, t [[select-default-cypher-version]] == Select the default Cypher version for a database -Databases created on, or migrated to, Neo4j 2025.06 or later will continue to have Cypher 5 as their default language (unless {neo4j-docs-base-uri}/operations-manual/current/configuration/configuration-settings/#config_db.query.default_language[`db.query.default_language`] is set to `CYPHER_25`). +Databases created on, or migrated to, Neo4j 2025.06 or later will continue to have Cypher 5 as their default language (unless link:{neo4j-docs-base-uri}/operations-manual/current/configuration/configuration-settings/#config_db.query.default_language[`db.query.default_language`] is set to `CYPHER_25`). This is true for link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/#manage-database-systems[system, standard, and composite] Neo4j databases. However, it is possible to set a different default language on both new and existing system, standard, and composite databases. From 8cc167e8f7acd817c6521be84f2b687945508fdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Tue, 24 Jun 2025 16:06:12 +0200 Subject: [PATCH 13/72] conditional query graph (#1322) --- .../ROOT/images/conditional-query-graph.svg | 27 +++++++++++++++++++ .../ROOT/images/conditional_query_graph.svg | 1 - .../composed-queries/conditional-queries.adoc | 2 +- 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 modules/ROOT/images/conditional-query-graph.svg delete mode 100644 modules/ROOT/images/conditional_query_graph.svg diff --git a/modules/ROOT/images/conditional-query-graph.svg b/modules/ROOT/images/conditional-query-graph.svg new file mode 100644 index 000000000..ad6012dc5 --- /dev/null +++ b/modules/ROOT/images/conditional-query-graph.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/ROOT/images/conditional_query_graph.svg b/modules/ROOT/images/conditional_query_graph.svg deleted file mode 100644 index 4e3d7b1a0..000000000 --- a/modules/ROOT/images/conditional_query_graph.svg +++ /dev/null @@ -1 +0,0 @@ -WORKS_FORWORKS_FORWORKS_FORLOVESLOVESPersonname:'Alice'age:65Personname:'Bob'age:25Personname:'Charlie'age:61Personname:'Daniel'age:39Personname:'Eskil'age:39 \ No newline at end of file diff --git a/modules/ROOT/pages/queries/composed-queries/conditional-queries.adoc b/modules/ROOT/pages/queries/composed-queries/conditional-queries.adoc index ad42adf29..02cada893 100644 --- a/modules/ROOT/pages/queries/composed-queries/conditional-queries.adoc +++ b/modules/ROOT/pages/queries/composed-queries/conditional-queries.adoc @@ -13,7 +13,7 @@ For information about using `WHEN` branches in expressions, see xref:expressions The following graph is used for the examples below: -image::conditional_query_graph.svg[width="700",role="middle"] +image::conditional-query-graph.svg[Example graph with persons connected by works for and loves relationships, width=600,role=popup] To recreate the graph, run the following query against an empty Neo4j database: From a712679858710b873e433ab2ac6b4e3b2a389732 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Wed, 25 Jun 2025 09:27:36 +0200 Subject: [PATCH 14/72] add cypher-5 to pr checks (#1324) --- .github/workflows/docs-pr-checks.yml | 5 +---- .github/workflows/docs-teardown.yml | 5 ++--- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/.github/workflows/docs-pr-checks.yml b/.github/workflows/docs-pr-checks.yml index 0776f03d1..a3cd44cc8 100644 --- a/.github/workflows/docs-pr-checks.yml +++ b/.github/workflows/docs-pr-checks.yml @@ -6,10 +6,7 @@ on: branches: - "dev" - "cypher-25" - - "5.x" - - "4.[0-9]" - - "3.5" - + - "cypher-5" jobs: diff --git a/.github/workflows/docs-teardown.yml b/.github/workflows/docs-teardown.yml index 3434992ef..936c829a3 100644 --- a/.github/workflows/docs-teardown.yml +++ b/.github/workflows/docs-teardown.yml @@ -6,9 +6,8 @@ on: branches: - "dev" - "cypher-25" - - "5.x" - - "4.[0-9]" - - "3.5" + - "cypher-5" + types: - closed From 681440716c408fa18a33edeef81a0ba811ee93f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Thu, 26 Jun 2025 11:53:19 +0200 Subject: [PATCH 15/72] 2025.07 antora update (#1326) --- antora.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/antora.yml b/antora.yml index 63677c6f2..817290de9 100644 --- a/antora.yml +++ b/antora.yml @@ -7,4 +7,4 @@ nav: - modules/ROOT/content-nav.adoc asciidoc: attributes: - neo4j-version: '2025.06' + neo4j-version: '2025.07' From 26933f2d3963508fcaae5c06d27f790e73a0e3ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Fri, 27 Jun 2025 08:43:47 +0200 Subject: [PATCH 16/72] Add language version control commands to Additions page (#1314) This should be added to the Cypher 5 page as well (as new to Cypher 5). --------- Co-authored-by: Therese Magnusson --- ...ions-additions-removals-compatibility.adoc | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc index ba704be56..675025fe5 100644 --- a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc +++ b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc @@ -341,6 +341,112 @@ a| label:functionality[] label:new[] +[source, cypher, role="noheader"] +---- +CREATE [COMPOSITE] DATABASE actors SET DEFAULT LANGUAGE CYPHER 25 +---- + +a| Set the default Cypher version for a standard or composite database when creating it. +The available versions are `CYPHER 25` and `CYPHER 5`. +If not specified, the default language for the database is set to the default language of the DBMS. +For more information, see the following sections in the Operations Manual: + +* link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/standard-databases/create-databases/#_set_a_default_cypher_version_for_a_standard_database[Set a default Cypher version for a standard database]. +* link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/composite-databases/create-composite-databases/#composite-databases-default-language[Set the default Cypher version for a composite database]. + +a| +label:functionality[] +label:new[] + +[source, cypher, role="noheader"] +---- +CREATE ALIAS `remote-with-default-language` +FOR DATABASE `northwind-graph-2020` + AT "neo4j+s://location:7687" + USER alice + PASSWORD 'example_secret' + DEFAULT LANGUAGE CYPHER 25 +---- + +a| Set the default Cypher version for a remote database alias when creating it. +The available versions are `CYPHER 5` and `CYPHER 25`. +Local database aliases and database aliases in composite databases cannot be assigned a default Cypher version. +Local database aliases always have the Cypher version of their target database and database aliases in composite databases always have the Cypher version of the composite database they belong to. +For more information, see the link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/aliases/manage-aliases-standard-databases/#_set_a_default_cypher_version_for_remote_database_aliases[Operations Manual -> Set a default Cypher version for remote database aliases]. + +a| +label:functionality[] +label:new[] +[source, cypher, role="noheader"] +---- +ALTER DATABASE movies SET DEFAULT LANGUAGE CYPHER 25 +---- + +a| Alter the default Cypher version of an existing standard or composite database. +The available versions are `CYPHER 25` and `CYPHER 5`. +For more information, see the link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/standard-databases/alter-databases/#alter-database-default-language[Operations Manual -> Alter the default Cypher version of an existing database]. + +a| +label:functionality[] +label:new[] + +[source, cypher, role="noheader"] +---- +ALTER ALIAS `remote-with-default-language` SET DATABASE DEFAULT LANGUAGE CYPHER 25 +---- + +a| Alter the default Cypher version of a remote database alias. +The available versions are `CYPHER 25` and `CYPHER 5`. +It is not possible to alter the default Cypher version of a local database alias or an alias belonging to a composite database. +Local database aliases always have the Cypher version of their target database and aliases belonging to composite databases always have the Cypher version of the composite database. +For more information, see the link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/aliases/manage-aliases-standard-databases/#alter-default-language-remote-database-alias[Operations Manual -> Alter the default Cypher version of a remote database alias]. + +a| +label:functionality[] +label:new[] + +[source, cypher, role="noheader"] +---- +SHOW DATABASES YIELD name, defaultLanguage +---- + +a| The new return column `defaultLanguage` for the `SHOW DATABASE` command returns the default language of a database. +This column is not returned by default; it can only be returned using `YIELD`. +For more information, see the link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/standard-databases/listing-databases/#_show_the_default_cypher_version_of_a_database[Operations Manual -> Show the default Cypher version of a database]. + +a| +label:functionality[] +label:new[] + +[source, cypher, role="noheader"] +---- +SHOW ALIAS `remote-with-default-language` FOR DATABASE YIELD name, defaultLanguage +---- + +a| The new return column `defaultLanguage` for the `SHOW ALIAS` command returns the default language of a database alias. +This column is not returned by default; it can only be returned using `YIELD`. +For more information, see the link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/aliases/manage-aliases-standard-databases/#manage-aliases-list[Operations Manual -> List database aliases]. + +a| +label:functionality[] +label:new[] + +[source, cypher, role="noheader"] +---- +CYPHER 25 +MATCH (n:Person) +FILTER n.age < 35 +RETURN n.name AS name +---- + +a| New query option: `CYPHER 25`. +Prepending a query with `CYPHER 25` ensures that a query is run with Cypher 25, regardless of the default language of a database. +(The ability to select `CYPHER 5` was introduced in Neo4j 5.21). + +a| +label:functionality[] +label:new[] + [source, cypher, role="noheader"] ---- RETURN 1 AS a From 854b3c3a5d486cae64d03c3fe5e2b1a79d34f155 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Fri, 27 Jun 2025 10:21:11 +0200 Subject: [PATCH 17/72] Add cheat sheet tags for language version options (#1330) --- modules/ROOT/pages/queries/select-version.adoc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/queries/select-version.adoc b/modules/ROOT/pages/queries/select-version.adoc index 36dc28eb0..f418409cb 100644 --- a/modules/ROOT/pages/queries/select-version.adoc +++ b/modules/ROOT/pages/queries/select-version.adoc @@ -182,12 +182,14 @@ It is, therefore, recommended to set the default language to Cypher 25 and migra ====== .Cypher 25 query on a Neo4j 2025.06+ database with Cypher 5 as default language +// tag::queries_select_version_cypher_25[] [source,cypher] ---- CYPHER 25 MATCH (n:Order)-[r:SHIPPED_TO]->(:Address) SET n = properties(r) ---- +// end::queries_select_version_cypher_25[] ====== @@ -195,19 +197,21 @@ SET n = properties(r) ====== .Cypher 5 query on a Neo4j 2025.06+ database with Cypher 25 as default language +// tag::queries_select_version_cypher_5[] [source,cypher] ---- CYPHER 5 MATCH (n:Order)-[r:SHIPPED_TO]->(:Address) SET n = r ---- +// end::queries_select_version_cypher_5[] ====== ===== -Selecting `CYPHER 25` ensures that the query will be executed using the language as it exists in the version of Neo4j that the database is currently running, provided it is on Neo4j 2025.06 or later. +Selecting `CYPHER 25` ensures that the query will be executed using Cypher 25 as it exists in the version of Neo4j that the database is currently running, provided it is on Neo4j 2025.06 or later. -Selecting `CYPHER 5` ensures that the query will be executed using the language as it existed at the time of the Neo4j 2025.06 release. +Selecting `CYPHER 5` ensures that the query will be executed using Cypher 5 as it existed at the time of the Neo4j 2025.06 release. Any changes introduced after the 2025.06 release will not affect the query. [[procedures-and-functions]] From 3d3070df2fad56cdf1306aa9a8ced52fb59ee212 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Fri, 27 Jun 2025 11:24:38 +0200 Subject: [PATCH 18/72] minor fix to select version (#1331) --- modules/ROOT/pages/queries/index.adoc | 2 +- modules/ROOT/pages/queries/select-version.adoc | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/ROOT/pages/queries/index.adoc b/modules/ROOT/pages/queries/index.adoc index f0917ffdf..85d6c36c5 100644 --- a/modules/ROOT/pages/queries/index.adoc +++ b/modules/ROOT/pages/queries/index.adoc @@ -6,7 +6,7 @@ It also explains how to select the version of Cypher in which queries are run, a * xref:queries/concepts.adoc[] * xref:queries/basic.adoc[] -* xref:queries/select-version.adoc[] +* xref:queries/select-version.adoc[] label:new[Introduced in Neo4j 2025.06] * xref:queries/composed-queries/index.adoc[] ** xref:queries/composed-queries/combined-queries.adoc[] ** xref:queries/composed-queries/conditional-queries.adoc[] label:new[Introduced in Neo4j 2025.06] diff --git a/modules/ROOT/pages/queries/select-version.adoc b/modules/ROOT/pages/queries/select-version.adoc index f418409cb..a4472e655 100644 --- a/modules/ROOT/pages/queries/select-version.adoc +++ b/modules/ROOT/pages/queries/select-version.adoc @@ -1,4 +1,5 @@ :description: Information about how to select Cypher version for queries or databases. +:page-role: new-2025.06 = Select Cypher version @@ -98,9 +99,9 @@ ALTER DATABASE actors SET DEFAULT LANGUAGE CYPHER 5 ====== ===== -Selecting `CYPHER 25` ensures that all queries run on that database will be executed using the language as it exists in the version of Neo4j that the database is currently running, provided it is on Neo4j 2025.06 or later (unless a query is prepended with xref:selection-query-cypher-version[`CYPHER 5`], which overrides this default). +Selecting `CYPHER 25` ensures that all queries run on that database will be executed using Cypher 25 as it exists in the version of Neo4j that the database is currently running, provided it is on Neo4j 2025.06 or later (unless a query is prepended with xref:selection-query-cypher-version[`CYPHER 5`], which overrides this default). -Selecting `CYPHER 5` as the default database language ensures that all queries run on that database uses the language as it existed at the time of the Neo4j 2025.06 release (unless a query is prepended with xref:selection-query-cypher-version[`CYPHER 25`], which overrides this default). +Selecting `CYPHER 5` as the default database language ensures that all queries run on that database uses Cypher 5 as it existed at the time of the Neo4j 2025.06 release (unless a query is prepended with xref:selection-query-cypher-version[`CYPHER 25`], which overrides this default). Any changes introduced after the 2025.06 release will not affect the semantics of the query. [[config-database-upgrades]] From bd97e08423b04f76416db3885ba1049b495dcabf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Fri, 27 Jun 2025 13:59:04 +0200 Subject: [PATCH 19/72] Fix last remaining broken links (#1332) --- .../pages/appendix/gql-conformance/supported-optional.adoc | 2 +- .../expressions/predicates/type-predicate-expressions.adoc | 4 ++-- modules/ROOT/pages/patterns/match-modes.adoc | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/ROOT/pages/appendix/gql-conformance/supported-optional.adoc b/modules/ROOT/pages/appendix/gql-conformance/supported-optional.adoc index 7d915ee08..6039fc510 100644 --- a/modules/ROOT/pages/appendix/gql-conformance/supported-optional.adoc +++ b/modules/ROOT/pages/appendix/gql-conformance/supported-optional.adoc @@ -106,7 +106,7 @@ These codes order the features in the table below. | GD01 | Updatable graphs -| xref:clauses/clause-composition.adoc#writing-clauses[Cypher clauses -> Writing clauses] +| xref:clauses/index.adoc#writing-clauses[Cypher clauses -> Writing clauses] | * Feature GD01 implies compliance with GQL feature GT01, "Explicit transaction commands", which states that conforming languages shall contain the following transaction control commands: `START TRANSACTION`, `ROLLBACK`, and `COMMIT`. These are not present in Cypher. However, Neo4j offers transaction management through the link:{neo4j-docs-base-uri}/create-applications[driver] transaction API. diff --git a/modules/ROOT/pages/expressions/predicates/type-predicate-expressions.adoc b/modules/ROOT/pages/expressions/predicates/type-predicate-expressions.adoc index 90eaa9872..0e6691859 100644 --- a/modules/ROOT/pages/expressions/predicates/type-predicate-expressions.adoc +++ b/modules/ROOT/pages/expressions/predicates/type-predicate-expressions.adoc @@ -64,8 +64,8 @@ RETURN val, val IS NOT :: STRING AS notString |=== -[[type-predicate-NULL]] -== Type predicate expressions for NULL +[[type-predicate-null]] +== Type predicate expressions for null All Cypher types includes the `null` value. Type predicate expressions can be appended with `NOT NULL`. diff --git a/modules/ROOT/pages/patterns/match-modes.adoc b/modules/ROOT/pages/patterns/match-modes.adoc index 57b941c34..c59a8a885 100644 --- a/modules/ROOT/pages/patterns/match-modes.adoc +++ b/modules/ROOT/pages/patterns/match-modes.adoc @@ -95,7 +95,7 @@ RETURN pathCount, [r IN relationships(samplePath) | r.id] AS samplePathBridges ---- -<1> The xref:functions/list.adoc#functions-collect[`collect()`] function collects all paths and `[0]` takes the first entry as the `samplePath`. +<1> The xref:functions/aggregating.adoc#functions-collect[`collect()`] function collects all paths and `[0]` takes the first entry as the `samplePath`. .Result [role="queryresult",options="header,footer",cols="3* Date: Tue, 1 Jul 2025 15:34:49 +0200 Subject: [PATCH 20/72] Clause composition: Write-read conflicts (#1328) Extend clause composition docs to also include Write-Read conflicts instead of only Read-Write conflicts Co-authored-by: Richard Sill <156673635+rsill-neo4j@users.noreply.github.com> --- .../pages/clauses/clause-composition.adoc | 102 +++++++++++++++++- 1 file changed, 99 insertions(+), 3 deletions(-) diff --git a/modules/ROOT/pages/clauses/clause-composition.adoc b/modules/ROOT/pages/clauses/clause-composition.adoc index 23769cc64..a0e2287ab 100644 --- a/modules/ROOT/pages/clauses/clause-composition.adoc +++ b/modules/ROOT/pages/clauses/clause-composition.adoc @@ -129,7 +129,7 @@ In a Cypher query, read and write clauses can take turns. The most important aspect of read-write queries is that the state of the graph also changes between clauses. [IMPORTANT] -A clause can never observe writes made by a later clause. +A clause can never observe writes made by a later clause, and will observe all writes done by the previous clauses. As of Cypher 25, read and write clauses can be combined in any order. That is, a write clause followed by a read clause no longer requires a separating xref:clauses/with.adoc[`WITH`] clause in order for the read clause to observe the changes made by a preceding write clause. @@ -152,7 +152,7 @@ RETURN f.name AS friendName, .Table of intermediate results and state of the graph between read and write clauses ====== -Using the same example graph as above, this example shows the table of intermediate results and the state of the graph after each clause for the following query: +Using the same example graph as above, this example shows the table of intermediate results and the state of the graph after each clause for a query with a read clause before a write clause: [source,cypher, indent=0] ---- @@ -163,7 +163,7 @@ The query finds all nodes where the `name` property starts with "J" and for each such node it creates another node with the `name` property set to "Jay-jay". -.+The table of intermediate results and the state of the graph after each clause+ +.Read-write: The table of intermediate results and the state of the graph after each clause+ [options="header", width="100%", cols="3a, 4a, 4a"] |=== @@ -310,6 +310,102 @@ the graph made by the `CREATE`. ====== +.Table of intermediate results and state of the graph between write and read clauses +====== +On an empty graph, this example shows the table of intermediate results and the state of the graph after each clause for a query with a write clause before a read clause: + +[source,cypher, indent=0] +---- +UNWIND ["Max", "Lune"] AS dogName +CREATE (n:Dog {name: dogName}) +WITH n +MATCH (d:Dog) +RETURN COUNT(*) +---- +This query creates two `Dog` nodes and returns the value `4`. + +.+Write-read: The table of intermediate results and the state of the graph after each clause+ +[options="header", width="100%", cols="3a, 4a, 4a"] +|=== + +| Clause +| Table of intermediate results after the clause +| State of the graph after the clause, changes in red + +| ---- +UNWIND ["Max", "Luna"] AS dogName +---- +| +[options="header",cols="1m"] +!=== +! dogName +! "Max" +! "Luna" +!=== +| + +| ---- +CREATE (n:Dog {name: dogName}) +---- +| +[options="header",cols="1m, 1m"] +!=== +! dogName ! n +! "Max" ! (:Dog {name: 'Max'}) +! "Luna" ! (:Dog {name: 'Luna'}) +!=== +| + +[graphviz] +---- +digraph L { node [shape=record style=rounded]; +N5 [ +color = "red" +fontcolor = "red" +label = "{Dog\|name = \'Max\'\l}" +] +N6 [ +color = "red" +fontcolor = "red" +label = "{Dog\|name = \'Luna\'\l}" +] +} +---- + +| ---- +MATCH (d:Dog) +---- +| +[options="header",cols="1m, 1m, 1m"] +!=== +! dogName ! n ! d +! "Max" ! (:Dog {name: 'Max'}) ! (:Dog {name: 'Max'}) +! "Max" ! (:Dog {name: 'Max'}) ! (:Dog {name: 'Luna'}) +! "Luna" ! (:Dog {name: 'Luna'}) ! (:Dog {name: 'Max'}) +! "Luna" ! (:Dog {name: 'Luna'}) ! (:Dog {name: 'Luna'}) +!=== +| + +[graphviz] +---- +digraph L { node [shape=record style=rounded]; +N5 [ +label = "{Dog\|name = \'Max\'\l}" +] +N6 [ +label = "{Dog\|name = \'Luna\'\l}" +] +} +---- +|=== + +It is important to note that the `MATCH` clause reads all the `Dog` nodes that are created by the `CREATE` clause. +This is because the `CREATE` clause comes before the `MATCH` clause and thus the `MATCH` observes all changes to +the graph made by the `CREATE`. +The `MATCH` clause is performed for every intermediate result, this leads to finding two nodes for both intermediate results. + +====== + [[cypher-clause-composition-union-queries]] == Queries with `UNION` From 0e8aeabd4c759915b7a5bf540a6fe1d3d7787135 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Wed, 2 Jul 2025 11:45:23 +0200 Subject: [PATCH 21/72] Update Select Cypher versions guide with relevant links to Operations Manual and Upgrade and migration guide (#1327) Co-authored-by: Richard Sill <156673635+rsill-neo4j@users.noreply.github.com> Co-authored-by: Therese Magnusson --- .../ROOT/pages/queries/select-version.adoc | 58 +++++-------------- 1 file changed, 13 insertions(+), 45 deletions(-) diff --git a/modules/ROOT/pages/queries/select-version.adoc b/modules/ROOT/pages/queries/select-version.adoc index a4472e655..8f119aafd 100644 --- a/modules/ROOT/pages/queries/select-version.adoc +++ b/modules/ROOT/pages/queries/select-version.adoc @@ -39,9 +39,6 @@ However, it is possible to set a different default language on both new and exis To select a default Cypher version when creating a database, add `DEFAULT LANGUAGE ` to the link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/standard-databases/create-databases/[`CREATE DATABASE`] statement. -[NOTE] -Setting the default language requires the link:{neo4j-docs-base-uri}/operations-manual/current/authentication-authorization/dbms-administration/#access-control-dbms-administration-database-management[`SET DATABASE DEFAULT LANGUAGE` privilege]. - .Select default Cypher version when creating a database [.tabbed-example] ===== @@ -51,11 +48,10 @@ Setting the default language requires the link:{neo4j-docs-base-uri}/operations- .Cypher 25 [source,cypher] ---- -CREATE DATABASE actors DEFAULT LANGUAGE CYPHER 25 +CREATE DATABASE actors SET DEFAULT LANGUAGE CYPHER 25 ---- ====== - [.include-with-Cypher-5] ====== @@ -70,9 +66,6 @@ CREATE DATABASE movies DEFAULT LANGUAGE CYPHER 5 To alter the default Cypher version on an existing database, add `SET DEFAULT LANGUAGE ` to the link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/standard-databases/alter-databases/[`ALTER DATABASE`] command. -[NOTE] -Altering the default language requires the link:{neo4j-docs-base-uri}/operations-manual/current/authentication-authorization/dbms-administration/#access-control-dbms-administration-database-management[`SET DATABASE DEFAULT LANGUAGE` privilege]. - .Alter the default Cypher version on an existing database [.tabbed-example] ===== @@ -86,7 +79,6 @@ ALTER DATABASE movies SET DEFAULT LANGUAGE CYPHER 25 ---- ====== - [.include-with-Cypher-5] ====== @@ -104,44 +96,20 @@ Selecting `CYPHER 25` ensures that all queries run on that database will be exec Selecting `CYPHER 5` as the default database language ensures that all queries run on that database uses Cypher 5 as it existed at the time of the Neo4j 2025.06 release (unless a query is prepended with xref:selection-query-cypher-version[`CYPHER 25`], which overrides this default). Any changes introduced after the 2025.06 release will not affect the semantics of the query. -[[config-database-upgrades]] -== Cypher versions, configuration settings, and DBMS upgrades - -Changing the Cypher version of new databases in a DBMS can also be done with the setting link:{neo4j-docs-base-uri}/operations-manual/current/configuration/configuration-settings/#config_db.query.default_language[`db.query.default_language`] (default value: `CYPHER_5`). -This setting determines the default language for new databases where it has not been specified as part of a `CREATE` or `ALTER` database command. -For example, `config_db.query.default_language=CYPHER_25` will set Cypher 25 as the default language for a DBMS. -For more information about using configuration settings, see the link:{neo4j-docs-base-uri}/operations-manual/current/configuration/[Operations Manual -> Configuration]. - -The table below outlines which Cypher version is assigned to databases in different upgrade or installation scenarios: - -[cols="3", options="header"] -|=== -| Scenario | `db.query.default_language` | Databases - - -| *Standard DBMS upgrade to Neo4j 2025.06+* -| Unset -| *Existing system database:* `CYPHER 5` + -*Existing user databases:* `CYPHER 5` + -*New user databases default:* `CYPHER 5` - - -| *Custom DBMS upgrade to Neo4j 2025.06+* -| Manually set to `CYPHER_25` by administrator -| *Existing system database:* `CYPHER 5` + -*Existing user databases:* `CYPHER 5` + -*New user databases default:* `CYPHER 25` - - -| *New installation of Neo4j 2025.06+* -| Set to `CYPHER_5` -| *New system database:* `CYPHER 5` + -*New user databases default:* `CYPHER 5` - +For more information about how to change and view the default language of new and existing databases and remote database aliases, and the new privileges related to changing the default language, see the following links in the Operations Manual: -|=== +* link:{neo4j-docs-base-uri}/operations-manual/current/configuration/cypher-version-configuration/[Configure the Cypher default version] +* link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/standard-databases/create-databases/#_set_a_default_cypher_version_for_a_standard_database[Set a default Cypher version for a standard database] +* link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/composite-databases/create-composite-databases/#composite-databases-default-language[Set a default Cypher version for a composite database] +* link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/aliases/manage-aliases-standard-databases/#set-default-language-for-remote-database-aliases[Set a default Cypher version for remote database aliases] +* link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/standard-databases/alter-databases/#alter-database-default-language[Alter the default Cypher version of an existing database] +* link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/composite-databases/alter-composite-databases/#alter-default-language-composite-database[Alter the default Cypher version of a composite database] +* link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/aliases/manage-aliases-standard-databases/#alter-default-language-remote-database-alias[Alter the default Cypher version of a remote database alias] +* link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/standard-databases/listing-databases/#_show_the_default_cypher_version_of_a_database[Show the default Cypher version of a database] +* link:{neo4j-docs-base-uri}/operations-manual/authentication-authorization/dbms-administration/#_grant_privilege_to_modify_the_default_language_of_standard_databases[Grant privilege to modify the default language of standard databases] +* link:{neo4j-docs-base-uri}/operations-manual/authentication-authorization/dbms-administration/#grant-privilege-alter-composite-database[Grant privilege to modify composite databases] (required in order to alter the default language of a composite database) -For more information about upgrading and migrating Neo4j databases, see the link:{neo4j-docs-base-uri}/upgrade-migration-guide/current/[Upgrade and migration guide]. +For information about Cypher versions and DBMS upgrades, see the link:{neo4j-docs-base-uri}/upgrade-migration-guide/current/_cypher_versions[Upgrade and migration guide -> Cypher versions]. [[migrate-queries-from-5-to-25]] == Migrating queries from Cypher 5 to Cypher 25 From 11b2004af422c17c30a6db7f27137d38c23fa097 Mon Sep 17 00:00:00 2001 From: Stefano Ottolenghi Date: Fri, 4 Jul 2025 10:13:04 +0200 Subject: [PATCH 22/72] Update links with their redirects URLs. (#1334) --- .../appendix/gql-conformance/supported-optional.adoc | 2 +- .../appendix/gql-conformance/unsupported-mandatory.adoc | 2 +- modules/ROOT/pages/clauses/delete.adoc | 2 +- modules/ROOT/pages/clauses/load-csv.adoc | 8 ++++---- modules/ROOT/pages/functions/aggregating.adoc | 2 +- modules/ROOT/pages/functions/graph.adoc | 4 ++-- modules/ROOT/pages/genai-integrations.adoc | 6 +++--- .../indexes/search-performance-indexes/using-indexes.adoc | 2 +- .../pages/indexes/semantic-indexes/full-text-indexes.adoc | 2 +- .../pages/indexes/semantic-indexes/vector-indexes.adoc | 4 ++-- modules/ROOT/pages/introduction/cypher-aura.adoc | 4 ++-- modules/ROOT/pages/introduction/cypher-neo4j.adoc | 4 ++-- modules/ROOT/pages/introduction/cypher-overview.adoc | 2 +- .../ROOT/pages/planning-and-tuning/execution-plans.adoc | 4 ++-- .../pages/planning-and-tuning/runtimes/reference.adoc | 2 +- .../ROOT/pages/subqueries/subqueries-in-transactions.adoc | 2 +- modules/ROOT/pages/syntax/parameters.adoc | 2 +- modules/ROOT/pages/values-and-types/maps.adoc | 2 +- 18 files changed, 28 insertions(+), 28 deletions(-) diff --git a/modules/ROOT/pages/appendix/gql-conformance/supported-optional.adoc b/modules/ROOT/pages/appendix/gql-conformance/supported-optional.adoc index 6039fc510..df7568d2f 100644 --- a/modules/ROOT/pages/appendix/gql-conformance/supported-optional.adoc +++ b/modules/ROOT/pages/appendix/gql-conformance/supported-optional.adoc @@ -110,7 +110,7 @@ These codes order the features in the table below. | * Feature GD01 implies compliance with GQL feature GT01, "Explicit transaction commands", which states that conforming languages shall contain the following transaction control commands: `START TRANSACTION`, `ROLLBACK`, and `COMMIT`. These are not present in Cypher. However, Neo4j offers transaction management through the link:{neo4j-docs-base-uri}/create-applications[driver] transaction API. -Cypher Shell also offers specific link:{neo4j-docs-base-uri}/operations-manual/current/tools/cypher-shell/#cypher-shell-commands[commands] to manage transactions. +Cypher Shell also offers specific link:{neo4j-docs-base-uri}/operations-manual/current/cypher-shell/#cypher-shell-commands[commands] to manage transactions. * Feature GD01 implies conformance to GQL's `` (subclause 13.3). GQL’s `SET` has no order dependencies because all right-hand side operations are completed before any assignments occur. However, In Cypher’s `SET`, the order of rows can affect the outcome because changes made during execution may depend on the sequence of assignments. diff --git a/modules/ROOT/pages/appendix/gql-conformance/unsupported-mandatory.adoc b/modules/ROOT/pages/appendix/gql-conformance/unsupported-mandatory.adoc index 55cc050bf..4cf67734b 100644 --- a/modules/ROOT/pages/appendix/gql-conformance/unsupported-mandatory.adoc +++ b/modules/ROOT/pages/appendix/gql-conformance/unsupported-mandatory.adoc @@ -24,7 +24,7 @@ Neo4j offers session management through the link:{neo4j-docs-base-uri}/create-ap | GQL defines the following transaction commands: `START TRANSACTION`, `COMMIT`, and `ROLLBACK`. Neo4j offers transaction management through the link:{neo4j-docs-base-uri}/create-applications[driver] transaction API. -Cypher Shell also offers specific link:{neo4j-docs-base-uri}/operations-manual/current/tools/cypher-shell/#cypher-shell-commands[commands] to manage transactions. +Cypher Shell also offers specific link:{neo4j-docs-base-uri}/operations-manual/current/cypher-shell/#cypher-shell-commands[commands] to manage transactions. | 11.1 | Graph expressions diff --git a/modules/ROOT/pages/clauses/delete.adoc b/modules/ROOT/pages/clauses/delete.adoc index 948022d6c..11584513a 100644 --- a/modules/ROOT/pages/clauses/delete.adoc +++ b/modules/ROOT/pages/clauses/delete.adoc @@ -120,7 +120,7 @@ Deleted 1 node, deleted 1 relationship [NOTE] ==== The `DETACH DELETE` clause may not be permitted to users with restricted security privileges. -For more information, see link:{neo4j-docs-base-uri}/operations-manual/current/authentication-authorization/access-control#detach-delete-restricted-user[Operations Manual -> Fine-grained access control]. +For more information, see link:{neo4j-docs-base-uri}/operations-manual/current/tutorial/access-control/#detach-delete-restricted-user[Operations Manual -> Fine-grained access control]. ==== diff --git a/modules/ROOT/pages/clauses/load-csv.adoc b/modules/ROOT/pages/clauses/load-csv.adoc index fd2a0754a..0c48a2d2f 100644 --- a/modules/ROOT/pages/clauses/load-csv.adoc +++ b/modules/ROOT/pages/clauses/load-csv.adoc @@ -70,10 +70,10 @@ Added 4 nodes, Set 8 properties, Added 4 labels ==== [NOTE] -For ways of importing data into an Aura instance, see link:https://neo4j.com/docs/aura/auradb/importing/importing-data/[Aura -> Importing data]. +For ways of importing data into an Aura instance, see link:https://neo4j.com/docs/aura/classic/auradb/importing/importing-data/[Aura -> Importing data]. [TIP] -When using `+file:///+` URLs, spaces and other non-alphanumeric characters must be link:https://developer.mozilla.org/en-US/docs/Glossary/percent-encoding[URL-encoded]. +When using `+file:///+` URLs, spaces and other non-alphanumeric characters must be link:https://developer.mozilla.org/en-US/docs/Glossary/Percent-encoding[URL-encoded]. ==== Configuration settings for file URLs @@ -368,7 +368,7 @@ You can't load zipped CSV files from remote URLs. === Import data from relational databases If the source data comes from a relational model, it's worth evaluating how to gain the most from moving to a graph data model. -Before running the import, think about how the data can be modeled as a graph, and adapt its structure accordingly when running the import (see link:https://neo4j.com/docs/getting-started/data-modeling/guide-data-modeling/[Graph data modeling]). +Before running the import, think about how the data can be modeled as a graph, and adapt its structure accordingly when running the import (see link:https://neo4j.com/docs/getting-started/data-modeling/tutorial-data-modeling/[Graph data modeling]). Data from relational databases may consist of one or multiple CSV files, depending on the source database structure. A performant approach is to run multiple passes of `LOAD CSV` to import nodes separately from relationships. @@ -1166,7 +1166,7 @@ With increasing amounts of data, it is more efficient to create _all_ nodes firs There are a few other tools to get CSV data into Neo4j. -1. *The link:{neo4j-docs-base-uri}/operations-manual/current/tools/neo4j-admin/neo4j-admin-import/[`neo4j-admin database import`] command* is the most efficient way of importing large CSV files. +1. *The link:{neo4j-docs-base-uri}/operations-manual/current/import/[`neo4j-admin database import`] command* is the most efficient way of importing large CSV files. 2. Use a link:https://neo4j.com/docs/create-applications/[*language library*] to parse CSV data and run creation Cypher queries against a Neo4j database. Created as an extension library to provide common procedures and functions to developers. This library is especially helpful for complex transformations and data manipulations. diff --git a/modules/ROOT/pages/functions/aggregating.adoc b/modules/ROOT/pages/functions/aggregating.adoc index 58be16e53..db87890b0 100644 --- a/modules/ROOT/pages/functions/aggregating.adoc +++ b/modules/ROOT/pages/functions/aggregating.adoc @@ -10,7 +10,7 @@ Aggregation can be computed over all the matching paths, or it can be further di [TIP] ==== -To learn more about how Cypher handles aggregations performed on zero rows, refer to link:https://neo4j.com/developer/kb/understanding-aggregations-on-zero-rows//[Neo4j Knowledge Base -> Understanding aggregations on zero rows]. +To learn more about how Cypher handles aggregations performed on zero rows, refer to link:https://neo4j.com/developer/kb/understanding-aggregations-on-zero-rows/[Neo4j Knowledge Base -> Understanding aggregations on zero rows]. ==== == Example graph diff --git a/modules/ROOT/pages/functions/graph.adoc b/modules/ROOT/pages/functions/graph.adoc index 2bec760c9..c62c6a785 100644 --- a/modules/ROOT/pages/functions/graph.adoc +++ b/modules/ROOT/pages/functions/graph.adoc @@ -16,7 +16,7 @@ .Considerations |=== -| `graph.names()` is only supported on link:{neo4j-docs-base-uri}/operations-manual/current/composite-databases[composite databases]. +| `graph.names()` is only supported on link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/composite-databases/concepts/[composite databases]. |=== .+graph.names()+ @@ -71,7 +71,7 @@ The names of all graphs on the current composite database are returned. .Considerations |=== -| `graph.propertiesByName()` is only supported on link:{neo4j-docs-base-uri}/operations-manual/current/composite-databases[composite databases]. +| `graph.propertiesByName()` is only supported on link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/composite-databases/concepts/[composite databases]. | The properties in the returned `MAP` are set on the link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/aliases/manage-aliases-standard-databases/[alias]that adds the graph as a constituent of a composite database. |=== diff --git a/modules/ROOT/pages/genai-integrations.adoc b/modules/ROOT/pages/genai-integrations.adoc index 497931a3d..760954ba8 100644 --- a/modules/ROOT/pages/genai-integrations.adoc +++ b/modules/ROOT/pages/genai-integrations.adoc @@ -36,7 +36,7 @@ The graph contains 28863 nodes and 332522 relationships. There are 9083 `Movie` nodes with a `plot` and `title` property. To recreate the graph, download and import this link:https://github.com/neo4j-graph-examples/recommendations/raw/main/data/recommendations-embeddings-50.dump[dump file] to an empty Neo4j database. -Dump files can be imported for both link:{neo4j-docs-base-uri}/aura/auradb/importing/import-database/[Aura] and link:{neo4j-docs-base-uri}/operations-manual/current/backup-restore/restore-dump/[on-prem] instances. +Dump files can be imported for both link:{neo4j-docs-base-uri}/aura/classic/auradb/importing/import-database/[Aura] and link:{neo4j-docs-base-uri}/operations-manual/current/backup-restore/restore-dump/[on-prem] instances. [NOTE] The embeddings on this are generated using link:https://platform.openai.com/docs/guides/embeddings[OpenAI] (model `text-embedding-ada-002`), producing 1536-dimensional vectors. @@ -217,7 +217,7 @@ Each provider has its own configuration map that can be passed to `genai.vector. === Vertex AI * Identifier (`provider` argument): `"VertexAI"` -* https://cloud.google.com/vertex-ai/docs/generative-ai/embeddings/get-text-embeddings[Official Vertex AI documentation] +* https://cloud.google.com/vertex-ai/generative-ai/docs/embeddings/get-text-embeddings[Official Vertex AI documentation] .Vertex AI provider details [%collapsible] @@ -342,7 +342,7 @@ Supported values: + === Azure OpenAI * Identifier (`provider` argument): `"AzureOpenAI"` -* https://learn.microsoft.com/en-us/azure/ai-services/openai/[Official Azure OpenAI documentation] +* https://learn.microsoft.com/en-us/azure/ai-foundry/[Official Azure OpenAI documentation] [NOTE] Unlike the other providers, the model is configured when creating the deployment on Azure, and is thus not part of the configuration map. diff --git a/modules/ROOT/pages/indexes/search-performance-indexes/using-indexes.adoc b/modules/ROOT/pages/indexes/search-performance-indexes/using-indexes.adoc index 14608bcf8..347119a26 100644 --- a/modules/ROOT/pages/indexes/search-performance-indexes/using-indexes.adoc +++ b/modules/ROOT/pages/indexes/search-performance-indexes/using-indexes.adoc @@ -28,7 +28,7 @@ image::using-indexes-example-graph.svg[Graph showing two nodes being connected v In total, the graph contains 69165 nodes (of which 188 have the label `PointOfInterest`) and 152077 `ROUTE` relationships. To recreate the graph, download and import the link:https://github.com/neo4j-graph-examples/openstreetmap/raw/main/data/openstreetmap-50.dump[5.0 dump file] to an empty Neo4j database. -Dump files can be imported for both link:{neo4j-docs-base-uri}/aura/auradb/importing/import-database/[Aura] and link:{neo4j-docs-base-uri}/operations-manual/current/backup-restore/restore-dump/[on-prem] instances. +Dump files can be imported for both link:{neo4j-docs-base-uri}/aura/classic/auradb/importing/import-database/[Aura] and link:{neo4j-docs-base-uri}/operations-manual/current/backup-restore/restore-dump/[on-prem] instances. [[token-lookup-indexes]] == Token lookup indexes diff --git a/modules/ROOT/pages/indexes/semantic-indexes/full-text-indexes.adoc b/modules/ROOT/pages/indexes/semantic-indexes/full-text-indexes.adoc index 44bda16c4..06aba7874 100644 --- a/modules/ROOT/pages/indexes/semantic-indexes/full-text-indexes.adoc +++ b/modules/ROOT/pages/indexes/semantic-indexes/full-text-indexes.adoc @@ -390,7 +390,7 @@ The procedures for full-text indexes are listed in the table below: * Full-text indexes can be queried using the Lucene query language. * Full-text indexes are kept up to date automatically, as nodes and relationships are added, removed, and modified. * Full-text indexes will automatically populate newly created indexes with the existing data in a store. -* Full-text indexes can be checked by the link:{neo4j-docs-base-uri}/operations-manual/current/tools/neo4j-admin/consistency-checker[consistency checker], and they can be rebuilt if there is a problem with them. +* Full-text indexes can be checked by the link:{neo4j-docs-base-uri}/operations-manual/current/backup-restore/consistency-checker/[consistency checker], and they can be rebuilt if there is a problem with them. * Newly created full-text indexes get automatically populated with the existing data in the database. * Full-text indexes can support any number of properties in a single index. * Full-text indexes are created, dropped, and updated transactionally, and are automatically replicated throughout a cluster. diff --git a/modules/ROOT/pages/indexes/semantic-indexes/vector-indexes.adoc b/modules/ROOT/pages/indexes/semantic-indexes/vector-indexes.adoc index 06dd47696..82bc140d3 100644 --- a/modules/ROOT/pages/indexes/semantic-indexes/vector-indexes.adoc +++ b/modules/ROOT/pages/indexes/semantic-indexes/vector-indexes.adoc @@ -14,7 +14,7 @@ The following resources provide hands-on tutorials for working with LLMs and vec * link:https://neo4j.com/docs/genai/tutorials/embeddings-vector-indexes/[GenAI documentation -> Embeddings & Vector Indexes Tutorial] Neo4j vector indexes are powered by the link:https://lucene.apache.org/[Apache Lucene] indexing and search library.footnote:[Lucene implements a Hierarchical Navigable Small World (HNSW) Graph to perform a k approximate nearest neighbors (k-ANN) query over the vector fields. -For more information, see link:http://dx.doi.org/10.1109/TPAMI.2018.2889473[Efficient and Robust Approximate Nearest Neighbor Search Using Hierarchical Navigable Small World Graphs] -- Yury A. Malkov and Dmitry A. Yashunin] +For more information, see link:https://ieeexplore.ieee.org/document/8594636/[Efficient and Robust Approximate Nearest Neighbor Search Using Hierarchical Navigable Small World Graphs] -- Yury A. Malkov and Dmitry A. Yashunin] [[example-graph]] == Example graph @@ -27,7 +27,7 @@ image::vector-index-graph.svg[Graph example connecting movie to person nodes via The graph contains 28863 nodes and 332522 relationships. To recreate the graph, download and import this link:https://github.com/neo4j-graph-examples/recommendations/raw/main/data/recommendations-embeddings-50.dump[dump file] to an empty Neo4j database. -Dump files can be imported for both link:{neo4j-docs-base-uri}/aura/auradb/importing/import-database/[Aura] and link:{neo4j-docs-base-uri}/operations-manual/current/backup-restore/restore-dump/[on-prem] instances. +Dump files can be imported for both link:{neo4j-docs-base-uri}/aura/classic/auradb/importing/import-database/[Aura] and link:{neo4j-docs-base-uri}/operations-manual/current/backup-restore/restore-dump/[on-prem] instances. [NOTE] The dump file used to load the dataset contains embeddings generated by https://openai.com/[OpenAI], using the model `text-embedding-ada-002`. diff --git a/modules/ROOT/pages/introduction/cypher-aura.adoc b/modules/ROOT/pages/introduction/cypher-aura.adoc index 380ea527f..54e630c9c 100644 --- a/modules/ROOT/pages/introduction/cypher-aura.adoc +++ b/modules/ROOT/pages/introduction/cypher-aura.adoc @@ -17,7 +17,7 @@ AuraDB is available on the following tiers: * AuraDB Business Critical * AuraDB Virtual Dedicated Cloud -For more information, see link:{neo4j-docs-base-uri}/aura/auradb[Aura docs - Neo4j AuraDB overview]. +For more information, see link:{neo4j-docs-base-uri}/aura/classic/auradb/[Aura docs - Neo4j AuraDB overview]. AuraDS is available on the following tiers: @@ -26,7 +26,7 @@ AuraDS is available on the following tiers: * AuraDS Professional * AuraDS Enterprise -For more information, see link:{neo4j-docs-base-uri}/aura/aurads[Aura docs - Neo4j AuraDS overview]. +For more information, see link:{neo4j-docs-base-uri}/aura/classic/aurads/[Aura docs - Neo4j AuraDS overview]. == Using Cypher on Aura diff --git a/modules/ROOT/pages/introduction/cypher-neo4j.adoc b/modules/ROOT/pages/introduction/cypher-neo4j.adoc index cc87055ee..cbd2eea5f 100644 --- a/modules/ROOT/pages/introduction/cypher-neo4j.adoc +++ b/modules/ROOT/pages/introduction/cypher-neo4j.adoc @@ -55,7 +55,7 @@ Normally there is only one graph within each database, and many administrative c Cypher queries executed in a session may declare which graph they apply to, or use a default, given by the session. Composite databases can contain multiple graphs, by means of aliases to other databases. Queries submitted to composite databases may refer to multiple graphs within the same query. -For more information, see link:{neo4j-docs-base-uri}/operations-manual/current/composite-databases/[Operations manual -> Composite databases]. +For more information, see link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/composite-databases/concepts/[Operations manual -> Composite databases]. *Database*:: A database is a storage and retrieval mechanism for collecting data in a defined space on disk and in memory. @@ -121,7 +121,7 @@ For examples of the API, or the commands used to start and commit transactions, * For information on using transactions with a Neo4j driver, see _The session API_ in the link:{docs-base-uri}[Neo4j Driver manuals]. * For information on using transactions over the HTTP API, see the link:{neo4j-docs-base-uri}/http-api/current/transactions[HTTP API documentation -> Run transactions]. * For information on using transactions within the embedded Core API, see the link:{neo4j-docs-base-uri}/java-reference/current/java-embedded/cypher-java/[Java Reference -> Cypher queries]. -* For information on using transactions within the Neo4j Browser or Cypher-shell, see the link:{neo4j-docs-base-uri}/browser-manual/current/reference-commands/[Neo4j Browser documentation] or the link:{neo4j-docs-base-uri}/operations-manual/current/tools/cypher-shell/#cypher-shell-commands[Cypher-shell documentation]. +* For information on using transactions within the Neo4j Browser or Cypher-shell, see the link:{neo4j-docs-base-uri}/browser-manual/current/reference-commands/[Neo4j Browser documentation] or the link:{neo4j-docs-base-uri}/operations-manual/current/cypher-shell/#cypher-shell-commands[Cypher-shell documentation]. When writing procedures or using Neo4j embedded, remember that all iterators returned from an execution result should be either fully exhausted or closed. This ensures that the resources bound to them are properly released. diff --git a/modules/ROOT/pages/introduction/cypher-overview.adoc b/modules/ROOT/pages/introduction/cypher-overview.adoc index 6f4642b42..b4363f067 100644 --- a/modules/ROOT/pages/introduction/cypher-overview.adoc +++ b/modules/ROOT/pages/introduction/cypher-overview.adoc @@ -82,4 +82,4 @@ RETURN actor.name Neo4j supports the APOC (Awesome Procedures on Cypher) Core library. The APOC Core library provides access to user-defined procedures and functions which extend the use of the Cypher query language into areas such as data integration, graph algorithms, and data conversion. -For more details, visit the link:{neo4j-docs-base-uri}/apoc/current[APOC Core page]. \ No newline at end of file +For more details, visit the link:{neo4j-docs-base-uri}/apoc/current/[APOC Core page]. \ No newline at end of file diff --git a/modules/ROOT/pages/planning-and-tuning/execution-plans.adoc b/modules/ROOT/pages/planning-and-tuning/execution-plans.adoc index 49d9b6866..c884c9f59 100644 --- a/modules/ROOT/pages/planning-and-tuning/execution-plans.adoc +++ b/modules/ROOT/pages/planning-and-tuning/execution-plans.adoc @@ -91,8 +91,8 @@ MATCH (:Station { name: 'Denmark Hill' })<-[:CALLS_AT]-(d:Stop) RETURN count(*) ---- -This is the resulting execution planfootnote:[The format of the execution plans displayed in this section are those generated when using link:{neo4j-docs-base-uri}/operations-manual/current/tools/cypher-shell[Cypher Shell]. -The execution plans generated by link:{neo4j-docs-base-uri}/browser-manual/current[Neo4j Browser] use a different format.]: +This is the resulting execution planfootnote:[The format of the execution plans displayed in this section are those generated when using link:{neo4j-docs-base-uri}/operations-manual/current/cypher-shell/[Cypher Shell]. +The execution plans generated by link:{neo4j-docs-base-uri}/browser-manual/current/[Neo4j Browser] use a different format.]: [role="queryplan"] ---- diff --git a/modules/ROOT/pages/planning-and-tuning/runtimes/reference.adoc b/modules/ROOT/pages/planning-and-tuning/runtimes/reference.adoc index f87838ce1..1625330f1 100644 --- a/modules/ROOT/pages/planning-and-tuning/runtimes/reference.adoc +++ b/modules/ROOT/pages/planning-and-tuning/runtimes/reference.adoc @@ -27,7 +27,7 @@ For a full list of all available Cypher write clauses, see the xref:clauses/inde It is not possible to use the parallel runtime if a change has been made to the state of a transaction. -For example, the following transaction (initiated on link:{neo4j-docs-base-uri}/operations-manual/current/tools/cypher-shell[Cypher Shell]) will be rolled back, because executing a Cypher query will make changes to the state of a transaction. +For example, the following transaction (initiated on link:{neo4j-docs-base-uri}/operations-manual/current/cypher-shell/[Cypher Shell]) will be rolled back, because executing a Cypher query will make changes to the state of a transaction. .Step 1: Initiate a new transaction and change its state by creating a node [source, cypher, role=test-skip] diff --git a/modules/ROOT/pages/subqueries/subqueries-in-transactions.adoc b/modules/ROOT/pages/subqueries/subqueries-in-transactions.adoc index 2062b2802..f621bac94 100644 --- a/modules/ROOT/pages/subqueries/subqueries-in-transactions.adoc +++ b/modules/ROOT/pages/subqueries/subqueries-in-transactions.adoc @@ -220,7 +220,7 @@ For larger data sets, you might want to use larger batch sizes, such as `10000 R [[composite-databases]] == Composite databases -`CALL { ... } IN TRANSACTIONS` can be used with link:{neo4j-docs-base-uri}/operations-manual/current/composite-databases[composite databases]. +`CALL { ... } IN TRANSACTIONS` can be used with link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/composite-databases/concepts/[composite databases]. Even though composite databases allow accessing multiple graphs in a single query, only one graph can be modified in a single transaction. `CALL { ... } IN TRANSACTIONS` offers a way of constructing queries which modify multiple graphs. diff --git a/modules/ROOT/pages/syntax/parameters.adoc b/modules/ROOT/pages/syntax/parameters.adoc index 1820abd17..d236cb668 100644 --- a/modules/ROOT/pages/syntax/parameters.adoc +++ b/modules/ROOT/pages/syntax/parameters.adoc @@ -34,7 +34,7 @@ Setting parameters when running a query is dependent on the client environment. For example: * To set a parameter in Cypher Shell use `+:param name => 'Joe'+`. - For more information refer to link:{neo4j-docs-base-uri}/operations-manual/current/tools/cypher-shell#cypher-shell-parameters[Operations Manual -> Cypher Shell - Query Parameters]. + For more information refer to link:{neo4j-docs-base-uri}/operations-manual/current/cypher-shell/#cypher-shell-parameters[Operations Manual -> Cypher Shell - Query Parameters]. * For Neo4j Browser use the same syntax as Cypher Shell, `+:param name => 'Joe'+`. * When using drivers, the syntax is dependent on the language choice. See the examples in _Transactions_ in the link:{docs-base-uri}[Neo4j Driver manuals]. diff --git a/modules/ROOT/pages/values-and-types/maps.adoc b/modules/ROOT/pages/values-and-types/maps.adoc index 8f3057faf..17972af15 100644 --- a/modules/ROOT/pages/values-and-types/maps.adoc +++ b/modules/ROOT/pages/values-and-types/maps.adoc @@ -16,7 +16,7 @@ For information about how the `[]` operator behaves with respect to `null`, see == Literal maps The key names in a map must be literals. -If returned through an link:{neo4j-docs-base-uri}/http-api/current[HTTP API call], a JSON object will be returned. +If returned through an link:{neo4j-docs-base-uri}/http-api/current/[HTTP API call], a JSON object will be returned. If returned in Java, an object of type `java.util.Map` will be returned. From ec5d8044b510698b86ad880f1b328ff9da6b5625 Mon Sep 17 00:00:00 2001 From: JoelBergstrand Date: Tue, 8 Jul 2025 11:30:32 +0200 Subject: [PATCH 23/72] Added note on NEXT limitations (#1338) [PR](https://github.com/neo-technology/neo4j/pull/31952 ) --- .../queries/composed-queries/sequential-queries.adoc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/queries/composed-queries/sequential-queries.adoc b/modules/ROOT/pages/queries/composed-queries/sequential-queries.adoc index 02201607e..310f33f9d 100644 --- a/modules/ROOT/pages/queries/composed-queries/sequential-queries.adoc +++ b/modules/ROOT/pages/queries/composed-queries/sequential-queries.adoc @@ -381,4 +381,10 @@ RETURN customer.firstName AS plantCustomer | "Niko" 1+d|Rows: 6 -|=== \ No newline at end of file +|=== + + +[[next-unsupported-behavior]] +== Known limitations + +`NEXT` currently does not support `DISTINCT` nor aggregations when they are used in a `UNION` query, wrapped in braces or after a `USE` clause. From 3ce0fcf3bd871704c157a2f3116f2be4236f4e6c Mon Sep 17 00:00:00 2001 From: JoelBergstrand Date: Thu, 17 Jul 2025 09:02:50 +0200 Subject: [PATCH 24/72] Include updates in NEXT limitations (#1341) [Neo4j PR](https://github.com/neo-technology/neo4j/pull/32037) --------- Co-authored-by: Richard Sill <156673635+rsill-neo4j@users.noreply.github.com> --- .../pages/queries/composed-queries/sequential-queries.adoc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/queries/composed-queries/sequential-queries.adoc b/modules/ROOT/pages/queries/composed-queries/sequential-queries.adoc index 310f33f9d..d87c8dd59 100644 --- a/modules/ROOT/pages/queries/composed-queries/sequential-queries.adoc +++ b/modules/ROOT/pages/queries/composed-queries/sequential-queries.adoc @@ -387,4 +387,8 @@ RETURN customer.firstName AS plantCustomer [[next-unsupported-behavior]] == Known limitations -`NEXT` currently does not support `DISTINCT` nor aggregations when they are used in a `UNION` query, wrapped in braces or after a `USE` clause. +`NEXT` currently does not support the following when they are used in a `UNION` query, wrapped in braces or after a `USE` clause: + +* updating queries such as `CREATE` or `MERGE`, +* `DISTINCT`, +* aggregations. From 0697dbe7698843ead65ae32d5ab151d46e4908fd Mon Sep 17 00:00:00 2001 From: Stefano Ottolenghi Date: Mon, 21 Jul 2025 11:37:53 +0200 Subject: [PATCH 25/72] Update recommendations dataset URL. --- .../ROOT/pages/indexes/semantic-indexes/vector-indexes.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/indexes/semantic-indexes/vector-indexes.adoc b/modules/ROOT/pages/indexes/semantic-indexes/vector-indexes.adoc index 82bc140d3..5f3942293 100644 --- a/modules/ROOT/pages/indexes/semantic-indexes/vector-indexes.adoc +++ b/modules/ROOT/pages/indexes/semantic-indexes/vector-indexes.adoc @@ -1,5 +1,5 @@ :description: Information about creating, querying, and deleting vector indexes with Cypher. -:test-setup-dump: https://github.com/neo4j-graph-examples/recommendations/raw/main/data/recommendations-embeddings-25.dump +:test-setup-dump: https://github.com/neo4j-graph-examples/recommendations/raw/refs/heads/main/data/recommendations-embeddings-aligned-5.26.dump :l2-norm: image:l2.svg["l2"]-norm include::https://raw.githubusercontent.com/neo4j-graphacademy/courses/main/asciidoc/courses/llm-vectors-unstructured/ad.adoc[] @@ -26,7 +26,7 @@ image::vector-index-graph.svg[Graph example connecting movie to person nodes via The graph contains 28863 nodes and 332522 relationships. -To recreate the graph, download and import this link:https://github.com/neo4j-graph-examples/recommendations/raw/main/data/recommendations-embeddings-50.dump[dump file] to an empty Neo4j database. +To recreate the graph, download and import this link:https://github.com/neo4j-graph-examples/recommendations/raw/refs/heads/main/data/recommendations-embeddings-aligned-5.26.dump[dump file] to an empty Neo4j database. Dump files can be imported for both link:{neo4j-docs-base-uri}/aura/classic/auradb/importing/import-database/[Aura] and link:{neo4j-docs-base-uri}/operations-manual/current/backup-restore/restore-dump/[on-prem] instances. [NOTE] From 1ccfc708165b3da6a412fb3aa1c36cc3a1b8d93c Mon Sep 17 00:00:00 2001 From: Gem Lamont <106068376+gem-neo4j@users.noreply.github.com> Date: Thu, 31 Jul 2025 16:36:09 +0200 Subject: [PATCH 26/72] Add dynamic label and type support in label expressions (#1339) I wasn't sure how much to add for this feature, it is good to be mentioned, but as we have no central place for dynamic labels and types it makes it tricky to find good places to add it --------- Co-authored-by: Richard Sill <156673635+rsill-neo4j@users.noreply.github.com> --- modules/ROOT/pages/clauses/filter.adoc | 32 +++++++++++++++++++ modules/ROOT/pages/clauses/where.adoc | 32 +++++++++++++++++++ ...ions-additions-removals-compatibility.adoc | 25 +++++++++++++++ modules/ROOT/pages/patterns/reference.adoc | 13 ++++++++ 4 files changed, 102 insertions(+) diff --git a/modules/ROOT/pages/clauses/filter.adoc b/modules/ROOT/pages/clauses/filter.adoc index fab35e07c..b51017673 100644 --- a/modules/ROOT/pages/clauses/filter.adoc +++ b/modules/ROOT/pages/clauses/filter.adoc @@ -93,6 +93,38 @@ RETURN p.name AS person, 3+|Rows: 2 |=== +[[filter-on-dynamic-labels-and-types]] +== Filter on dynamic labels and types + +To filter on a label or relationship type using a dynamically computed value, use `$()` where is any Cypher expression: + +.Parameters +[source, parameters] +---- +{ + "label": "Swedish" +} +---- + +.Filter on a dynamically computed node label +// tag::clauses_where_dynamic[] +[source, cypher] +---- +MATCH (n) +FILTER n:$($label) +RETURN labels(n) AS labels +---- +// end::clauses_where_dynamic[] + +.Result +[role="queryresult",options="header,footer",cols="1*)` where is any Cypher expression: + +.Parameters +[source, parameters] +---- +{ + "label": "Swedish" +} +---- + +.Filter on a dynamically computed node label +// tag::clauses_where_dynamic[] +[source, cypher] +---- +MATCH (n) +WHERE n:$($label) +RETURN labels(n) AS labels +---- +// end::clauses_where_dynamic[] + +.Result +[role="queryresult",options="header,footer",cols="1*() +WHERE n:$() +WITH n, r:$() AS hasType +RETURN n:$() +---- + +| Added the ability to dynamically reference node labels and relationship types in places where xref:patterns/reference.adoc#label-expressions[label expressions] are allowed. +|=== + + [[cypher-deprecations-additions-removals-2025.06]] == Neo4j 2025.06 diff --git a/modules/ROOT/pages/patterns/reference.adoc b/modules/ROOT/pages/patterns/reference.adoc index 2cf0114ff..a5009cfe8 100644 --- a/modules/ROOT/pages/patterns/reference.adoc +++ b/modules/ROOT/pages/patterns/reference.adoc @@ -314,6 +314,19 @@ The following matches relationships that have a type that is neither `A` nor `B` -[:!A&!B]-> ---- +[[dynamic-label-and-type-expressions]] +=== Dynamic label and type expressions + +Node labels and relationship types can be referenced dynamically in expressions, parameters, and variables within label expressions. + +.Syntax for creating nodes and relationships dynamically +[source, syntax] +---- +dynamicLabelExpression ::= ":$(" + valueExpression ")" +---- + +The `valueExpression` must evaluate to a `STRING NOT NULL | LIST NOT NULL` value. + [[property-key-value-expressions]] == Property key-value expressions From 5574338b2e09475ef1a0f1c8535596cd5e490454 Mon Sep 17 00:00:00 2001 From: Arne Fischereit <79841228+arnefischereit@users.noreply.github.com> Date: Thu, 31 Jul 2025 16:39:45 +0200 Subject: [PATCH 27/72] Name Repeat operator without Trail/Walk parameter (#1343) All the description of the operator should be applicable independent of the traversal path mode. In EXPLAIN outputs, the parameter will be included, though. I have left the description in the additions document, as this is how it was introduced. Maybe we should rename it there as well. Co-authored-by: Richard Sill <156673635+rsill-neo4j@users.noreply.github.com> --- .../pages/planning-and-tuning/execution-plans.adoc | 2 +- .../pages/planning-and-tuning/operators/index.adoc | 6 +++--- .../operators/operators-detail.adoc | 12 ++++++------ 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/modules/ROOT/pages/planning-and-tuning/execution-plans.adoc b/modules/ROOT/pages/planning-and-tuning/execution-plans.adoc index c884c9f59..c4b2dc900 100644 --- a/modules/ROOT/pages/planning-and-tuning/execution-plans.adoc +++ b/modules/ROOT/pages/planning-and-tuning/execution-plans.adoc @@ -141,7 +141,7 @@ The `id` column specifies a unique ID assigned to each operator. There are no guarantees about the order of the ids, although they will usually start with 0 at the root operator, and will increase until the leaf operator is reached at the beginning of the operator tree. The `Details` column in the middle of the execution plan describes what task is performed by each operator. -For example, the details column of the xref::planning-and-tuning/operators/operators-detail.adoc#query-plan-repeat[Repeat(Trail)] operator in the middle of the execution plan (`id 5`), specifies that the operator traverses a quantified path pattern without an upward limit. +For example, the details column of the xref::planning-and-tuning/operators/operators-detail.adoc#query-plan-repeat[Repeat] operator in the middle of the execution plan (`id 5`), specifies that the operator traverses a quantified path pattern without an upward limit. Finally, the `Estimated Rows` column details the number of rows that are expected to be produced by each operator. This estimate is an approximate number based on the available statistical information and the planner uses it to choose a suitable execution plan.footnote:[The statistical information maintained by Neo4j includes the following: the number of nodes having a certain label, the number of relationships by type, selectivity per index, and the number of relationships by type, ending with or starting from a node with a specific label.] diff --git a/modules/ROOT/pages/planning-and-tuning/operators/index.adoc b/modules/ROOT/pages/planning-and-tuning/operators/index.adoc index 570199b37..c12c69330 100644 --- a/modules/ROOT/pages/planning-and-tuning/operators/index.adoc +++ b/modules/ROOT/pages/planning-and-tuning/operators/index.adoc @@ -423,8 +423,8 @@ Tests for the presence of a pattern predicate in queries containing multiple pat | | xref::planning-and-tuning/operators/operators-detail.adoc#query-plan-nullify-metadata[NullifyMetadata] -| responsible for cleaning up the state produced by xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-repeat[`Repeat(Trail)`]. -It is only planned directly after `Repeat(Trail)`. +| responsible for cleaning up the state produced by xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-repeat[`Repeat`]. +It is only planned directly after `Repeat`. | | | @@ -632,7 +632,7 @@ It also fetches the start and end nodes of those relationships. | | -| xref::planning-and-tuning/operators/operators-detail.adoc#query-plan-repeat[Repeat(Trail)] +| xref::planning-and-tuning/operators/operators-detail.adoc#query-plan-repeat[Repeat] | Solves quantified path patterns. | | diff --git a/modules/ROOT/pages/planning-and-tuning/operators/operators-detail.adoc b/modules/ROOT/pages/planning-and-tuning/operators/operators-detail.adoc index 5c38c948d..dc2ba7f93 100644 --- a/modules/ROOT/pages/planning-and-tuning/operators/operators-detail.adoc +++ b/modules/ROOT/pages/planning-and-tuning/operators/operators-detail.adoc @@ -4063,15 +4063,15 @@ Total database accesses: 49, total allocated memory: 1200 [[query-plan-repeat]] -=== Repeat (Trail) -// Repeat(Trail) +=== Repeat +// Repeat -Given a start node, the `Repeat(Trail)` operator will traverse xref::patterns/variable-length-patterns.adoc#quantified-path-patterns[quantified path patterns] that cannot be solved (or solved efficiently) with the xref::planning-and-tuning/operators/operators-detail.adoc#query-plan-varlength-expand-all[`VarLengthExpand(All)`] operator. +Given a start node, the `Repeat` operator will traverse xref::patterns/variable-length-patterns.adoc#quantified-path-patterns[quantified path patterns] that cannot be solved (or solved efficiently) with the xref::planning-and-tuning/operators/operators-detail.adoc#query-plan-varlength-expand-all[`VarLengthExpand(All)`] operator. Similar to an xref::planning-and-tuning/operators/operators-detail.adoc#query-plan-apply[`Apply`] operator, it takes a single row from the left-hand side and applies the operators on the right-hand side. In contrast to `Apply`, however, it repeatedly applies these operators in accordance with the quantifiers on the quantified path pattern. In the following example, the operator will repeat twice and produce rows for both repetitions. -.Repeat(Trail) +.Repeat ====== .Query @@ -4127,8 +4127,8 @@ Total database accesses: 747, total allocated memory: 45832 [[query-plan-nullify-metadata]] === Nullify Metadata -`NullifyMetadata` is responsible for cleaning up the state produced by xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-repeat[`Repeat(Trail)`]. -It is only planned directly after `Repeat(Trail)`. +`NullifyMetadata` is responsible for cleaning up the state produced by xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-repeat[`Repeat`]. +It is only planned directly after `Repeat`. .NullifyMetadata ====== From e964205416ded50e84e0a548298efeddfcadcc5c Mon Sep 17 00:00:00 2001 From: Richard Sill Date: Thu, 31 Jul 2025 17:19:12 +0200 Subject: [PATCH 28/72] added block syntax to an IMPORTANT admonition --- modules/ROOT/pages/clauses/clause-composition.adoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/ROOT/pages/clauses/clause-composition.adoc b/modules/ROOT/pages/clauses/clause-composition.adoc index a0e2287ab..4ce2db52b 100644 --- a/modules/ROOT/pages/clauses/clause-composition.adoc +++ b/modules/ROOT/pages/clauses/clause-composition.adoc @@ -129,7 +129,9 @@ In a Cypher query, read and write clauses can take turns. The most important aspect of read-write queries is that the state of the graph also changes between clauses. [IMPORTANT] +==== A clause can never observe writes made by a later clause, and will observe all writes done by the previous clauses. +==== As of Cypher 25, read and write clauses can be combined in any order. That is, a write clause followed by a read clause no longer requires a separating xref:clauses/with.adoc[`WITH`] clause in order for the read clause to observe the changes made by a preceding write clause. From 1172968724f13444ae27f3d31e4c9ee9d6503e1d Mon Sep 17 00:00:00 2001 From: Neil Dewhurst Date: Fri, 1 Aug 2025 10:41:51 +0100 Subject: [PATCH 29/72] Remove Neo4j version from PDF title (#1347) --- modules/ROOT/pages/introduction/index.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/introduction/index.adoc b/modules/ROOT/pages/introduction/index.adoc index db46e6935..e8b1d53ea 100644 --- a/modules/ROOT/pages/introduction/index.adoc +++ b/modules/ROOT/pages/introduction/index.adoc @@ -1,6 +1,6 @@ [[cypher-intro]] ifdef::backend-pdf[] -= Neo4j {neo4j-version} Cypher Manual += Neo4j Cypher {page-version} Manual endif::[] ifndef::backend-pdf[] = Introduction From e0be1d32d3e965bf693f52ab2b80b39e5bbce095 Mon Sep 17 00:00:00 2001 From: Richard Sill <156673635+rsill-neo4j@users.noreply.github.com> Date: Fri, 1 Aug 2025 16:37:47 +0200 Subject: [PATCH 30/72] added select cypher versions link (#1348) --- modules/ROOT/pages/patterns/variable-length-patterns.adoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/patterns/variable-length-patterns.adoc b/modules/ROOT/pages/patterns/variable-length-patterns.adoc index aa64152d4..e301934a2 100644 --- a/modules/ROOT/pages/patterns/variable-length-patterns.adoc +++ b/modules/ROOT/pages/patterns/variable-length-patterns.adoc @@ -562,4 +562,5 @@ Using inline predicates or making quantified path patterns more specific where p == Further reading * link:https://medium.com/neo4j/getting-from-denmark-hill-to-gatwick-airport-with-quantified-path-patterns-bed38da27ca1[Neo4j Developer Blog: Getting From Denmark Hill to Gatwick Airport With Quantified Path Patterns] -* link:https://medium.com/neo4j/did-you-take-the-neo4j-5-cypher-bullet-train-6a857c92d669[Neo4j Developer Blog: Did You Take the Neo4j 5 Cypher Bullet Train?] \ No newline at end of file +* link:https://medium.com/neo4j/did-you-take-the-neo4j-5-cypher-bullet-train-6a857c92d669[Neo4j Developer Blog: Did You Take the Neo4j 5 Cypher Bullet Train?] +* xref:queries/select-version.adoc[Select Cypher version] \ No newline at end of file From 7a53b3b9ad736984575825afb02f7ea672d3fc1c Mon Sep 17 00:00:00 2001 From: Richard Sill Date: Fri, 1 Aug 2025 16:41:37 +0200 Subject: [PATCH 31/72] corrected blog post link --- modules/ROOT/pages/patterns/variable-length-patterns.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/patterns/variable-length-patterns.adoc b/modules/ROOT/pages/patterns/variable-length-patterns.adoc index e301934a2..79322c468 100644 --- a/modules/ROOT/pages/patterns/variable-length-patterns.adoc +++ b/modules/ROOT/pages/patterns/variable-length-patterns.adoc @@ -563,4 +563,4 @@ Using inline predicates or making quantified path patterns more specific where p * link:https://medium.com/neo4j/getting-from-denmark-hill-to-gatwick-airport-with-quantified-path-patterns-bed38da27ca1[Neo4j Developer Blog: Getting From Denmark Hill to Gatwick Airport With Quantified Path Patterns] * link:https://medium.com/neo4j/did-you-take-the-neo4j-5-cypher-bullet-train-6a857c92d669[Neo4j Developer Blog: Did You Take the Neo4j 5 Cypher Bullet Train?] -* xref:queries/select-version.adoc[Select Cypher version] \ No newline at end of file +* link:https://medium.com/neo4j/cypher-versioning-39ebb40fd171[Neo4j Developer Blog: Cypher Versioning] \ No newline at end of file From e56e0d72ec808630c28319d44973dfbd5468dd5d Mon Sep 17 00:00:00 2001 From: Richard Sill Date: Fri, 1 Aug 2025 16:47:45 +0200 Subject: [PATCH 32/72] blog post link in correct page --- modules/ROOT/pages/patterns/variable-length-patterns.adoc | 3 +-- modules/ROOT/pages/queries/select-version.adoc | 5 +++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/patterns/variable-length-patterns.adoc b/modules/ROOT/pages/patterns/variable-length-patterns.adoc index 79322c468..aa64152d4 100644 --- a/modules/ROOT/pages/patterns/variable-length-patterns.adoc +++ b/modules/ROOT/pages/patterns/variable-length-patterns.adoc @@ -562,5 +562,4 @@ Using inline predicates or making quantified path patterns more specific where p == Further reading * link:https://medium.com/neo4j/getting-from-denmark-hill-to-gatwick-airport-with-quantified-path-patterns-bed38da27ca1[Neo4j Developer Blog: Getting From Denmark Hill to Gatwick Airport With Quantified Path Patterns] -* link:https://medium.com/neo4j/did-you-take-the-neo4j-5-cypher-bullet-train-6a857c92d669[Neo4j Developer Blog: Did You Take the Neo4j 5 Cypher Bullet Train?] -* link:https://medium.com/neo4j/cypher-versioning-39ebb40fd171[Neo4j Developer Blog: Cypher Versioning] \ No newline at end of file +* link:https://medium.com/neo4j/did-you-take-the-neo4j-5-cypher-bullet-train-6a857c92d669[Neo4j Developer Blog: Did You Take the Neo4j 5 Cypher Bullet Train?] \ No newline at end of file diff --git a/modules/ROOT/pages/queries/select-version.adoc b/modules/ROOT/pages/queries/select-version.adoc index 8f119aafd..64942e299 100644 --- a/modules/ROOT/pages/queries/select-version.adoc +++ b/modules/ROOT/pages/queries/select-version.adoc @@ -214,3 +214,8 @@ MATCH (n:Person) RETURN n.name ---- +[[further-reading]] +== Further reading + +* link:https://medium.com/neo4j/cypher-versioning-39ebb40fd171[Neo4j Developer Blog: Cypher Versioning] + From 2e4a679a95d662448f7ded750d360f09ee53f2fb Mon Sep 17 00:00:00 2001 From: Richard Sill <156673635+rsill-neo4j@users.noreply.github.com> Date: Fri, 1 Aug 2025 16:58:41 +0200 Subject: [PATCH 33/72] More blog post links (#1349) --- modules/ROOT/pages/patterns/match-modes.adoc | 6 ++++++ modules/ROOT/pages/patterns/variable-length-patterns.adoc | 2 +- .../pages/queries/composed-queries/conditional-queries.adoc | 6 ++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/patterns/match-modes.adoc b/modules/ROOT/pages/patterns/match-modes.adoc index c59a8a885..143081833 100644 --- a/modules/ROOT/pages/patterns/match-modes.adoc +++ b/modules/ROOT/pages/patterns/match-modes.adoc @@ -256,3 +256,9 @@ RETURN count(p) AS pathCount ---- The quantified path pattern may yield an infinite number of rows under match mode 'REPEATABLE ELEMENTS'. Add an upper bound to the quantified path pattern. ---- + + +[[further-reading]] +== Further reading + +* link:https://medium.com/neo4j/i-would-walk-500-miles-5d23c33d967f[Neo4j Developer Blog: I Would Walk 500 Miles] \ No newline at end of file diff --git a/modules/ROOT/pages/patterns/variable-length-patterns.adoc b/modules/ROOT/pages/patterns/variable-length-patterns.adoc index aa64152d4..251dbdc2b 100644 --- a/modules/ROOT/pages/patterns/variable-length-patterns.adoc +++ b/modules/ROOT/pages/patterns/variable-length-patterns.adoc @@ -562,4 +562,4 @@ Using inline predicates or making quantified path patterns more specific where p == Further reading * link:https://medium.com/neo4j/getting-from-denmark-hill-to-gatwick-airport-with-quantified-path-patterns-bed38da27ca1[Neo4j Developer Blog: Getting From Denmark Hill to Gatwick Airport With Quantified Path Patterns] -* link:https://medium.com/neo4j/did-you-take-the-neo4j-5-cypher-bullet-train-6a857c92d669[Neo4j Developer Blog: Did You Take the Neo4j 5 Cypher Bullet Train?] \ No newline at end of file +* link:https://medium.com/neo4j/did-you-take-the-neo4j-5-cypher-bullet-train-6a857c92d669[Neo4j Developer Blog: Did You Take the Neo4j 5 Cypher Bullet Train?] diff --git a/modules/ROOT/pages/queries/composed-queries/conditional-queries.adoc b/modules/ROOT/pages/queries/composed-queries/conditional-queries.adoc index 02cada893..00e9ad836 100644 --- a/modules/ROOT/pages/queries/composed-queries/conditional-queries.adoc +++ b/modules/ROOT/pages/queries/composed-queries/conditional-queries.adoc @@ -432,3 +432,9 @@ RETURN person, collect(message) AS status |=== ===== + + +[[further-reading]] +== Further reading + +* link:https://medium.com/neo4j/cypher-conditional-queries-eb46ebcb8eb9[Neo4j Developer Blog: Cypher Conditional Queries] \ No newline at end of file From 1f9fe0970c2354b990048e0c5450e1427108acc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Mon, 4 Aug 2025 10:54:26 +0200 Subject: [PATCH 34/72] update antora for 2025.08 (#1350) --- antora.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/antora.yml b/antora.yml index 817290de9..77f6d79a0 100644 --- a/antora.yml +++ b/antora.yml @@ -7,4 +7,4 @@ nav: - modules/ROOT/content-nav.adoc asciidoc: attributes: - neo4j-version: '2025.07' + neo4j-version: '2025.08' From 1da5417cbe9425bf2d412e0cf1e642faf88be860 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Mon, 4 Aug 2025 14:23:13 +0200 Subject: [PATCH 35/72] Fix links to ops manual for select Cypher versions (#1351) --- modules/ROOT/pages/queries/select-version.adoc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/ROOT/pages/queries/select-version.adoc b/modules/ROOT/pages/queries/select-version.adoc index 64942e299..d044ea7c5 100644 --- a/modules/ROOT/pages/queries/select-version.adoc +++ b/modules/ROOT/pages/queries/select-version.adoc @@ -106,10 +106,10 @@ For more information about how to change and view the default language of new an * link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/composite-databases/alter-composite-databases/#alter-default-language-composite-database[Alter the default Cypher version of a composite database] * link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/aliases/manage-aliases-standard-databases/#alter-default-language-remote-database-alias[Alter the default Cypher version of a remote database alias] * link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/standard-databases/listing-databases/#_show_the_default_cypher_version_of_a_database[Show the default Cypher version of a database] -* link:{neo4j-docs-base-uri}/operations-manual/authentication-authorization/dbms-administration/#_grant_privilege_to_modify_the_default_language_of_standard_databases[Grant privilege to modify the default language of standard databases] -* link:{neo4j-docs-base-uri}/operations-manual/authentication-authorization/dbms-administration/#grant-privilege-alter-composite-database[Grant privilege to modify composite databases] (required in order to alter the default language of a composite database) +* link:{neo4j-docs-base-uri}/operations-manual/current/authentication-authorization/dbms-administration/#_grant_privilege_to_modify_the_default_language_of_standard_databases[Grant privilege to modify the default language of standard databases] +* link:{neo4j-docs-base-uri}/operations-manual/current/authentication-authorization/dbms-administration/#grant-privilege-alter-composite-database[Grant privilege to modify composite databases] (required in order to alter the default language of a composite database) -For information about Cypher versions and DBMS upgrades, see the link:{neo4j-docs-base-uri}/upgrade-migration-guide/current/_cypher_versions[Upgrade and migration guide -> Cypher versions]. +For information about Cypher versions and DBMS upgrades, see the link:{neo4j-docs-base-uri}/upgrade-migration-guide/current/#_cypher_versions[Upgrade and migration guide -> Cypher versions]. [[migrate-queries-from-5-to-25]] == Migrating queries from Cypher 5 to Cypher 25 From 57d10bf37fd4311755f9aa48f1e1dadfb355f087 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Mon, 4 Aug 2025 15:05:18 +0200 Subject: [PATCH 36/72] Fix broken links (#1352) --- .../deprecations-additions-removals-compatibility.adoc | 2 +- modules/ROOT/pages/introduction/cypher-aura.adoc | 5 ++--- modules/ROOT/pages/introduction/index.adoc | 6 +++--- modules/ROOT/pages/queries/select-version.adoc | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc index 7378b91a4..51b7133a9 100644 --- a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc +++ b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc @@ -397,7 +397,7 @@ a| Set the default Cypher version for a remote database alias when creating it. The available versions are `CYPHER 5` and `CYPHER 25`. Local database aliases and database aliases in composite databases cannot be assigned a default Cypher version. Local database aliases always have the Cypher version of their target database and database aliases in composite databases always have the Cypher version of the composite database they belong to. -For more information, see the link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/aliases/manage-aliases-standard-databases/#_set_a_default_cypher_version_for_remote_database_aliases[Operations Manual -> Set a default Cypher version for remote database aliases]. +For more information, see the link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/aliases/manage-aliases-standard-databases/#set-default-language-for-remote-database-aliases[Operations Manual -> Set a default Cypher version for remote database aliases]. a| label:functionality[] diff --git a/modules/ROOT/pages/introduction/cypher-aura.adoc b/modules/ROOT/pages/introduction/cypher-aura.adoc index 54e630c9c..dbb4cacde 100644 --- a/modules/ROOT/pages/introduction/cypher-aura.adoc +++ b/modules/ROOT/pages/introduction/cypher-aura.adoc @@ -42,6 +42,5 @@ For more information, see the link:{neo4j-docs-base-uri}/operations-manual/curre Each different tier of Aura has a customized version of the Cypher Cheat Sheet which only shows the features of Cypher available for the chosen tier. -The Cypher Cheat Sheet can be accessed link:{neo4j-docs-base-uri}/cypher-cheat-sheet/current/auradb-enterprise/[here]. -You can select your desired Aura tier and Neo4j version by using the dropdown menus provided. -Note that the default tier is AuraDB Virtual Dedicated Cloud. +The Cypher Cheat Sheet can be accessed link:{neo4j-docs-base-uri}/cypher-cheat-sheet/25/all[here]. +You can select your desired Aura tier and Cypher version by using the dropdown menus provided. diff --git a/modules/ROOT/pages/introduction/index.adoc b/modules/ROOT/pages/introduction/index.adoc index e8b1d53ea..a60945cdc 100644 --- a/modules/ROOT/pages/introduction/index.adoc +++ b/modules/ROOT/pages/introduction/index.adoc @@ -19,12 +19,12 @@ For information about new features added to Cypher 25, see xref:deprecations-add The Cypher Manual aims to be as instructive as possible to readers from a variety of backgrounds and professions, such as developers, administrators, and academic researchers. -If you are new to Cypher and Neo4j, you can visit the link:{neo4j-docs-base-uri}/getting-started/current/cypher-intro/[Getting Started Guide -> Introduction to Cypher] chapter. +If you are new to Cypher and Neo4j, you can visit the link:{neo4j-docs-base-uri}/getting-started/cypher/[Getting Started Guide -> Cypher] chapter. Additionally, https://graphacademy.neo4j.com/[Neo4j GraphAcademy] has a variety of free courses tailored for all levels of experience. -For a reference of all available Cypher features, see the link:{neo4j-docs-base-uri}/cypher-cheat-sheet/current/[Cypher Cheat Sheet]. +For a reference of all available Cypher features, see the link:{neo4j-docs-base-uri}/cypher-cheat-sheet/25/all/[Cypher Cheat Sheet]. -For a downloadable PDF version of the Cypher Manual, visit the link:{neo4j-docs-base-uri}/resources/docs-archive/#_cypher_query_language[Neo4j documentation archive]. +For a downloadable PDF version of the Cypher Manual, visit the link:{neo4j-docs-base-uri}/docs-archive/#_cypher_query_language[Neo4j documentation archive]. This introduction will cover the following topics: diff --git a/modules/ROOT/pages/queries/select-version.adoc b/modules/ROOT/pages/queries/select-version.adoc index d044ea7c5..2bdf362a9 100644 --- a/modules/ROOT/pages/queries/select-version.adoc +++ b/modules/ROOT/pages/queries/select-version.adoc @@ -34,7 +34,7 @@ Although Cypher 5 queries are currently supported on Neo4j 2025.06+ databases, t == Select the default Cypher version for a database Databases created on, or migrated to, Neo4j 2025.06 or later will continue to have Cypher 5 as their default language (unless link:{neo4j-docs-base-uri}/operations-manual/current/configuration/configuration-settings/#config_db.query.default_language[`db.query.default_language`] is set to `CYPHER_25`). -This is true for link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/#manage-database-systems[system, standard, and composite] Neo4j databases. +This is true for link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/[system, standard, and composite] Neo4j databases. However, it is possible to set a different default language on both new and existing system, standard, and composite databases. To select a default Cypher version when creating a database, add `DEFAULT LANGUAGE ` to the link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/standard-databases/create-databases/[`CREATE DATABASE`] statement. From d41c76892edfacdc1df71e27d0234c05ca935ae6 Mon Sep 17 00:00:00 2001 From: Lidia Zuin <102308961+lidiazuin@users.noreply.github.com> Date: Thu, 7 Aug 2025 15:56:11 +0200 Subject: [PATCH 37/72] Renaming overview.adoc to index (#1353) --- modules/ROOT/content-nav.adoc | 4 ++-- modules/ROOT/pages/clauses/delete.adoc | 2 +- modules/ROOT/pages/clauses/load-csv.adoc | 2 +- modules/ROOT/pages/clauses/match.adoc | 2 +- modules/ROOT/pages/clauses/merge.adoc | 2 +- modules/ROOT/pages/indexes/index.adoc | 4 ++-- .../search-performance-indexes/{overview.adoc => index.adoc} | 0 .../indexes/semantic-indexes/{overview.adoc => index.adoc} | 0 modules/ROOT/pages/queries/basic.adoc | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) rename modules/ROOT/pages/indexes/search-performance-indexes/{overview.adoc => index.adoc} (100%) rename modules/ROOT/pages/indexes/semantic-indexes/{overview.adoc => index.adoc} (100%) diff --git a/modules/ROOT/content-nav.adoc b/modules/ROOT/content-nav.adoc index c58e92758..ebe74336d 100644 --- a/modules/ROOT/content-nav.adoc +++ b/modules/ROOT/content-nav.adoc @@ -105,11 +105,11 @@ * xref:genai-integrations.adoc[] * xref:indexes/index.adoc[] -** xref:indexes/search-performance-indexes/overview.adoc[] +** xref:indexes/search-performance-indexes/index.adoc[] *** xref:indexes/search-performance-indexes/managing-indexes.adoc[] *** xref:indexes/search-performance-indexes/using-indexes.adoc[] *** xref:indexes/search-performance-indexes/index-hints.adoc[] -** xref:indexes/semantic-indexes/overview.adoc[] +** xref:indexes/semantic-indexes/index.adoc[] *** xref:indexes/semantic-indexes/full-text-indexes.adoc[] *** xref:indexes/semantic-indexes/vector-indexes.adoc[] ** xref:indexes/syntax.adoc[] diff --git a/modules/ROOT/pages/clauses/delete.adoc b/modules/ROOT/pages/clauses/delete.adoc index 11584513a..de7d8bf7c 100644 --- a/modules/ROOT/pages/clauses/delete.adoc +++ b/modules/ROOT/pages/clauses/delete.adoc @@ -142,7 +142,7 @@ DETACH DELETE n Deleted 3 nodes, deleted 1 relationship ---- -`DETACH DELETE` is useful when experimenting with small example datasets, but it is not suitable for deleting large amounts of data, nor does it delete xref:indexes/search-performance-indexes/overview.adoc[indexes] and xref:constraints/index.adoc[constraints]. +`DETACH DELETE` is useful when experimenting with small example datasets, but it is not suitable for deleting large amounts of data, nor does it delete xref:indexes/search-performance-indexes/index.adoc[indexes] and xref:constraints/index.adoc[constraints]. To delete large amounts of data without deleting indexes and constraints, use xref::subqueries/subqueries-in-transactions.adoc#delete-with-call-in-transactions[CALL subqueries in transactions] instead. diff --git a/modules/ROOT/pages/clauses/load-csv.adoc b/modules/ROOT/pages/clauses/load-csv.adoc index 0c48a2d2f..1c98a6053 100644 --- a/modules/ROOT/pages/clauses/load-csv.adoc +++ b/modules/ROOT/pages/clauses/load-csv.adoc @@ -347,7 +347,7 @@ Added 4 nodes, Set 4 properties, Added 4 labels [NOTE] `MERGE` queries using dynamic values may not be as performant as those using static values. -This is because the xref:planning-and-tuning/execution-plans.adoc[Cypher planner] uses statically available information when planning queries to determine whether to use an xref:indexes/search-performance-indexes/overview.adoc[index] or not, and this is not possible when using dynamic values. +This is because the xref:planning-and-tuning/execution-plans.adoc[Cypher planner] uses statically available information when planning queries to determine whether to use an xref:indexes/search-performance-indexes/index.adoc[index] or not, and this is not possible when using dynamic values. For more information, see xref:clauses/merge.adoc#dynamic-merge-caveats[`MERGE` using dynamic node labels and relationship types -> Performance caveats]. === Import compressed CSV files diff --git a/modules/ROOT/pages/clauses/match.adoc b/modules/ROOT/pages/clauses/match.adoc index 030457a2a..7c491ffdb 100644 --- a/modules/ROOT/pages/clauses/match.adoc +++ b/modules/ROOT/pages/clauses/match.adoc @@ -640,7 +640,7 @@ RETURN relationshipType, count(r) AS relationshipCount === Performance caveats `MATCH` queries using dynamic values may not be as performant as those using static values. -This is because the xref:planning-and-tuning/execution-plans.adoc[Cypher planner] uses statically available information when planning queries to determine whether to use an xref:indexes/search-performance-indexes/overview.adoc[index] or not, and this is not possible when using dynamic values. +This is because the xref:planning-and-tuning/execution-plans.adoc[Cypher planner] uses statically available information when planning queries to determine whether to use an xref:indexes/search-performance-indexes/index.adoc[index] or not, and this is not possible when using dynamic values. As a result, `MATCH` queries using dynamic values cannot leverage xref:planning-and-tuning/operators/operators-detail.adoc#leaf-operators[index scans or seeks] and must instead use the xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-all-nodes-scan[`AllNodesScan`] operator, which reads all nodes from the node store and is therefore more costly. diff --git a/modules/ROOT/pages/clauses/merge.adoc b/modules/ROOT/pages/clauses/merge.adoc index f09522de4..b244c19b9 100644 --- a/modules/ROOT/pages/clauses/merge.adoc +++ b/modules/ROOT/pages/clauses/merge.adoc @@ -741,7 +741,7 @@ RETURN greta.name AS name, labels(greta) AS labels, type(rel) AS relType, collec === Performance caveats `MERGE` queries that use dynamic values may not be as performant as those using static values. -This is because the xref:planning-and-tuning/execution-plans.adoc[Cypher planner] uses statically available information when planning queries to determine whether to use an xref:indexes/search-performance-indexes/overview.adoc[index] or not, and this is not possible when using dynamic values. +This is because the xref:planning-and-tuning/execution-plans.adoc[Cypher planner] uses statically available information when planning queries to determine whether to use an xref:indexes/search-performance-indexes/index.adoc[index] or not, and this is not possible when using dynamic values. As a result, `MERGE` queries with dynamic values cannot leverage xref:planning-and-tuning/operators/operators-detail.adoc#leaf-operators[index scans or seeks] and must instead use the xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-all-nodes-scan[`AllNodesScan`] operator, which reads all nodes from the node store and is therefore more costly. diff --git a/modules/ROOT/pages/indexes/index.adoc b/modules/ROOT/pages/indexes/index.adoc index 36264dc26..570e51f00 100644 --- a/modules/ROOT/pages/indexes/index.adoc +++ b/modules/ROOT/pages/indexes/index.adoc @@ -9,7 +9,7 @@ Once an index has been created, it will be automatically populated and updated b Neo4j supports two categories of indexes: -- xref:indexes/search-performance-indexes/overview.adoc[Search-performance indexes], for speeding up data retrieval based on _exact_ matches. +- xref:indexes/search-performance-indexes/index.adoc[Search-performance indexes], for speeding up data retrieval based on _exact_ matches. This category includes range, text, point, and token lookup indexes. -- xref:indexes/semantic-indexes/overview.adoc[Semantic indexes], for _approximate_ matches and to compute similarity scores between a query string and the matching data. +- xref:indexes/semantic-indexes/index.adoc[Semantic indexes], for _approximate_ matches and to compute similarity scores between a query string and the matching data. This category includes full-text and vector indexes. diff --git a/modules/ROOT/pages/indexes/search-performance-indexes/overview.adoc b/modules/ROOT/pages/indexes/search-performance-indexes/index.adoc similarity index 100% rename from modules/ROOT/pages/indexes/search-performance-indexes/overview.adoc rename to modules/ROOT/pages/indexes/search-performance-indexes/index.adoc diff --git a/modules/ROOT/pages/indexes/semantic-indexes/overview.adoc b/modules/ROOT/pages/indexes/semantic-indexes/index.adoc similarity index 100% rename from modules/ROOT/pages/indexes/semantic-indexes/overview.adoc rename to modules/ROOT/pages/indexes/semantic-indexes/index.adoc diff --git a/modules/ROOT/pages/queries/basic.adoc b/modules/ROOT/pages/queries/basic.adoc index a2ea25657..4660569f5 100644 --- a/modules/ROOT/pages/queries/basic.adoc +++ b/modules/ROOT/pages/queries/basic.adoc @@ -902,5 +902,5 @@ DETACH DELETE n ---- [NOTE] -`DETACH DELETE` is not suitable for deleting large amounts of data, nor does it delete xref:indexes/search-performance-indexes/overview.adoc[indexes] and xref:constraints/index.adoc[constraints]. +`DETACH DELETE` is not suitable for deleting large amounts of data, nor does it delete xref:indexes/search-performance-indexes/index.adoc[indexes] and xref:constraints/index.adoc[constraints]. For more information, and alternatives to `DETACH DELETE`, see xref:clauses/delete.adoc#delete-all-nodes-and-relationships[`DELETE` -> Delete all nodes and relationships]. From ebe0db365341c8fe7be46b9aa559baea0c350acd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 13:02:43 +0200 Subject: [PATCH 38/72] Bump the prod-dependencies group with 2 updates (#1356) Bumps the prod-dependencies group with 2 updates: [@antora/cli](https://gitlab.com/antora/antora) and [@antora/site-generator-default](https://gitlab.com/antora/antora). Updates `@antora/cli` from 3.1.10 to 3.1.12
Commits
  • 0fd8b9c release 3.1.12
  • e413f50 update what's new for upcoming 3.1.12 release
  • 02d1fc2 populate what's new page for upcoming 3.1.11 release [skip ci]
  • b034946 refresh dependency lock file
  • 418f9c0 backport fix for #1179 skip check for remote branches in non-managed reposito...
  • 93a1719 remove unused remoteName parameter in selectStartPaths function
  • 1475f94 move credential URLs to separate section on private repository auth page
  • ea02909 clarify that credentials entry with repository path takes precedence
  • db94567 show full code for system git credential manager to make it easier to copy; s...
  • c865d4e clarify that the require helper has a fallback
  • Additional commits viewable in compare view

Updates `@antora/site-generator-default` from 3.1.10 to 3.1.12
Commits
  • 0fd8b9c release 3.1.12
  • e413f50 update what's new for upcoming 3.1.12 release
  • 02d1fc2 populate what's new page for upcoming 3.1.11 release [skip ci]
  • b034946 refresh dependency lock file
  • 418f9c0 backport fix for #1179 skip check for remote branches in non-managed reposito...
  • 93a1719 remove unused remoteName parameter in selectStartPaths function
  • 1475f94 move credential URLs to separate section on private repository auth page
  • ea02909 clarify that credentials entry with repository path takes precedence
  • db94567 show full code for system git credential manager to make it easier to copy; s...
  • c865d4e clarify that the require helper has a fallback
  • Additional commits viewable in compare view

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 808 +++++++++++++++++++++++++++++----------------- package.json | 4 +- 2 files changed, 515 insertions(+), 297 deletions(-) diff --git a/package-lock.json b/package-lock.json index b4c688bc1..acdb7aeae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,8 @@ "version": "25", "license": "ISC", "dependencies": { - "@antora/cli": "^3.1.10", - "@antora/site-generator-default": "^3.1.10", + "@antora/cli": "^3.1.12", + "@antora/site-generator-default": "^3.1.12", "@neo4j-antora/antora-add-notes": "^0.3.2", "@neo4j-antora/antora-modify-sitemaps": "^0.7.1", "@neo4j-antora/antora-page-roles": "^0.3.1", @@ -26,12 +26,11 @@ } }, "node_modules/@antora/asciidoc-loader": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/asciidoc-loader/-/asciidoc-loader-3.1.10.tgz", - "integrity": "sha512-np0JkOV37CK7V4eDZUZXf4fQuCKYW3Alxl8FlyzBevXi2Ujv29O82JLbHbv1cyTsvGkGNNB+gzJIx9XBsQ7+Nw==", - "license": "MPL-2.0", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/asciidoc-loader/-/asciidoc-loader-3.1.12.tgz", + "integrity": "sha512-KP81whxkQzyNIZi/lnX3FEHUEUV2YAsxb07Dsx6qjVMIX8yMFRB/s6EAYgQralLnZDC1uCfLDXEIFLMUEGsDIw==", "dependencies": { - "@antora/logger": "3.1.10", + "@antora/logger": "3.1.12", "@antora/user-require-helper": "~3.0", "@asciidoctor/core": "~2.2" }, @@ -40,13 +39,12 @@ } }, "node_modules/@antora/cli": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/cli/-/cli-3.1.10.tgz", - "integrity": "sha512-gp8u9aVM0w1DtWSsB5PwvEfFYKrooPENLhN58RAfdgTrcsTsWw+CDysFZPgEaHB0Y1ZbanR82ZH/f6JVKGcZfQ==", - "license": "MPL-2.0", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/cli/-/cli-3.1.12.tgz", + "integrity": "sha512-j6CPjaW+OcEMecZFWOa38WsT4UvNVXEwUJRRTITtGbIk4m7z7RMrFCeai4AUX6cidX9LgDkFq6w2mjrYeVSS+A==", "dependencies": { - "@antora/logger": "3.1.10", - "@antora/playbook-builder": "3.1.10", + "@antora/logger": "3.1.12", + "@antora/playbook-builder": "3.1.12", "@antora/user-require-helper": "~3.0", "commander": "~11.1" }, @@ -58,13 +56,12 @@ } }, "node_modules/@antora/content-aggregator": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/content-aggregator/-/content-aggregator-3.1.10.tgz", - "integrity": "sha512-OT6ZcCA7LrtNfrAZUr3hFh+Z/1isKpsfnqFjCDC66NEMqIyzJO99jq0CM66rYlYhyX7mb5BwEua8lHcwpOXNow==", - "license": "MPL-2.0", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/content-aggregator/-/content-aggregator-3.1.12.tgz", + "integrity": "sha512-l+6KhqQHfoficcgm4tzDmFhHJ0mDNZBWAhwO60b9HzWdcc9hPDo87KU2t/vwxC6P+o9Vzdc6xa9EWgwHqw9/HQ==", "dependencies": { "@antora/expand-path-helper": "~3.0", - "@antora/logger": "3.1.10", + "@antora/logger": "3.1.12", "@antora/user-require-helper": "~3.0", "braces": "~3.0", "cache-directory": "~2.0", @@ -84,10 +81,9 @@ } }, "node_modules/@antora/content-aggregator/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "license": "MIT", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "engines": { "node": ">=12" }, @@ -96,13 +92,12 @@ } }, "node_modules/@antora/content-classifier": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/content-classifier/-/content-classifier-3.1.10.tgz", - "integrity": "sha512-3JJl4IIiTX00v/MirK603NoqIcHjGYAaRWt3Q4U03tI1Fv2Aho/ypO3FE45069jFf0Dx2uDJfp5kapb9gaIjdQ==", - "license": "MPL-2.0", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/content-classifier/-/content-classifier-3.1.12.tgz", + "integrity": "sha512-Q+X5w3U2yoZmsFTRi5jWvx67PEq++S6gdO5PJ4dQ0r4nmDaMYdhRtfrxZeni4RmWtDxF+f0GZYw8RgyhEIBRdw==", "dependencies": { - "@antora/asciidoc-loader": "3.1.10", - "@antora/logger": "3.1.10", + "@antora/asciidoc-loader": "3.1.12", + "@antora/logger": "3.1.12", "mime-types": "~2.1", "vinyl": "~3.0" }, @@ -111,12 +106,11 @@ } }, "node_modules/@antora/document-converter": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/document-converter/-/document-converter-3.1.10.tgz", - "integrity": "sha512-qi9ctgcKal8tZtWflVo66w+4zCJoBmUKRV+eA9aRRR09KDdU9r514vu1adWNgniPppISr90zD13V5l2JUy/2CQ==", - "license": "MPL-2.0", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/document-converter/-/document-converter-3.1.12.tgz", + "integrity": "sha512-dOh/X0XddSW6Ho529jmD0E6M97RVRMOR4G1xdBJ6O9RUPZfOz2ERijufdi8jZrz5aDrJLpB1hzAbFccCGlzMHA==", "dependencies": { - "@antora/asciidoc-loader": "3.1.10" + "@antora/asciidoc-loader": "3.1.12" }, "engines": { "node": ">=16.0.0" @@ -132,10 +126,9 @@ } }, "node_modules/@antora/file-publisher": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/file-publisher/-/file-publisher-3.1.10.tgz", - "integrity": "sha512-DPR/0d1P+kr3qV4T0Gh81POEO/aCmNWIp/oLUYAhr0HHOcFzgpTUUoLStgcYynZPFRIB7EYKSab+oYSCK17DGA==", - "license": "MPL-2.0", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/file-publisher/-/file-publisher-3.1.12.tgz", + "integrity": "sha512-psinQkI3IrARRejK7fFKVGYYE5z01jDUHHcUSDRR48eriDO/K/wnky2n2BbKPQsPjYZQP8LyPfVKUsTadsxx8A==", "dependencies": { "@antora/expand-path-helper": "~3.0", "@antora/user-require-helper": "~3.0", @@ -147,10 +140,9 @@ } }, "node_modules/@antora/logger": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/logger/-/logger-3.1.10.tgz", - "integrity": "sha512-WSuIxEP2tVrhWtTj/sIrwBDjpi4ldB/1Kpiu4PXmY4/qeWP8thW6u8nXdwdDcWss5zqkZWjourvWKwVq7y8Wjg==", - "license": "MPL-2.0", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/logger/-/logger-3.1.12.tgz", + "integrity": "sha512-u+rw3aFW7ScPyG/aWcxGnKJl/++34kzvdZEi3FIGjqtgsEmZ0A4UKbH3t4LZOiQiv9UdcHAiv5+lxQRx+7LgBQ==", "dependencies": { "@antora/expand-path-helper": "~3.0", "pino": "~9.2", @@ -162,24 +154,22 @@ } }, "node_modules/@antora/navigation-builder": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/navigation-builder/-/navigation-builder-3.1.10.tgz", - "integrity": "sha512-aLMK49nYsSB3mEZbLkmUXDAUYmscv2AFWu+5c3eqVGkQ6Wgyd79WQ6Bz3/TN9YqkzGL+PqGs0G39F0VQzD23Hw==", - "license": "MPL-2.0", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/navigation-builder/-/navigation-builder-3.1.12.tgz", + "integrity": "sha512-C8Ty/yQYiAr793Xsox+AD8tdDzJYUVKs6pBoSNQQcSmabej93s0WnaSiezmBJAlj2/n5KysKG6/fQDqKnCAGyg==", "dependencies": { - "@antora/asciidoc-loader": "3.1.10" + "@antora/asciidoc-loader": "3.1.12" }, "engines": { "node": ">=16.0.0" } }, "node_modules/@antora/page-composer": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/page-composer/-/page-composer-3.1.10.tgz", - "integrity": "sha512-JoEg8J8HVsnPmAgUrYSGzf0C8rQefXyCi/18ucy0utyfUvlJNsZvUbGUPx62Het9p0JP0FkAz2MTLyDlNdArVg==", - "license": "MPL-2.0", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/page-composer/-/page-composer-3.1.12.tgz", + "integrity": "sha512-DpGYXwEoo9Ku/Udz/vQGKAbLqibyesL/MI+hG4ykaj43NzN5kxAfmV1UCb9ZrB2x8JCkPEJQb5ibZntz93b2MA==", "dependencies": { - "@antora/logger": "3.1.10", + "@antora/logger": "3.1.12", "handlebars": "~4.7", "require-from-string": "~2.0" }, @@ -188,10 +178,9 @@ } }, "node_modules/@antora/playbook-builder": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/playbook-builder/-/playbook-builder-3.1.10.tgz", - "integrity": "sha512-UB8UmRYfkKgActTUlotdVS4FKGjaZgTnSXE7Fns1xb3/3HRanWvI+Yze1OmCkGC33cTpoQFnSYp7ySEH8LaiBw==", - "license": "MPL-2.0", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/playbook-builder/-/playbook-builder-3.1.12.tgz", + "integrity": "sha512-5sizDOdg5SWMs84EWGRBzmej1V23tpGBwHOqjI2BJEGh8Sase1qC5uZXx6aJDEVbzmlGOm4RvysWbn9oap248A==", "dependencies": { "@iarna/toml": "~2.2", "convict": "~6.2", @@ -203,10 +192,9 @@ } }, "node_modules/@antora/redirect-producer": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/redirect-producer/-/redirect-producer-3.1.10.tgz", - "integrity": "sha512-IbWJGh6LmsxJQ821h0B9JfooofFZBgFLZxsbp/IoTLkBFGLFAY5tDRvB6rvubfNLRoSjM8VjEUXGqVLlwZOb+g==", - "license": "MPL-2.0", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/redirect-producer/-/redirect-producer-3.1.12.tgz", + "integrity": "sha512-bVoKC52nKzLn1ROM9zcotYoakr7gdfrBVPwWRSCvNu+Yx0iUOiCWJAA6+DsY7ut4l4LlaERp1oTvAhViX9TQCQ==", "dependencies": { "vinyl": "~3.0" }, @@ -215,24 +203,23 @@ } }, "node_modules/@antora/site-generator": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/site-generator/-/site-generator-3.1.10.tgz", - "integrity": "sha512-NCULYtwUjIyr5FGCymhfG/zDVUmZ6pfmCPorka8mAzo4/GDx1T7bgaRL9rEIyf2AMqcm7apQiAz03mpU4kucsw==", - "license": "MPL-2.0", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/site-generator/-/site-generator-3.1.12.tgz", + "integrity": "sha512-vUpbK6bdvP3zuVxmvhF3Rz+okNXD95HWHw6xb08qEraZOWPZHOXl23twqprmk12O0PunN9WZd6/Pf14zhD208A==", "dependencies": { - "@antora/asciidoc-loader": "3.1.10", - "@antora/content-aggregator": "3.1.10", - "@antora/content-classifier": "3.1.10", - "@antora/document-converter": "3.1.10", - "@antora/file-publisher": "3.1.10", - "@antora/logger": "3.1.10", - "@antora/navigation-builder": "3.1.10", - "@antora/page-composer": "3.1.10", - "@antora/playbook-builder": "3.1.10", - "@antora/redirect-producer": "3.1.10", - "@antora/site-mapper": "3.1.10", - "@antora/site-publisher": "3.1.10", - "@antora/ui-loader": "3.1.10", + "@antora/asciidoc-loader": "3.1.12", + "@antora/content-aggregator": "3.1.12", + "@antora/content-classifier": "3.1.12", + "@antora/document-converter": "3.1.12", + "@antora/file-publisher": "3.1.12", + "@antora/logger": "3.1.12", + "@antora/navigation-builder": "3.1.12", + "@antora/page-composer": "3.1.12", + "@antora/playbook-builder": "3.1.12", + "@antora/redirect-producer": "3.1.12", + "@antora/site-mapper": "3.1.12", + "@antora/site-publisher": "3.1.12", + "@antora/ui-loader": "3.1.12", "@antora/user-require-helper": "~3.0" }, "engines": { @@ -240,24 +227,22 @@ } }, "node_modules/@antora/site-generator-default": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/site-generator-default/-/site-generator-default-3.1.10.tgz", - "integrity": "sha512-dMhjbklthysj3espwYNkTkADm2Z3EbWThq9gJv/ZuSXGZSXVSwt8b3mBpCTwxOeAKIldnj3fc1pzQxei/7PC2w==", - "license": "MPL-2.0", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/site-generator-default/-/site-generator-default-3.1.12.tgz", + "integrity": "sha512-viu2ZkfTQrdca7TabKO/awubC3/hLfRi1ZM+SfFJUILZj7g+EvWIR3VHdQDJtxaMykNIdeAfsVB6T69ZNoyg4g==", "dependencies": { - "@antora/site-generator": "3.1.10" + "@antora/site-generator": "3.1.12" }, "engines": { "node": ">=16.0.0" } }, "node_modules/@antora/site-mapper": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/site-mapper/-/site-mapper-3.1.10.tgz", - "integrity": "sha512-KY1j/y0uxC2Y7RAo4r4yKv9cgFm8aZoRylZXEODJnwj3tffbZ2ZdRzSWHp6fN0QX/Algrr9JNd9CWrjcj2f3Zw==", - "license": "MPL-2.0", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/site-mapper/-/site-mapper-3.1.12.tgz", + "integrity": "sha512-qWZjlB5OrTyN8gsrIeDeqXBuu83y+LOfve4aFrNZ2Klby8ObURMT/gGWicsXNA/q0tlrsouhN9hRLqpFoEj63g==", "dependencies": { - "@antora/content-classifier": "3.1.10", + "@antora/content-classifier": "3.1.12", "vinyl": "~3.0" }, "engines": { @@ -265,22 +250,20 @@ } }, "node_modules/@antora/site-publisher": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/site-publisher/-/site-publisher-3.1.10.tgz", - "integrity": "sha512-G4xcUWvgth8oeEQwiu9U1cE0miQtYHwKHOobUbDBt2Y6LlC5H31zQQmAyvMwTsGRlvYRgLVtG6j9d6JBwQ6w9Q==", - "license": "MPL-2.0", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/site-publisher/-/site-publisher-3.1.12.tgz", + "integrity": "sha512-oeNNXcsKPzNxM/TgixlOHJCUaIGZ4WnpacN5EfeU3PfymJVADMsaAGjKwKd+miDdsjNAQKR8GrKtO5rKUj3PqA==", "dependencies": { - "@antora/file-publisher": "3.1.10" + "@antora/file-publisher": "3.1.12" }, "engines": { "node": ">=16.0.0" } }, "node_modules/@antora/ui-loader": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/ui-loader/-/ui-loader-3.1.10.tgz", - "integrity": "sha512-H1f5wI5a5HjLuE/Wexvc8NZy8w83Bhqjka7t1DbwOOqP+LyxFGLx/QbBVKdTtgFNDHVMtNBlplQq0ixeoTSh0A==", - "license": "MPL-2.0", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/ui-loader/-/ui-loader-3.1.12.tgz", + "integrity": "sha512-KSHoSPt7yOvTrqNpxFwelTa5HN10yGDmBcjmrbZ8dDM3fQyor8O3oTBEdqCYq+uGT5VdMHHbJ/IbFakKQrdnww==", "dependencies": { "@antora/expand-path-helper": "~3.0", "braces": "~3.0", @@ -299,10 +282,9 @@ } }, "node_modules/@antora/ui-loader/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "license": "MIT", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "engines": { "node": ">=12" }, @@ -390,7 +372,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -403,7 +384,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", "engines": { "node": ">= 8" } @@ -412,7 +392,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -534,8 +513,7 @@ "node_modules/async-lock": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", - "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", - "license": "MIT" + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==" }, "node_modules/atomic-sleep": { "version": "1.0.0", @@ -545,11 +523,24 @@ "node": ">=8.0.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/b4a": { "version": "1.6.7", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "license": "Apache-2.0" + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==" }, "node_modules/balanced-match": { "version": "1.0.2", @@ -557,10 +548,9 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", - "license": "Apache-2.0", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.6.1.tgz", + "integrity": "sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==", "optional": true }, "node_modules/base64-js": { @@ -659,7 +649,6 @@ "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "license": "MIT", "engines": { "node": "*" } @@ -678,7 +667,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/cache-directory/-/cache-directory-2.0.0.tgz", "integrity": "sha512-7YKEapH+2Uikde8hySyfobXBqPKULDyHNl/lhKm7cKf/GJFdG/tU/WpLrOg2y9aUrQrWUilYqawFIiGJPS6gDA==", - "license": "LGPL-3.0+", "dependencies": { "xdg-basedir": "^3.0.0" }, @@ -686,11 +674,27 @@ "node": ">=4" } }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -704,7 +708,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -759,14 +762,12 @@ "node_modules/clean-git-ref": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/clean-git-ref/-/clean-git-ref-2.0.1.tgz", - "integrity": "sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==", - "license": "Apache-2.0" + "integrity": "sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==" }, "node_modules/clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "license": "MIT", "engines": { "node": ">=0.8" } @@ -848,7 +849,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", "bin": { "crc32": "bin/crc32.njs" }, @@ -886,7 +886,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" }, @@ -897,6 +896,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -910,14 +925,12 @@ "node_modules/diff3": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/diff3/-/diff3-0.0.3.tgz", - "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==", - "license": "MIT" + "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==" }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -957,7 +970,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -967,7 +979,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -977,7 +988,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -1093,14 +1103,12 @@ "node_modules/fast-fifo": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT" + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -1129,7 +1137,6 @@ "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -1163,6 +1170,20 @@ "node": ">= 0.8" } }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -1205,7 +1226,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1215,7 +1235,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -1240,7 +1259,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -1270,7 +1288,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -1282,7 +1299,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -1295,7 +1311,6 @@ "version": "4.7.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "license": "MIT", "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", @@ -1321,11 +1336,21 @@ "node": ">=4" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -1334,11 +1359,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -1356,7 +1394,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz", "integrity": "sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==", - "license": "MIT", "engines": { "node": ">=14" } @@ -1424,7 +1461,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "license": "MIT", "engines": { "node": ">= 4" } @@ -1470,6 +1506,17 @@ "node": ">=8" } }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1504,11 +1551,29 @@ "dev": true, "license": "MIT" }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, "node_modules/isomorphic-git": { "version": "1.25.10", "resolved": "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.25.10.tgz", "integrity": "sha512-IxGiaKBwAdcgBXwIcxJU6rHLk+NrzYaaPKXXQffcA0GW3IUrQXdUPDXDo+hkGVcYruuz/7JlGBiuaeTCgIgivQ==", - "license": "MIT", "dependencies": { "async-lock": "^1.4.1", "clean-git-ref": "^2.0.1", @@ -1532,8 +1597,7 @@ "node_modules/isomorphic-git/node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "license": "(MIT AND Zlib)" + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, "node_modules/joycon": { "version": "3.1.1", @@ -1574,7 +1638,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -1607,7 +1670,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", "engines": { "node": ">= 8" } @@ -1616,7 +1678,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -1629,7 +1690,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -1638,7 +1698,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -1650,7 +1709,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -1681,7 +1739,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/minimisted/-/minimisted-2.0.1.tgz", "integrity": "sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==", - "license": "MIT", "dependencies": { "minimist": "^1.2.5" } @@ -1711,7 +1768,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/multi-progress/-/multi-progress-4.0.0.tgz", "integrity": "sha512-9zcjyOou3FFCKPXsmkbC3ethv51SFPoA4dJD6TscIp2pUmy26kBDZW6h9XofPELrzseSkuD7r0V+emGEeo39Pg==", - "license": "MIT", "peerDependencies": { "progress": "^2.0.0" } @@ -1729,8 +1785,7 @@ "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT" + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node_modules/nodemon": { "version": "3.1.10", @@ -1863,8 +1918,7 @@ "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT" + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -1881,7 +1935,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "license": "MIT", "engines": { "node": ">=6" } @@ -1975,6 +2028,14 @@ "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==" }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -1992,7 +2053,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -2058,8 +2118,7 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/quick-format-unescaped": { "version": "4.0.4", @@ -2096,7 +2155,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -2129,14 +2187,12 @@ "node_modules/remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "license": "ISC" + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" }, "node_modules/replace-ext": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", - "license": "MIT", "engines": { "node": ">= 10" } @@ -2145,7 +2201,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2154,7 +2209,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -2195,7 +2249,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -2318,6 +2371,22 @@ "node": ">= 18" } }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -2326,23 +2395,28 @@ "license": "ISC" }, "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "license": "(MIT AND BSD-3-Clause)", + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" }, "bin": { "sha.js": "bin.js" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/should-proxy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/should-proxy/-/should-proxy-1.0.4.tgz", - "integrity": "sha512-RPQhIndEIVUCjkfkQ6rs6sOR6pkxJWCNdxtfG5pP0RVgUYbK5911kLTF0TNcCC0G3YCGd492rMollFT2aTd9iQ==", - "license": "MIT" + "integrity": "sha512-RPQhIndEIVUCjkfkQ6rs6sOR6pkxJWCNdxtfG5pP0RVgUYbK5911kLTF0TNcCC0G3YCGd492rMollFT2aTd9iQ==" }, "node_modules/side-channel": { "version": "1.1.0", @@ -2437,8 +2511,7 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/simple-get": { "version": "4.0.1", @@ -2458,7 +2531,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", @@ -2489,7 +2561,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -2516,7 +2587,6 @@ "version": "2.22.1", "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", - "license": "MIT", "dependencies": { "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" @@ -2560,7 +2630,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", - "license": "MIT", "dependencies": { "streamx": "^2.12.5" } @@ -2569,7 +2638,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "license": "Apache-2.0", "dependencies": { "b4a": "^1.6.4" } @@ -2582,6 +2650,19 @@ "real-require": "^0.2.0" } }, + "node_modules/to-buffer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.1.tgz", + "integrity": "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==", + "dependencies": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -2653,11 +2734,23 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/uglify-js": { "version": "3.19.3", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "license": "BSD-2-Clause", "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -2693,8 +2786,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/vary": { "version": "1.1.2", @@ -2709,7 +2801,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.1.tgz", "integrity": "sha512-0QwqXteBNXgnLCdWdvPQBX6FXRHtIH3VhJPTd5Lwn28tJXc34YqSCWUmkOvtJHBmB3gGoPtrOKk3Ts8/kEZ9aA==", - "license": "MIT", "dependencies": { "clone": "^2.1.2", "remove-trailing-separator": "^1.1.0", @@ -2720,11 +2811,30 @@ "node": ">=10.13.0" } }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "license": "MIT" + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" }, "node_modules/wrappy": { "version": "1.0.2", @@ -2735,7 +2845,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", "integrity": "sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==", - "license": "MIT", "engines": { "node": ">=4" } @@ -2752,7 +2861,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.1.3.tgz", "integrity": "sha512-JCCdmlJJWv7L0q/KylOekyRaUrdEoUxWkWVcgorosTROCFWiS9p2NNPE9Yb91ak7b1N5SxAZEliWpspbZccivw==", - "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3", "pend": "~1.2.0" @@ -2765,7 +2873,6 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", - "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3" } @@ -2773,33 +2880,33 @@ }, "dependencies": { "@antora/asciidoc-loader": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/asciidoc-loader/-/asciidoc-loader-3.1.10.tgz", - "integrity": "sha512-np0JkOV37CK7V4eDZUZXf4fQuCKYW3Alxl8FlyzBevXi2Ujv29O82JLbHbv1cyTsvGkGNNB+gzJIx9XBsQ7+Nw==", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/asciidoc-loader/-/asciidoc-loader-3.1.12.tgz", + "integrity": "sha512-KP81whxkQzyNIZi/lnX3FEHUEUV2YAsxb07Dsx6qjVMIX8yMFRB/s6EAYgQralLnZDC1uCfLDXEIFLMUEGsDIw==", "requires": { - "@antora/logger": "3.1.10", + "@antora/logger": "3.1.12", "@antora/user-require-helper": "~3.0", "@asciidoctor/core": "~2.2" } }, "@antora/cli": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/cli/-/cli-3.1.10.tgz", - "integrity": "sha512-gp8u9aVM0w1DtWSsB5PwvEfFYKrooPENLhN58RAfdgTrcsTsWw+CDysFZPgEaHB0Y1ZbanR82ZH/f6JVKGcZfQ==", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/cli/-/cli-3.1.12.tgz", + "integrity": "sha512-j6CPjaW+OcEMecZFWOa38WsT4UvNVXEwUJRRTITtGbIk4m7z7RMrFCeai4AUX6cidX9LgDkFq6w2mjrYeVSS+A==", "requires": { - "@antora/logger": "3.1.10", - "@antora/playbook-builder": "3.1.10", + "@antora/logger": "3.1.12", + "@antora/playbook-builder": "3.1.12", "@antora/user-require-helper": "~3.0", "commander": "~11.1" } }, "@antora/content-aggregator": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/content-aggregator/-/content-aggregator-3.1.10.tgz", - "integrity": "sha512-OT6ZcCA7LrtNfrAZUr3hFh+Z/1isKpsfnqFjCDC66NEMqIyzJO99jq0CM66rYlYhyX7mb5BwEua8lHcwpOXNow==", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/content-aggregator/-/content-aggregator-3.1.12.tgz", + "integrity": "sha512-l+6KhqQHfoficcgm4tzDmFhHJ0mDNZBWAhwO60b9HzWdcc9hPDo87KU2t/vwxC6P+o9Vzdc6xa9EWgwHqw9/HQ==", "requires": { "@antora/expand-path-helper": "~3.0", - "@antora/logger": "3.1.10", + "@antora/logger": "3.1.12", "@antora/user-require-helper": "~3.0", "braces": "~3.0", "cache-directory": "~2.0", @@ -2816,29 +2923,29 @@ }, "dependencies": { "picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" } } }, "@antora/content-classifier": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/content-classifier/-/content-classifier-3.1.10.tgz", - "integrity": "sha512-3JJl4IIiTX00v/MirK603NoqIcHjGYAaRWt3Q4U03tI1Fv2Aho/ypO3FE45069jFf0Dx2uDJfp5kapb9gaIjdQ==", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/content-classifier/-/content-classifier-3.1.12.tgz", + "integrity": "sha512-Q+X5w3U2yoZmsFTRi5jWvx67PEq++S6gdO5PJ4dQ0r4nmDaMYdhRtfrxZeni4RmWtDxF+f0GZYw8RgyhEIBRdw==", "requires": { - "@antora/asciidoc-loader": "3.1.10", - "@antora/logger": "3.1.10", + "@antora/asciidoc-loader": "3.1.12", + "@antora/logger": "3.1.12", "mime-types": "~2.1", "vinyl": "~3.0" } }, "@antora/document-converter": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/document-converter/-/document-converter-3.1.10.tgz", - "integrity": "sha512-qi9ctgcKal8tZtWflVo66w+4zCJoBmUKRV+eA9aRRR09KDdU9r514vu1adWNgniPppISr90zD13V5l2JUy/2CQ==", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/document-converter/-/document-converter-3.1.12.tgz", + "integrity": "sha512-dOh/X0XddSW6Ho529jmD0E6M97RVRMOR4G1xdBJ6O9RUPZfOz2ERijufdi8jZrz5aDrJLpB1hzAbFccCGlzMHA==", "requires": { - "@antora/asciidoc-loader": "3.1.10" + "@antora/asciidoc-loader": "3.1.12" } }, "@antora/expand-path-helper": { @@ -2847,9 +2954,9 @@ "integrity": "sha512-7PdEIhk97v85/CSm3HynCsX14TR6oIVz1s233nNLsiWubE8tTnpPt4sNRJR+hpmIZ6Bx9c6QDp3XIoiyu/WYYA==" }, "@antora/file-publisher": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/file-publisher/-/file-publisher-3.1.10.tgz", - "integrity": "sha512-DPR/0d1P+kr3qV4T0Gh81POEO/aCmNWIp/oLUYAhr0HHOcFzgpTUUoLStgcYynZPFRIB7EYKSab+oYSCK17DGA==", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/file-publisher/-/file-publisher-3.1.12.tgz", + "integrity": "sha512-psinQkI3IrARRejK7fFKVGYYE5z01jDUHHcUSDRR48eriDO/K/wnky2n2BbKPQsPjYZQP8LyPfVKUsTadsxx8A==", "requires": { "@antora/expand-path-helper": "~3.0", "@antora/user-require-helper": "~3.0", @@ -2858,9 +2965,9 @@ } }, "@antora/logger": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/logger/-/logger-3.1.10.tgz", - "integrity": "sha512-WSuIxEP2tVrhWtTj/sIrwBDjpi4ldB/1Kpiu4PXmY4/qeWP8thW6u8nXdwdDcWss5zqkZWjourvWKwVq7y8Wjg==", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/logger/-/logger-3.1.12.tgz", + "integrity": "sha512-u+rw3aFW7ScPyG/aWcxGnKJl/++34kzvdZEi3FIGjqtgsEmZ0A4UKbH3t4LZOiQiv9UdcHAiv5+lxQRx+7LgBQ==", "requires": { "@antora/expand-path-helper": "~3.0", "pino": "~9.2", @@ -2869,27 +2976,27 @@ } }, "@antora/navigation-builder": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/navigation-builder/-/navigation-builder-3.1.10.tgz", - "integrity": "sha512-aLMK49nYsSB3mEZbLkmUXDAUYmscv2AFWu+5c3eqVGkQ6Wgyd79WQ6Bz3/TN9YqkzGL+PqGs0G39F0VQzD23Hw==", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/navigation-builder/-/navigation-builder-3.1.12.tgz", + "integrity": "sha512-C8Ty/yQYiAr793Xsox+AD8tdDzJYUVKs6pBoSNQQcSmabej93s0WnaSiezmBJAlj2/n5KysKG6/fQDqKnCAGyg==", "requires": { - "@antora/asciidoc-loader": "3.1.10" + "@antora/asciidoc-loader": "3.1.12" } }, "@antora/page-composer": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/page-composer/-/page-composer-3.1.10.tgz", - "integrity": "sha512-JoEg8J8HVsnPmAgUrYSGzf0C8rQefXyCi/18ucy0utyfUvlJNsZvUbGUPx62Het9p0JP0FkAz2MTLyDlNdArVg==", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/page-composer/-/page-composer-3.1.12.tgz", + "integrity": "sha512-DpGYXwEoo9Ku/Udz/vQGKAbLqibyesL/MI+hG4ykaj43NzN5kxAfmV1UCb9ZrB2x8JCkPEJQb5ibZntz93b2MA==", "requires": { - "@antora/logger": "3.1.10", + "@antora/logger": "3.1.12", "handlebars": "~4.7", "require-from-string": "~2.0" } }, "@antora/playbook-builder": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/playbook-builder/-/playbook-builder-3.1.10.tgz", - "integrity": "sha512-UB8UmRYfkKgActTUlotdVS4FKGjaZgTnSXE7Fns1xb3/3HRanWvI+Yze1OmCkGC33cTpoQFnSYp7ySEH8LaiBw==", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/playbook-builder/-/playbook-builder-3.1.12.tgz", + "integrity": "sha512-5sizDOdg5SWMs84EWGRBzmej1V23tpGBwHOqjI2BJEGh8Sase1qC5uZXx6aJDEVbzmlGOm4RvysWbn9oap248A==", "requires": { "@iarna/toml": "~2.2", "convict": "~6.2", @@ -2898,63 +3005,63 @@ } }, "@antora/redirect-producer": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/redirect-producer/-/redirect-producer-3.1.10.tgz", - "integrity": "sha512-IbWJGh6LmsxJQ821h0B9JfooofFZBgFLZxsbp/IoTLkBFGLFAY5tDRvB6rvubfNLRoSjM8VjEUXGqVLlwZOb+g==", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/redirect-producer/-/redirect-producer-3.1.12.tgz", + "integrity": "sha512-bVoKC52nKzLn1ROM9zcotYoakr7gdfrBVPwWRSCvNu+Yx0iUOiCWJAA6+DsY7ut4l4LlaERp1oTvAhViX9TQCQ==", "requires": { "vinyl": "~3.0" } }, "@antora/site-generator": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/site-generator/-/site-generator-3.1.10.tgz", - "integrity": "sha512-NCULYtwUjIyr5FGCymhfG/zDVUmZ6pfmCPorka8mAzo4/GDx1T7bgaRL9rEIyf2AMqcm7apQiAz03mpU4kucsw==", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/site-generator/-/site-generator-3.1.12.tgz", + "integrity": "sha512-vUpbK6bdvP3zuVxmvhF3Rz+okNXD95HWHw6xb08qEraZOWPZHOXl23twqprmk12O0PunN9WZd6/Pf14zhD208A==", "requires": { - "@antora/asciidoc-loader": "3.1.10", - "@antora/content-aggregator": "3.1.10", - "@antora/content-classifier": "3.1.10", - "@antora/document-converter": "3.1.10", - "@antora/file-publisher": "3.1.10", - "@antora/logger": "3.1.10", - "@antora/navigation-builder": "3.1.10", - "@antora/page-composer": "3.1.10", - "@antora/playbook-builder": "3.1.10", - "@antora/redirect-producer": "3.1.10", - "@antora/site-mapper": "3.1.10", - "@antora/site-publisher": "3.1.10", - "@antora/ui-loader": "3.1.10", + "@antora/asciidoc-loader": "3.1.12", + "@antora/content-aggregator": "3.1.12", + "@antora/content-classifier": "3.1.12", + "@antora/document-converter": "3.1.12", + "@antora/file-publisher": "3.1.12", + "@antora/logger": "3.1.12", + "@antora/navigation-builder": "3.1.12", + "@antora/page-composer": "3.1.12", + "@antora/playbook-builder": "3.1.12", + "@antora/redirect-producer": "3.1.12", + "@antora/site-mapper": "3.1.12", + "@antora/site-publisher": "3.1.12", + "@antora/ui-loader": "3.1.12", "@antora/user-require-helper": "~3.0" } }, "@antora/site-generator-default": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/site-generator-default/-/site-generator-default-3.1.10.tgz", - "integrity": "sha512-dMhjbklthysj3espwYNkTkADm2Z3EbWThq9gJv/ZuSXGZSXVSwt8b3mBpCTwxOeAKIldnj3fc1pzQxei/7PC2w==", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/site-generator-default/-/site-generator-default-3.1.12.tgz", + "integrity": "sha512-viu2ZkfTQrdca7TabKO/awubC3/hLfRi1ZM+SfFJUILZj7g+EvWIR3VHdQDJtxaMykNIdeAfsVB6T69ZNoyg4g==", "requires": { - "@antora/site-generator": "3.1.10" + "@antora/site-generator": "3.1.12" } }, "@antora/site-mapper": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/site-mapper/-/site-mapper-3.1.10.tgz", - "integrity": "sha512-KY1j/y0uxC2Y7RAo4r4yKv9cgFm8aZoRylZXEODJnwj3tffbZ2ZdRzSWHp6fN0QX/Algrr9JNd9CWrjcj2f3Zw==", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/site-mapper/-/site-mapper-3.1.12.tgz", + "integrity": "sha512-qWZjlB5OrTyN8gsrIeDeqXBuu83y+LOfve4aFrNZ2Klby8ObURMT/gGWicsXNA/q0tlrsouhN9hRLqpFoEj63g==", "requires": { - "@antora/content-classifier": "3.1.10", + "@antora/content-classifier": "3.1.12", "vinyl": "~3.0" } }, "@antora/site-publisher": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/site-publisher/-/site-publisher-3.1.10.tgz", - "integrity": "sha512-G4xcUWvgth8oeEQwiu9U1cE0miQtYHwKHOobUbDBt2Y6LlC5H31zQQmAyvMwTsGRlvYRgLVtG6j9d6JBwQ6w9Q==", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/site-publisher/-/site-publisher-3.1.12.tgz", + "integrity": "sha512-oeNNXcsKPzNxM/TgixlOHJCUaIGZ4WnpacN5EfeU3PfymJVADMsaAGjKwKd+miDdsjNAQKR8GrKtO5rKUj3PqA==", "requires": { - "@antora/file-publisher": "3.1.10" + "@antora/file-publisher": "3.1.12" } }, "@antora/ui-loader": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/@antora/ui-loader/-/ui-loader-3.1.10.tgz", - "integrity": "sha512-H1f5wI5a5HjLuE/Wexvc8NZy8w83Bhqjka7t1DbwOOqP+LyxFGLx/QbBVKdTtgFNDHVMtNBlplQq0ixeoTSh0A==", + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/@antora/ui-loader/-/ui-loader-3.1.12.tgz", + "integrity": "sha512-KSHoSPt7yOvTrqNpxFwelTa5HN10yGDmBcjmrbZ8dDM3fQyor8O3oTBEdqCYq+uGT5VdMHHbJ/IbFakKQrdnww==", "requires": { "@antora/expand-path-helper": "~3.0", "braces": "~3.0", @@ -2970,9 +3077,9 @@ }, "dependencies": { "picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==" } } }, @@ -3154,6 +3261,14 @@ "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" }, + "available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "requires": { + "possible-typed-array-names": "^1.0.0" + } + }, "b4a": { "version": "1.6.7", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", @@ -3165,9 +3280,9 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.6.1.tgz", + "integrity": "sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==", "optional": true }, "base64-js": { @@ -3243,11 +3358,21 @@ "xdg-basedir": "^3.0.0" } }, + "call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "requires": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + } + }, "call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, "requires": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -3257,7 +3382,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, "requires": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -3378,6 +3502,16 @@ "mimic-response": "^3.1.0" } }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -3393,7 +3527,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, "requires": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -3423,20 +3556,17 @@ "es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" }, "es-errors": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" }, "es-object-atoms": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, "requires": { "es-errors": "^1.3.0" } @@ -3577,6 +3707,14 @@ "statuses": "^2.0.1" } }, + "for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "requires": { + "is-callable": "^1.2.7" + } + }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -3604,14 +3742,12 @@ "function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, "requires": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -3629,7 +3765,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, "requires": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -3659,8 +3794,7 @@ "gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" }, "handlebars": { "version": "4.7.8", @@ -3680,17 +3814,31 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "requires": { + "es-define-property": "^1.0.0" + } + }, "has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" + }, + "has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "requires": { + "has-symbols": "^1.0.3" + } }, "hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "requires": { "function-bind": "^1.1.2" } @@ -3780,6 +3928,11 @@ "binary-extensions": "^2.0.0" } }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3804,6 +3957,19 @@ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "dev": true }, + "is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "requires": { + "which-typed-array": "^1.1.16" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, "isomorphic-git": { "version": "1.25.10", "resolved": "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.25.10.tgz", @@ -3855,8 +4021,7 @@ "math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" }, "media-typer": { "version": "1.1.0", @@ -4130,6 +4295,11 @@ "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==" }, + "possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==" + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -4351,6 +4521,19 @@ "send": "^1.2.0" } }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -4358,12 +4541,13 @@ "dev": true }, "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" } }, "should-proxy": { @@ -4523,6 +4707,16 @@ "real-require": "^0.2.0" } }, + "to-buffer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.1.tgz", + "integrity": "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==", + "requires": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + } + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -4574,6 +4768,16 @@ } } }, + "typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "requires": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + } + }, "uglify-js": { "version": "3.19.3", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", @@ -4619,6 +4823,20 @@ "teex": "^1.0.1" } }, + "which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + } + }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", diff --git a/package.json b/package.json index 5dedcd33e..de3c926bd 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,8 @@ "author": "Neo4j", "license": "ISC", "dependencies": { - "@antora/cli": "^3.1.10", - "@antora/site-generator-default": "^3.1.10", + "@antora/cli": "^3.1.12", + "@antora/site-generator-default": "^3.1.12", "@neo4j-antora/antora-add-notes": "^0.3.2", "@neo4j-antora/antora-modify-sitemaps": "^0.7.1", "@neo4j-antora/antora-page-roles": "^0.3.1", From ce50d37c576c2ba15f1db8c88e5dcf787b32612a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Wed, 13 Aug 2025 13:45:56 +0200 Subject: [PATCH 39/72] fix show functions query for 2025.08 (#1358) --- .../ROOT/pages/clauses/listing-functions.adoc | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/modules/ROOT/pages/clauses/listing-functions.adoc b/modules/ROOT/pages/clauses/listing-functions.adoc index 59ce2a0e9..b1db3a05e 100644 --- a/modules/ROOT/pages/clauses/listing-functions.adoc +++ b/modules/ROOT/pages/clauses/listing-functions.adoc @@ -254,19 +254,17 @@ WHERE name STARTS WITH 'a' |=== | name | isBuiltIn -| "abs" | true -| "abs" | true -| "acos" | true -| "all" | true -| "any" | true -| "asin" | true -| "atan" | true +| "abs" | true +| "acos" | true +| "all" | true +| "allReduce" | true +| "any" | true +| "asin" | true +| "atan" | true | "atan2" | true -| "avg" | true -| "avg" | true -| "avg" | true +| "avg" | true -2+d|Rows: 11 +2+d|Rows: 9 |=== From fc97cdcec3fd3bd96bb0be5a7fe35566aa0cc7a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Wed, 13 Aug 2025 15:37:41 +0200 Subject: [PATCH 40/72] Add new repeatable elements blog to Further Reading (#1359) --- modules/ROOT/pages/patterns/match-modes.adoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/patterns/match-modes.adoc b/modules/ROOT/pages/patterns/match-modes.adoc index 143081833..45383a142 100644 --- a/modules/ROOT/pages/patterns/match-modes.adoc +++ b/modules/ROOT/pages/patterns/match-modes.adoc @@ -261,4 +261,5 @@ The quantified path pattern may yield an infinite number of rows under match mod [[further-reading]] == Further reading -* link:https://medium.com/neo4j/i-would-walk-500-miles-5d23c33d967f[Neo4j Developer Blog: I Would Walk 500 Miles] \ No newline at end of file +* link:https://neo4j.com/blog/developer/i-would-walk-500-miles/[Neo4j Developer Blog: I Would Walk 500 Miles] +* link:https://neo4j.com/blog/developer/query-chomp-repeat/[Neo4j Developer Blog: Query, Chomp, Repeat] \ No newline at end of file From 7fc9c3e9972ff1b65f0f3b62e6fd133f7a003d3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Thu, 14 Aug 2025 15:06:44 +0200 Subject: [PATCH 41/72] `allReduce()` function (#1357) --- .../ROOT/images/graph-predicate-functions.svg | 74 +++---- .../images/predicate-function-example.svg | 12 -- ...ions-additions-removals-compatibility.adoc | 27 +++ modules/ROOT/pages/functions/index.adoc | 7 +- modules/ROOT/pages/functions/predicate.adoc | 201 ++++++++++++------ 5 files changed, 210 insertions(+), 111 deletions(-) delete mode 100644 modules/ROOT/images/predicate-function-example.svg diff --git a/modules/ROOT/images/graph-predicate-functions.svg b/modules/ROOT/images/graph-predicate-functions.svg index 12f5b3f19..17237ae08 100644 --- a/modules/ROOT/images/graph-predicate-functions.svg +++ b/modules/ROOT/images/graph-predicate-functions.svg @@ -1,39 +1,39 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/ROOT/images/predicate-function-example.svg b/modules/ROOT/images/predicate-function-example.svg deleted file mode 100644 index 7c0fe2032..000000000 --- a/modules/ROOT/images/predicate-function-example.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc index 51b7133a9..1849ce54d 100644 --- a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc +++ b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc @@ -22,6 +22,33 @@ Cypher 25 was introduced in Neo4j 2025.06 and can only be used on Neo4j 2025.06+ Features removed in Cypher 25 are still available on Neo4j 2025.06+ databases either by prepending a query with `CYPHER 5` or by having Cypher 5 as the default language for the database. For more information, see xref:queries/select-version.adoc[]. +[[cypher-deprecations-additions-removals-2025.08]] +== Neo4j 2025.08 + +=== New in Cypher 25 + +[cols="2", options="header"] +|=== +| Feature +| Details + +a| +label:functionality[] +label:new[] +[source, cypher, role="noheader"] +---- +MATCH (()-->(n))+ +WHERE allReduce(acc = 0, node IN n \| acc + node.x, 6 < acc < 30) +RETURN [i IN n \| i.x] AS sequence +ORDER BY head(n).x, size(n) +---- + +| New xref:functions/predicate.adoc#functions-allreduce[`allReduce()`] function. +It enables the stepwise evaluation of a value accumulated over a path, allowing for early pruning of paths that do not satisfy a given predicate, and is optimized for path expansions. + +|=== + + [[cypher-deprecations-additions-removals-2025.07]] == Neo4j 2025.07 diff --git a/modules/ROOT/pages/functions/index.adoc b/modules/ROOT/pages/functions/index.adoc index 73eebb482..c800083f3 100644 --- a/modules/ROOT/pages/functions/index.adoc +++ b/modules/ROOT/pages/functions/index.adoc @@ -373,7 +373,12 @@ These functions return either true or false for the given arguments. 1.1+| xref::functions/predicate.adoc#functions-all[`all()`] | `all(variable :: ANY, list :: LIST, predicate :: ANY) :: BOOLEAN` | Returns true if the predicate holds for all elements in the given `LIST`. - + +1.1+| xref::functions/predicate.adoc#functions-allreduce[`allReduce()`] +| `allReduce(accumulator = initial, stepVariable IN list \| reductionFunction, predicate) :: BOOLEAN` +| Returns true if, during the stepwise evaluation of a value across the elements in a given `LIST`, the accumulated result satisfies a specified predicate at every step. +Where that list is a group variable defined in a quantified path pattern, it allows for the early pruning of paths that do not satisfy the predicate. label:new[Introduced in Neo4j 2025.08] + 1.1+| xref::functions/predicate.adoc#functions-any[`any()`] | `any(variable :: ANY, list :: LIST, predicate :: ANY) :: BOOLEAN` | Returns true if the predicate holds for at least one element in the given `LIST`. diff --git a/modules/ROOT/pages/functions/predicate.adoc b/modules/ROOT/pages/functions/predicate.adoc index 6fe2e4197..5c465c2cf 100644 --- a/modules/ROOT/pages/functions/predicate.adoc +++ b/modules/ROOT/pages/functions/predicate.adoc @@ -27,12 +27,12 @@ CREATE (kathryn:Person {name:'Kathryn Bigelow', age:71, nationality:'American'}), (jessica:Person {name:'Jessica Chastain', age:45, address:''}), (theMatrix:Movie {title:'The Matrix'}), - (keanu)-[:KNOWS]->(carrie), - (keanu)-[:KNOWS]->(liam), - (keanu)-[:KNOWS]->(kathryn), - (kathryn)-[:KNOWS]->(jessica), - (carrie)-[:KNOWS]->(guy), - (liam)-[:KNOWS]->(guy), + (keanu)-[:KNOWS {since: 1999}]->(carrie), + (keanu)-[:KNOWS {since: 2005}]->(liam), + (keanu)-[:KNOWS {since: 2010}]->(kathryn), + (kathryn)-[:KNOWS {since: 2012}]->(jessica), + (carrie)-[:KNOWS {since: 2008}]->(guy), + (liam)-[:KNOWS {since: 2009}]->(guy), (keanu)-[:ACTED_IN]->(theMatrix), (carrie)-[:ACTED_IN]->(theMatrix) ---- @@ -58,34 +58,29 @@ CREATE | `all()` returns `true` if `list` is empty because there are no elements to falsify the `predicate`. |=== -.+all()+ +.all() ====== -.Query +.Find paths where all nodes meet a given property value // tag::functions_predicate_all[] [source, cypher, indent=0] ---- -MATCH p = (a)-[*]->(b) -WHERE - a.name = 'Keanu Reeves' - AND b.name = 'Guy Pearce' - AND all(x IN nodes(p) WHERE x.age < 60) -RETURN p +MATCH p = (a:Person {name: 'Keanu Reeves'})-[]-{2,}() +WHERE all(x IN nodes(p) WHERE x.age < 60) +RETURN [n IN nodes(p) | n.name] AS actorsList ---- // end::functions_predicate_all[] -All nodes in the returned paths will have a property `age` with a value lower than `60`: - -image::predicate-function-example.svg[Actor nodes connected via knows relationships,width=300,role=popup] +All nodes in the returned paths have an `age`property below `60`: .Result [role="queryresult",options="header,footer",cols="1*(:Person {nationality: "American",name: "Carrie Anne Moss",age: 55})-[:KNOWS]->(:Person {nationality: "Australian",name: "Guy Pearce",age: 55})+ -1+d|Rows: 1 +| ["Keanu Reeves", "Carrie Anne Moss", "Guy Pearce"] +1+d|Rows: 2 |=== .`all()` on an empty `LIST` @@ -107,7 +102,102 @@ RETURN all(i in emptyList WHERE true) as allTrue, all(i in emptyList WHERE false ====== +[[functions-allreduce]] +[role=label--new-2025.08] +== allReduce() + +.Details +|=== +| *Syntax* 3+| `allReduce(accumulator = initial, stepVariable IN list \| reductionFunction, predicate)` +| *Description* 3+| Returns true if, during the stepwise evaluation of a value across the elements in a given `LIST`, the accumulated result satisfies a specified predicate at every step. +Where that list is a xref:patterns/variable-length-patterns.adoc#group-variables[group variable] defined in a xref:patterns/variable-length-patterns.adoc#quantified-path-patterns[quantified path pattern], it allows for the early pruning of paths that do not satisfy the predicate. +.7+| *Arguments* | *Name* | *Type* | *Description* +| `accumulator` | `ANY` | A variable that holds the result of the `reductionFunction` as the `list` is iterated. +It is initialized with the value of `initial`. +| `initial` | `ANY` | The value of the `accumulator` for the first evaluation of `reductionFunction`. +| `stepVariable` | `ANY` | A variable that holds the value of each element of `list` during iteration. +| `list` | `LIST` | The list that is being iterated over. +| `reductionFunction` | `ANY` | An expression whose return value becomes the next value of the `accumulator`. +The return type must match the return type of `initial`. +| `predicate` | `BOOLEAN` | A predicate that is evaluated for each iteration. +It has access to the variable `accumulator`, but not `stepVariable`. +| *Returns* 3+| `BOOLEAN` +|=== + +.Considerations +|=== +| `allReduce()` differs from most Cypher functions because it iterates over a list, evaluating an expression for each element, rather than returning a result from a single evaluation. +| `allReduce()` combines the functionality of the xref:functions/predicate.adoc#functions-all[`all()`] and xref:functions/list.adoc#functions-reduce[`reduce()`] functions. +| If all evaluations of `predicate` are `true`, `allReduce()` will return `true`. +| If any evaluations of `predicate` are `false`, `allReduce()` will return `false`. +| `allReduce()` returns `true` if `list` is empty because there are no elements to falsify the `predicate`. +| `null` is returned if the `list` is `null` or if the `predicate` evaluates to `null` for at least one element and does not evaluate to `false` for any other element. +|=== + +.allReduce() +====== + +The below query finds `KNOWS` paths with a length of `3` where the `accumulator` begins with first node's `age` and the accumulated `age` values of all nodes in the path never exceeds `230`. +Paths that do not meet this requirement are excluded, such as the path with the sequence `["Keanu Reeves (58)", "Carrie Anne Moss (55)", "Guy Pearce (55)", "Liam Neeson (70)"]` which has an aggregated `age` value of `238`. +.Find aggregated ages within a boundary +// tag::functions_predicate_allreduce_boundary[] +[source, cypher] +---- +MATCH (s) (()-[:KNOWS]-(n)){3} +WHERE allReduce( + acc = s.age, + node IN n | acc + node.age, + acc < 230 +) +RETURN [i IN [s] + n | i.name || " (" + toString(i.age) || ")"] AS ageSequence, + reduce(acc = 0, node IN [s] + n | acc + node.age) AS aggregatedAges +ORDER BY aggregatedAges +---- +// end::functions_predicate_allreduce_boundary[] + +.Result +[role="queryresult",options="header,footer",cols="2* 2000 +) +LET people = nodes(path) +RETURN [actor IN people | actor.name] AS connectedActors, + [rel IN r | rel.since] AS sinceYears +ORDER BY sinceYears +---- +// end::functions_predicate_allreduce_relationship_values[] + +.Result +[role="queryresult",options="header,footer",cols="2*()) AS has_acted_in_rel +RETURN p.name AS name, + exists((p)-[:ACTED_IN]->()) AS has_acted_in_rel ---- // end::functions_predicate_exists[] @@ -316,11 +402,11 @@ The `name` property of each node that has an empty `STRING` `address` property i .Result [role="queryresult",options="header,footer",cols="1*(b) -WHERE - n.name = 'Keanu Reeves' - AND none(x IN nodes(p) WHERE x.age > 60) -RETURN p +MATCH p = (n:Person {name: 'Keanu Reeves'})-[]-{2}() +WHERE none(x IN nodes(p) WHERE x.age > 60) +RETURN [x IN nodes(p) | x.name] AS connectedActors ---- // end::functions_predicate_none[] -No node in the returned path has an `age` property with a greater value than `60`: - -image::predicate-function-example.svg[Actor nodes connected via knows relationships,width=300,role=popup] +No nodes in the returned paths have an `age` property with a greater value than `60`: .Result [role="queryresult",options="header,footer",cols="1*(:Person {nationality: "American",name: "Carrie Anne Moss",age: 55}) -| (:Person {nationality: "Canadian",name: "Keanu Reeves",age: 58})-[:KNOWS]->(:Person {nationality: "American",name: "Carrie Anne Moss",age: 55})-[:KNOWS]->(:Person {nationality: "Australian",name: "Guy Pearce",age: 55}) -1+d|Rows: 2 +| ["Keanu Reeves", "Carrie Anne Moss", "Guy Pearce"] +1+d|Rows: 1 |=== .`none()` on an empty `LIST` @@ -429,28 +510,26 @@ RETURN none(i IN emptyList WHERE true) as noneTrue, none(i IN emptyList WHERE fa .+single()+ ====== -.Query +.Find paths where exactly one node has a given property value // tag::functions_predicate_single[] [source, cypher, indent=0] ---- -MATCH p = (n)-->(b) -WHERE - n.name = 'Keanu Reeves' - AND single(x IN nodes(p) WHERE x.nationality = 'Northern Irish') -RETURN p +MATCH p = (n:Person {name: 'Keanu Reeves'})-[:KNOWS]-+(b) +WHERE single(x IN [b] WHERE x.nationality = 'Northern Irish') +RETURN [person IN nodes(p) | person.name + " (" + person.nationality + ")"] AS northernIrishPaths +ORDER BY length(p) ---- // end::functions_predicate_single[] -In every returned path there is exactly one node which has the `nationality` property value `Northern Irish`: - .Result [role="queryresult",options="header,footer",cols="1*(:Person {nationality: "Northern Irish",name: "Liam Neeson",age: 70}) -1+d|Rows: 1 +| ["Keanu Reeves (Canadian)", "Liam Neeson (Northern Irish)"] +| ["Keanu Reeves (Canadian)", "Carrie Anne Moss (American)", "Guy Pearce (Australian)", "Liam Neeson (Northern Irish)"] +1+d|Rows: 2 |=== .`single()` on an empty `LIST` From 5efacb1fee3bc66bb4540c2508ec150e448fa252 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Thu, 14 Aug 2025 15:19:02 +0200 Subject: [PATCH 42/72] New operators for Dynamic values (#1360) Applies to both Cypher 5 and Cypher 25 --- modules/ROOT/pages/clauses/match.adoc | 22 ++- modules/ROOT/pages/clauses/merge.adoc | 49 ++----- ...ions-additions-removals-compatibility.adoc | 23 ++- .../operators/operators-detail.adoc | 136 ++++++++++++++++++ 4 files changed, 192 insertions(+), 38 deletions(-) diff --git a/modules/ROOT/pages/clauses/match.adoc b/modules/ROOT/pages/clauses/match.adoc index 7c491ffdb..05b22c52d 100644 --- a/modules/ROOT/pages/clauses/match.adoc +++ b/modules/ROOT/pages/clauses/match.adoc @@ -639,10 +639,26 @@ RETURN relationshipType, count(r) AS relationshipCount [[dynamic-match-caveats]] === Performance caveats -`MATCH` queries using dynamic values may not be as performant as those using static values. -This is because the xref:planning-and-tuning/execution-plans.adoc[Cypher planner] uses statically available information when planning queries to determine whether to use an xref:indexes/search-performance-indexes/index.adoc[index] or not, and this is not possible when using dynamic values. +`MATCH` queries that use dynamic values may not perform as well as those with static values. +Neo4j is actively working to improve the performance of these queries. +The table below outlines performance caveats for specific Neo4j versions. -As a result, `MATCH` queries using dynamic values cannot leverage xref:planning-and-tuning/operators/operators-detail.adoc#leaf-operators[index scans or seeks] and must instead use the xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-all-nodes-scan[`AllNodesScan`] operator, which reads all nodes from the node store and is therefore more costly. +.Neo4j versions and performance caveats +[%header,cols="a,5a"] +|=== +| Neo4j versions | Performance caveat + +| 5.26 -- 2025.07 +| The xref:planning-and-tuning/execution-plans.adoc[Cypher planner] is not able to leverage xref:indexes/search-performance-indexes/index.adoc[indexes] with xref:planning-and-tuning/operators/operators-detail.adoc#leaf-operators[index scans or seeks] and must instead utilize the xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-all-nodes-scan[`AllNodesScan`] operator, which reads all nodes from the node store and is therefore more costly. + +| 2025.08 -- current +| The Cypher planner is able to leverage xref:indexes/search-performance-indexes/using-indexes.adoc#token-lookup-indexes[token lookup indexes] when matching node labels and relationship types dynamically. +This is enabled by the introduction of three new query plan operators: +xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-dynamic-node-label-lookup[`DynamicNodeLabelLookup`], xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-dynamic-directed-relationship-type-lookup[`DynamicDirectedRelationshipTypeLookup`], and xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-dynamic-undirected-relationship-type-lookup[`DynamicUndirectedRelationshipTypeLookup`]. +It is not, however, able to use indexes on property values. +For example, `MATCH (n:$(Label) {foo: bar})` will not use any indexes on `n.foo` but can use a `DynamicNodeLabelLookup` on `$(label)`. + +|=== [[further-reading]] === Further reading diff --git a/modules/ROOT/pages/clauses/merge.adoc b/modules/ROOT/pages/clauses/merge.adoc index b244c19b9..f4f7fef9a 100644 --- a/modules/ROOT/pages/clauses/merge.adoc +++ b/modules/ROOT/pages/clauses/merge.adoc @@ -740,42 +740,23 @@ RETURN greta.name AS name, labels(greta) AS labels, type(rel) AS relType, collec [[dynamic-merge-caveats]] === Performance caveats -`MERGE` queries that use dynamic values may not be as performant as those using static values. -This is because the xref:planning-and-tuning/execution-plans.adoc[Cypher planner] uses statically available information when planning queries to determine whether to use an xref:indexes/search-performance-indexes/index.adoc[index] or not, and this is not possible when using dynamic values. +`MERGE` queries that use dynamic values may not perform as well as those with static values. +Neo4j is actively working to improve the performance of these queries. +The table below outlines performance caveats for specific Neo4j versions. -As a result, `MERGE` queries with dynamic values cannot leverage xref:planning-and-tuning/operators/operators-detail.adoc#leaf-operators[index scans or seeks] and must instead use the xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-all-nodes-scan[`AllNodesScan`] operator, which reads all nodes from the node store and is therefore more costly. - -To circumvent possible performance issues, place the dynamic labels or relationship types within `ON CREATE` or `ON MATCH` subclauses. - -.Parameters -[source, parameters] ----- -{ - "onMatchLabels": ["Filmmaker", "AwardRecipient"], - "onCreateLabels": ["ScreenWriter", "AwardWinner"] -} ----- - -.Merge nodes using dynamic values in `ON CREATE` and `ON MATCH` subclauses -[source, cypher] ----- -MERGE (n:Person {name: "Greta Gerwig"}) -ON MATCH - SET n:$($onMatchLabels) -ON CREATE - SET n:$($onCreateLabels) -RETURN labels(n) AS gretaLabels ----- - -Because a `Person` node with the `name` "Greta Gerwig" already exists, this query will only `SET` the dynamic labels added to the `ON MATCH` subclause. - -.Result -[role="queryresult",options="footer",cols="1*() +RETURN count(r) as relCount +---- + +.Query Plan +[role="queryplan", subs="attributes+"] +---- +Planner COST + +Runtime PIPELINED + +Runtime version {neo4j-version} + +Batch size 128 + ++------------------------------------------+----+--------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ +| Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | ++------------------------------------------+----+--------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ +| +ProduceResults | 0 | relCount | 1 | 1 | 0 | 0 | 0/0 | 0.022 | In Pipeline 2 | +| | +----+--------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ +| +EagerAggregation | 1 | count(r) AS relCount | 1 | 1 | 0 | 40 | | | | +| | +----+--------------------------+----------------+------+---------+----------------+ | | | +| +Apply | 2 | | 21 | 12 | 0 | | | | | +| |\ +----+--------------------------+----------------+------+---------+----------------+ | | | +| | +DynamicDirectedRelationshipTypeLookup | 3 | ()-[r:$all(relType)]->() | 21 | 12 | 13 | 1968 | 2/0 | 0.359 | Fused in Pipeline 1 | +| | +----+--------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ +| +Projection | 4 | $autostring_0 AS relType | 1 | 1 | 0 | | | | Fused in Pipeline 0 | ++------------------------------------------+----+--------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ +---- +====== + + +[role=label--new-2025.08] +[[query-plan-dynamic-undirected-relationship-type-lookup]] +=== Dynamic Undirected Relationship Type Lookup + +Allows Cypher to use xref:indexes/search-performance-indexes/using-indexes.adoc#token-lookup-indexes[token lookup indexes] when planning queries using dynamic relationship types in undirected relationship patterns. + +.DynamicUndirectedRelationshipTypeLookup +====== + +.Query +[source, cypher] +---- +PROFILE +WITH "FRIENDS_WITH" AS relType +MATCH ()-[r:$(relType)]-() +RETURN count(r) as relCount +---- + +.Query Plan +[role="queryplan", subs="attributes+"] +---- +Planner COST + +Runtime PIPELINED + +Runtime version {neo4j-version} + +Batch size 128 + ++--------------------------------------------+----+--------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ +| Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | ++--------------------------------------------+----+--------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ +| +ProduceResults | 0 | relCount | 1 | 1 | 0 | 0 | 0/0 | 0.011 | In Pipeline 2 | +| | +----+--------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ +| +EagerAggregation | 1 | count(r) AS relCount | 1 | 1 | 0 | 40 | | | | +| | +----+--------------------------+----------------+------+---------+----------------+ | | | +| +Apply | 2 | | 42 | 24 | 0 | | | | | +| |\ +----+--------------------------+----------------+------+---------+----------------+ | | | +| | +DynamicUndirectedRelationshipTypeLookup | 3 | ()-[r:$all(relType)]-() | 42 | 24 | 13 | 1968 | 2/0 | 0.121 | Fused in Pipeline 1 | +| | +----+--------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ +| +Projection | 4 | $autostring_0 AS relType | 1 | 1 | 0 | | | | Fused in Pipeline 0 | ++--------------------------------------------+----+--------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ +---- +====== [[nested-loops-join-operators]] == Nested loops and join operators From 8acc4f859a744aa614ade737b774779470668139 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Mon, 18 Aug 2025 09:57:07 +0200 Subject: [PATCH 43/72] add new dynamic operators to overview table (#1363) Cypher 5 and Cypher 25 --- .../planning-and-tuning/operators/index.adoc | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/modules/ROOT/pages/planning-and-tuning/operators/index.adoc b/modules/ROOT/pages/planning-and-tuning/operators/index.adoc index c12c69330..380bc8a6e 100644 --- a/modules/ROOT/pages/planning-and-tuning/operators/index.adoc +++ b/modules/ROOT/pages/planning-and-tuning/operators/index.adoc @@ -212,6 +212,25 @@ Restricts the xref:planning-and-tuning/runtimes/index.adoc[Cypher runtime] to no | label:yes[] | +| xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-dynamic-node-label-lookup[DynamicNodeLabelLookup] +| Allows Cypher to use token lookup indexes when planning queries using dynamic node labels. +| label:yes[] +| +| label:new[Introduced in Neo4j 2025.08] + + +| xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-dynamic-directed-relationship-type-lookup[DynamicDirectedRelationshipTypeLookup] +| Allows Cypher to use token lookup indexes when planning queries using dynamic relationship types in directed relationship patterns. +| label:yes[] +| +| label:new[Introduced in Neo4j 2025.08] + +| xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-dynamic-undirected-relationship-type-lookup[DynamicUndirectedRelationshipTypeLookup] +| Allows Cypher to use token lookup indexes when planning queries using dynamic relationship types in undirected relationship patterns. +| label:yes[] +| +| label:new[Introduced in Neo4j 2025.08] + | xref::planning-and-tuning/operators/operators-detail.adoc#query-plan-eager[Eager] | For isolation purposes, `Eager` ensures that operations affecting subsequent operations are executed fully for the whole dataset before continuing execution. | From 83341f03b2ed89e3d3ce69b6d177401eec93bdb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Mon, 18 Aug 2025 14:38:06 +0200 Subject: [PATCH 44/72] dynamiclabelnodelookup not dynamicnodelabellookup (#1364) --- modules/ROOT/pages/clauses/match.adoc | 4 ++-- modules/ROOT/pages/clauses/merge.adoc | 4 ++-- .../deprecations-additions-removals-compatibility.adoc | 2 +- modules/ROOT/pages/planning-and-tuning/operators/index.adoc | 2 +- .../planning-and-tuning/operators/operators-detail.adoc | 6 +++--- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/ROOT/pages/clauses/match.adoc b/modules/ROOT/pages/clauses/match.adoc index 05b22c52d..ad6f5aba7 100644 --- a/modules/ROOT/pages/clauses/match.adoc +++ b/modules/ROOT/pages/clauses/match.adoc @@ -654,9 +654,9 @@ The table below outlines performance caveats for specific Neo4j versions. | 2025.08 -- current | The Cypher planner is able to leverage xref:indexes/search-performance-indexes/using-indexes.adoc#token-lookup-indexes[token lookup indexes] when matching node labels and relationship types dynamically. This is enabled by the introduction of three new query plan operators: -xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-dynamic-node-label-lookup[`DynamicNodeLabelLookup`], xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-dynamic-directed-relationship-type-lookup[`DynamicDirectedRelationshipTypeLookup`], and xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-dynamic-undirected-relationship-type-lookup[`DynamicUndirectedRelationshipTypeLookup`]. +xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-dynamic-label-node-lookup[`DynamicLabelNodeLookup`], xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-dynamic-directed-relationship-type-lookup[`DynamicDirectedRelationshipTypeLookup`], and xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-dynamic-undirected-relationship-type-lookup[`DynamicUndirectedRelationshipTypeLookup`]. It is not, however, able to use indexes on property values. -For example, `MATCH (n:$(Label) {foo: bar})` will not use any indexes on `n.foo` but can use a `DynamicNodeLabelLookup` on `$(label)`. +For example, `MATCH (n:$(Label) {foo: bar})` will not use any indexes on `n.foo` but can use a `DynamicLabelNodeLookup` on `$(label)`. |=== diff --git a/modules/ROOT/pages/clauses/merge.adoc b/modules/ROOT/pages/clauses/merge.adoc index f4f7fef9a..6e20bd3f6 100644 --- a/modules/ROOT/pages/clauses/merge.adoc +++ b/modules/ROOT/pages/clauses/merge.adoc @@ -755,8 +755,8 @@ The table below outlines performance caveats for specific Neo4j versions. | 2025.08 -- current | The Cypher planner is able to leverage xref:indexes/search-performance-indexes/using-indexes.adoc#token-lookup-indexes[token lookup indexes] when matching node labels and relationship types dynamically. This is enabled by the introduction of three new query plan operators: -xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-dynamic-node-label-lookup[`DynamicNodeLabelLookup`], xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-dynamic-directed-relationship-type-lookup[`DynamicDirectedRelationshipTypeLookup`], and xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-dynamic-undirected-relationship-type-lookup[`DynamicUndirectedRelationshipTypeLookup`]. +xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-dynamic-label-node-lookup[`DynamicLabelNodeLookup`], xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-dynamic-directed-relationship-type-lookup[`DynamicDirectedRelationshipTypeLookup`], and xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-dynamic-undirected-relationship-type-lookup[`DynamicUndirectedRelationshipTypeLookup`]. It is not, however, able to use indexes on property values. -For example, `MERGE (n:$(Label) {foo: bar})` will not use any indexes on `n.foo` but can use a `DynamicNodeLabelLookup` on `$(label)`. +For example, `MERGE (n:$(Label) {foo: bar})` will not use any indexes on `n.foo` but can use a `DynamicLabelNodeLookup` on `$(label)`. |=== \ No newline at end of file diff --git a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc index bdcd19156..a8188c351 100644 --- a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc +++ b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc @@ -44,7 +44,7 @@ RETURN people.name ---- | Cypher can now leverage xref:indexes/search-performance-indexes/using-indexes.adoc#token-lookup-indexes[token lookup indexes] when planning queries with xref:clauses/match.adoc#dynamic-match[dynamic labels and relationship types]. -This is enabled by the introduction of three new query plan operators: xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-dynamic-node-label-lookup[`DynamicNodeLabelLookup`], xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-dynamic-directed-relationship-type-lookup[`DynamicDirectedRelationshipTypeLookup`], and xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-dynamic-undirected-relationship-type-lookup[`DynamicUndirectedRelationshipTypeLookup`]. +This is enabled by the introduction of three new query plan operators: xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-dynamic-label-node-lookup[`DynamicLabelNodeLookup`], xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-dynamic-directed-relationship-type-lookup[`DynamicDirectedRelationshipTypeLookup`], and xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-dynamic-undirected-relationship-type-lookup[`DynamicUndirectedRelationshipTypeLookup`]. |=== === New in Cypher 25 diff --git a/modules/ROOT/pages/planning-and-tuning/operators/index.adoc b/modules/ROOT/pages/planning-and-tuning/operators/index.adoc index 380bc8a6e..dcc7a393b 100644 --- a/modules/ROOT/pages/planning-and-tuning/operators/index.adoc +++ b/modules/ROOT/pages/planning-and-tuning/operators/index.adoc @@ -212,7 +212,7 @@ Restricts the xref:planning-and-tuning/runtimes/index.adoc[Cypher runtime] to no | label:yes[] | -| xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-dynamic-node-label-lookup[DynamicNodeLabelLookup] +| xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-dynamic-label-node-lookup[DynamicLabelNodeLookup] | Allows Cypher to use token lookup indexes when planning queries using dynamic node labels. | label:yes[] | diff --git a/modules/ROOT/pages/planning-and-tuning/operators/operators-detail.adoc b/modules/ROOT/pages/planning-and-tuning/operators/operators-detail.adoc index c2739793c..b04716780 100644 --- a/modules/ROOT/pages/planning-and-tuning/operators/operators-detail.adoc +++ b/modules/ROOT/pages/planning-and-tuning/operators/operators-detail.adoc @@ -2577,12 +2577,12 @@ Total database accesses: 106 ====== [role=label--new-2025.08] -[[query-plan-dynamic-node-label-lookup]] -=== Dynamic Node Label Lookup +[[query-plan-dynamic-label-node-lookup]] +=== Dynamic Label Node Lookup Allows Cypher to use xref:indexes/search-performance-indexes/using-indexes.adoc#token-lookup-indexes[token lookup indexes] when planning queries using xref:clauses/match.adoc#dynamic-match[dynamic node labels]. -.DynamicNodeLabelLookup +.DynamicLabelNodeLookup ====== .Query From 219ff14549438a91f4874aa2ce82c07b6a67634b Mon Sep 17 00:00:00 2001 From: Stefano Ottolenghi Date: Wed, 20 Aug 2025 10:51:31 +0200 Subject: [PATCH 45/72] Put examples with OpenAI tokens under testing (#1362) Possible as of https://github.com/neo4j/docs-testing/commit/0c084e356a03f8988f73f2e8862778048ef624ce --- modules/ROOT/pages/genai-integrations.adoc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/ROOT/pages/genai-integrations.adoc b/modules/ROOT/pages/genai-integrations.adoc index 760954ba8..2be9961eb 100644 --- a/modules/ROOT/pages/genai-integrations.adoc +++ b/modules/ROOT/pages/genai-integrations.adoc @@ -92,12 +92,12 @@ The embeddings are stored as properties on nodes or relationships with the type ==== .Create an embedding property for the Godfather -[source,cypher,role=test-skip] +[source,cypher] ---- MATCH (m:Movie {title:'Godfather, The'}) WHERE m.plot IS NOT NULL AND m.title IS NOT NULL WITH m, m.title || ' ' || m.plot AS titleAndPlot // <1> -WITH m, genai.vector.encode(titleAndPlot, 'OpenAI', { token: $token }) AS propertyVector // <2> +WITH m, genai.vector.encode(titleAndPlot, 'OpenAI', { token: $openaiToken }) AS propertyVector // <2> CALL db.create.setNodeVectorProperty(m, 'embedding', propertyVector) // <3> RETURN m.embedding AS embedding ---- @@ -155,14 +155,14 @@ Each returned row contains the following columns: .Create embeddings from a limited number of properties and store them ==== -[source, cypher, role=test-skip] +[source, cypher] ---- MATCH (m:Movie WHERE m.plot IS NOT NULL) WITH m LIMIT 20 WITH collect(m) AS moviesList // <1> WITH moviesList, [movie IN moviesList | movie.title || ': ' || movie.plot] AS batch // <2> -CALL genai.vector.encodeBatch(batch, 'OpenAI', { token: $token }) YIELD index, vector +CALL genai.vector.encodeBatch(batch, 'OpenAI', { token: $openaiToken }) YIELD index, vector WITH moviesList, index, vector CALL db.create.setNodeVectorProperty(moviesList[index], 'embedding', vector) // <3> ---- @@ -174,7 +174,7 @@ CALL db.create.setNodeVectorProperty(moviesList[index], 'embedding', vector) // .Create embeddings from a large number of properties and store them ==== -[source, cypher, role=test-skip] +[source, cypher] ---- MATCH (m:Movie WHERE m.plot IS NOT NULL) WITH collect(m) AS moviesList, // <1> @@ -183,9 +183,9 @@ WITH collect(m) AS moviesList, // <1> UNWIND range(0, total-1, batchSize) AS batchStart // <3> CALL (moviesList, batchStart, batchSize) { // <4> WITH [movie IN moviesList[batchStart .. batchStart + batchSize] | movie.title || ': ' || movie.plot] AS batch // <5> - CALL genai.vector.encodeBatch(batch, 'OpenAI', { token: $token }) YIELD index, vector + CALL genai.vector.encodeBatch(batch, 'OpenAI', { token: $openaiToken }) YIELD index, vector CALL db.create.setNodeVectorProperty(moviesList[batchStart + index], 'embedding', vector) // <6> -} IN CONCURRENT TRANSACTIONS OF 1 ROW <7> +} IN CONCURRENT TRANSACTIONS OF 1 ROW // <7> ---- <1> xref:functions/aggregating.adoc#functions-collect[Collect] all returned `Movie` nodes into a `LIST`. From 3213b93c29f00cfac430967b85b47b596e5d5e0f Mon Sep 17 00:00:00 2001 From: JoelBergstrand Date: Fri, 22 Aug 2025 11:31:48 +0200 Subject: [PATCH 46/72] Added section on by-table semantics (#1345) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adding section on by-table semantics for NEXT, removing the section on known limitations. --------- Co-authored-by: Richard Sill <156673635+rsill-neo4j@users.noreply.github.com> Co-authored-by: Hannes Voigt <30618026+hvub@users.noreply.github.com> Co-authored-by: hvub Co-authored-by: Richard Sill Co-authored-by: Jens Pryce-Åklundh <112686610+JPryce-Aklundh@users.noreply.github.com> --- ...ions-additions-removals-compatibility.adoc | 25 ++ .../composed-queries/sequential-queries.adoc | 380 +++++++++++------- 2 files changed, 267 insertions(+), 138 deletions(-) diff --git a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc index a8188c351..572c68093 100644 --- a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc +++ b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc @@ -32,6 +32,31 @@ For more information, see xref:queries/select-version.adoc[]. | Feature | Details +a| +label:functionality[] +label:updated[] +[source, cypher] +---- +MATCH (p:Product) WHERE p.name <> "Coffee" +CALL (p) { + MATCH (p)<-[:BUYS]-(c:Customer)-[:BUYS]->(otherProduct) + RETURN c, otherProduct + NEXT + RETURN count(DISTINCT c) AS customers, 0 AS customersAlsoBuyingCoffee + UNION + FILTER otherProduct.name = "Coffee" + RETURN 0 as customers, count(DISTINCT c) AS customersAlsoBuyingCoffee + NEXT + RETURN max(customers) AS customers, max(customersAlsoBuyingCoffee) AS customersAlsoBuyingCoffee +} +RETURN p.name AS product, + round(toFloat(customersAlsoBuyingCoffee) * 100 / customers, 1) AS percentageOfCustomersAlsoBuyingCoffee + ORDER BY product +---- + +| `NEXT` now correctly supports aggregations in the context of `UNION` and `CALL`. +For more information, see xref:queries/composed-queries/sequential-queries.adoc#issues-fixes[Sequential queries (`NEXT`) > Known issues and fixes]. + a| label:functionality[] label:updated[] diff --git a/modules/ROOT/pages/queries/composed-queries/sequential-queries.adoc b/modules/ROOT/pages/queries/composed-queries/sequential-queries.adoc index d87c8dd59..7a1265c13 100644 --- a/modules/ROOT/pages/queries/composed-queries/sequential-queries.adoc +++ b/modules/ROOT/pages/queries/composed-queries/sequential-queries.adoc @@ -3,24 +3,25 @@ :table-caption!: :page-role: new-2025.06 -`NEXT` allows for linear composition of queries into a sequence of smaller, self-contained segments, passing the return values from one segment to the next. +`NEXT` allows for linear composition of queries into a sequence of smaller, self-contained segments, passing the whole table of intermediate results from one segment to the next. `NEXT` has the following benefits: * `NEXT` can improve the modularity and readability of complex queries. -* `NEXT` can be used instead of xref:subqueries/call-subquery.adoc[] and the xref:clauses/with.adoc[] clause to construct complex queries. -* `NEXT` can improve the usability of xref:queries/composed-queries/conditional-queries.adoc[conditional `WHEN`] and xref:queries/composed-queries/combined-queries.adoc[combined `UNION`] queries. +* `NEXT` can be used instead of xref:clauses/with.adoc[] clause to construct complex queries. +* `NEXT` can improve the usability of xref:queries/composed-queries/conditional-queries.adoc[]. +* `NEXT` allows for passing the full table of intermediate results into the branches of a xref:queries/composed-queries/combined-queries.adoc[`UNION`]. [[example-graph]] == Example graph The following graph is used for the examples on this page: -image::sequential-queries-graph.svg[Example graph connecting suppliers, products, and customers,width=600,role=popup] +image::sequential-queries-graph.svg[Example graph connecting suppliers,products,and customers,width=600,role=popup] To recreate the graph, run the following query against an empty Neo4j database. -[source, cypher, role=test-setup] +[source,cypher,role=test-setup] ---- CREATE (techCorp:Supplier {name: 'TechCorp', email: 'contact@techcorp.com'}), (foodies:Supplier {name: 'Foodies Inc.', email: 'info@foodies.com'}), @@ -65,7 +66,7 @@ CREATE (techCorp:Supplier {name: 'TechCorp', email: 'contact@techcorp.com'}), == Syntax .`NEXT` syntax -[source, syntax] +[source,syntax] ---- @@ -81,10 +82,12 @@ NEXT [[passing-values]] == Passing values to subsequent queries +`NEXT` passes the result table of a query to the subsequent query. In the following example, `NEXT` passes the variable `customer` to the second query: .Passing a variable to another query via `NEXT` -[source, cypher] +// tag::sequential_queries_basic_example[] +[source,cypher] ---- MATCH (c:Customer) RETURN c AS customer @@ -94,6 +97,7 @@ NEXT MATCH (customer)-[:BUYS]->(:Product {name: 'Chocolate'}) RETURN customer.firstName AS chocolateCustomer ---- +// end::sequential_queries_basic_example[] .Result [role="queryresult",options="header,footer",cols="1*(p:Product {name: 'Chocolate'}) RETURN c AS customer, p AS product @@ -120,7 +122,6 @@ NEXT RETURN customer.firstName AS chocolateCustomer, product.price * (1 - customer.discount) AS chocolatePrice ---- -// end::sequential_queries_basic_example[] .Result [role="queryresult",options="header,footer",cols="2*(p) - RETURN collect(c.firstName) AS customers -} -RETURN p.name as product, customers +MATCH (c:Customer)-[:BUYS]->(p:Product) +RETURN c AS customer, p AS product + +NEXT + +RETURN product.name AS product, + COUNT(customer) AS numberOfCustomers ---- -====== -[.include-with-NEXT] -====== +// end::sequential_queries_aggregation[] + +.Result +[role="queryresult",options="header,footer",cols="2*(p:Product) +RETURN c, p NEXT -MATCH (c:Customer)-[:BUYS]->(p) -RETURN collect(c.firstName) AS customers, p +RETURN c.firstName AS name, COLLECT(p.price * (1 - c.discount)) AS purchases, "discounted price" AS type +UNION +RETURN c.firstName AS name, COLLECT(p.price) AS purchases, "real price" AS type NEXT -RETURN p.name as product, customers +RETURN * ORDER BY name, type +---- +// end::sequential_queries_union[] + +.Result +[role="queryresult",options="header,footer",cols="3*(:Product{name: "Laptop"}) +RETURN c.firstName AS customer +UNION ALL +MATCH (c:Customer)-[:BUYS]-> (:Product{name: "Coffee"}) +RETURN c.firstName AS customer + +NEXT + +RETURN customer AS customer, count(customer) as numberOfProducts +---- + +.Result +[role="queryresult",options="header,footer",cols="2*(:Product {name: 'Chocolate'}) +RETURN c AS customer + +NEXT + +RETURN customer.firstName AS plantCustomer +} + +UNION ALL + +{ +MATCH (c:Customer)-[:BUYS]->(:Product {name: 'Coffee'}) +RETURN c AS customer + +NEXT + +RETURN customer.firstName AS plantCustomer +} +---- + +.Result +[role="queryresult",options="header,footer",cols="1* "Coffee" +CALL (p) { + MATCH (p)<-[:BUYS]-(c:Customer)-[:BUYS]->(otherProduct) + RETURN c, otherProduct + + NEXT + + RETURN count(DISTINCT c) AS customers, 0 AS customersAlsoBuyingCoffee + UNION + FILTER otherProduct.name = "Coffee" + RETURN 0 as customers, count(DISTINCT c) AS customersAlsoBuyingCoffee + + NEXT + + RETURN max(customers) AS customers, max(customersAlsoBuyingCoffee) AS customersAlsoBuyingCoffee +} +RETURN p.name AS product, + round(toFloat(customersAlsoBuyingCoffee) * 100 / customers, 1) AS percentageOfCustomersAlsoBuyingCoffee + ORDER BY product ---- -// end::sequential_queries_call[] -====== -==== .Result [role="queryresult",options="header,footer",cols="2*(:Product)<-[:SUPPLIES]-(s:Supplier) RETURN c.firstName AS customer, s.name AS supplier @@ -256,14 +430,13 @@ The second segment is a conditional query that returns different base personalit The third segment aggregates the personality types. Finally, the fourth segment is another conditional query which subsumes multiple base personality types, if present, to a new personality. -[[next-conditional-queries-top-level-braces]] +[[next-inside-conditional-queries]] === `NEXT` inside a conditional query using `{}` If a conditional query has a `NEXT` in any of its `THEN` or `ELSE` blocks, it is necessary to wrap the part after `THEN` or `ELSE` with `{}`. -.`NEXT` inside a conditional query -// tag::sequential_queries_in_conditional_queries[] -[source, cypher] +.`NEXT` inside conditional query +[source,cypher] ---- MATCH (c:Customer)-[:BUYS]->(p:Product) RETURN c AS customer, sum(p.price) AS sum @@ -281,7 +454,6 @@ ELSE { RETURN customer.firstName AS customer, "club below 1000" AS customerType, finalSum AS sum } ---- -// end::sequential_queries_in_conditional_queries[] .Result [role="queryresult",options="header,footer",cols="3*(:Product{name: "Laptop"}) -RETURN c.firstName AS customer -UNION ALL -MATCH (c:Customer)-[:BUYS]-> (:Product{name: "Coffee"}) -RETURN c.firstName AS customer +[[issues-fixes]] +== Known issues and fixes -NEXT - -RETURN customer AS customer, count(customer) as numberOfProducts ----- +`NEXT` initially did not correctly handle aggregations in the context of `UNION` branches and `CALL` subqueries. +As of Neo4j 2025.08, this issue has been fixed. +The table below summarizes the behavior changes across versions. -.Result -[role="queryresult",options="header,footer",cols="2*(:Product {name: 'Chocolate'}) -RETURN c AS customer - -NEXT - -RETURN customer.firstName AS plantCustomer -} - -UNION ALL - -{ -MATCH (c:Customer)-[:BUYS]->(:Product {name: 'Coffee'}) -RETURN c AS customer - -NEXT - -RETURN customer.firstName AS plantCustomer -} ----- - -.Result -[role="queryresult",options="header,footer",cols="1* Date: Fri, 22 Aug 2025 12:42:48 +0200 Subject: [PATCH 47/72] Shortest paths planning and performance (#1361) --- .../ROOT/pages/patterns/shortest-paths.adoc | 452 +++++++++++++++--- 1 file changed, 376 insertions(+), 76 deletions(-) diff --git a/modules/ROOT/pages/patterns/shortest-paths.adoc b/modules/ROOT/pages/patterns/shortest-paths.adoc index 101ff8e6b..fd8ed3e63 100644 --- a/modules/ROOT/pages/patterns/shortest-paths.adoc +++ b/modules/ROOT/pages/patterns/shortest-paths.adoc @@ -510,99 +510,399 @@ ORDER BY pathLength, destination 2+d|Rows: 8 |=== -== Planning shortest path queries +[[planning-performance]] +== Performance and planning -This section describes the operators used when planning shortest path queries. -For readers not familiar with Cypher execution plans and operators, it is recommended to first read the section xref:planning-and-tuning/execution-plans.adoc[]. +Shortest path queries often perform better when the Cypher planner can identify a single source-target node pair for a shortest path. +This is because it allows the planner to use a bidirectional search from the source and target nodes and terminate when the shortest path between them is found, rather than traversing the whole graph for potential target nodes. +However, while there are strategies to enforce this optimization, forcing Cypher to use them does not always improve performance. -There are two operators used to plan `SHORTEST` queries: +If the planner estimates a single source-target node pair, Cypher uses either the `ShortestPath` or the `StatefulShortestPath(Into)` operators; otherwise it uses `StatefulShortestPath(All)`. +Each of these operators, and the criteria for their use, is outlined xref:patterns/shortest-paths.adoc#operators[below]. -* xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-stateful-shortest-path-all[`StatefulShortestPath(All)`] - uses a unidirectional breadth-first search algorithm to find shortest paths from a previously matched start node to an end node that has not yet been matched. +For readers not familiar with Cypher execution plans and operators, it is recommended to first read xref:planning-and-tuning/execution-plans.adoc[]. -* xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-stateful-shortest-path-into[`StatefulShortestPath(Into)`] - uses a bidirectional breadth-first search (BFS) algorithm, where two simultaneous BFS invocations are performed, one from the left boundary node and one from the right boundary node. +[[example-graph]] +=== Example graph -`StatefulShortestPath(Into)` is used by the planner when both boundary nodes in the shortest path are estimated to match at most one node each. -Otherwise, `StatefulShortestPath(All)` is used. +//// +[source, cypher, role=test-setup] +---- +MATCH (n) +DETACH DELETE n; +---- +//// -For example, the planner estimates that the left boundary node in the below query will match one node, and the right boundary node will match five nodes, -and chooses to expand from the left boundary node. Using `StatefulShortestPath(Into)` would require five bidirectional breadth-first search (BFS) invocations, -whereas `StatefulShortestPath(All)` would require only one unidirectional BFS invocation. -As a result, the query will use `StatefulShortestPath(All)`. +This section uses a graph structured as a tree with a branching factor of three and a depth of nine. +This means the graph starts with a single root node, and each node creates three child nodes, continuing this pattern for nine levels. +In total, the graph consists of almost 90 000 nodes. -.Query planned with `StatefulShortestPath(All)` -[source,cypher] +Each node (`N`) has a `trail` property that acts as a "breadcrumb" list, tracing the path from the root of the tree to that node (the root node has an empty list for its `trail` property). +The trail records the choice of `"A"`, `"B"`, or `"C"` taken to reach each node, building a sequence that increases in length with each level. +This ensures that every `trail` value is unique in the graph. + +To recreate the graph, run the following query against an empty Neo4j database: + +[source, cypher, role=test-setup] +---- +WITH 9 AS depth, 3 AS branching +CREATE (:N {level: 0, trail: []}) +WITH * +UNWIND range(0, depth) AS level +CALL (branching, level) { + MATCH (n {level: level}) + UNWIND ["A", "B", "C"] AS branch + CREATE (n)-[:R]->(:N {level: level + 1, trail: n.trail + [branch]}) +}; +CREATE RANGE INDEX level_index FOR (n:N) ON n.level +---- + +[[call-single-source-target-pair]] +=== Enforcing a single source-target node pair with `CALL` subqueries + +One way for Cypher to enforce a single-source node pair for a shortest path is to rewrite the query to include a xref:subqueries/call-subquery.adoc[`CALL` subquery]. +This is because, with `CALL`, each incoming row already has the source and target nodes bound, so the cardinality (i.e. count) for each is known to be 1. +Without `CALL`, the planner does not know how many targets there are per source node, even though it still runs the shortest-path search once per source, and this may generate less efficient queries. + +.`CALL` subqueries and shortest path query performance +====== + +.Find a shortest path between two nodes +[source, cypher] ---- PROFILE -MATCH - p = SHORTEST 1 (a:Station {name: "Worcestershire Parkway"})(()-[]-()-[]-()){1,}(b:Station) -RETURN p +MATCH p = ANY SHORTEST + (source:N {trail: ["C", "C", "A", "C", "A", "B", "B", "B", "A"]})--+ + (target:N {trail: ["A", "B", "C", "A", "B", "C", "A", "B", "C"]}) +RETURN length(p) AS pathLength ---- .Result -[role="queryplan", subs="attributes+"] ----- -+----------------------------+----+----------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ -| Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | -+----------------------------+----+----------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ -| +ProduceResults | 0 | p | 5 | 9 | 122 | 0 | 0/0 | 10.967 | | -| | +----+----------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+ | -| +Projection | 1 | (a) ((anon_12)-[anon_14]-(anon_13)-[anon_11]-())* (b) AS p | 5 | 9 | 0 | | 0/0 | 0.063 | | -| | +----+----------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+ | -| +StatefulShortestPath(All) | 2 | SHORTEST 1 (a) ((`anon_5`)-[`anon_6`]-(`anon_7`)-[`anon_8`]-(`anon_9`)){1, } (b) | 5 | 9 | 80 | 18927 | 0/0 | 1.071 | In Pipeline 1 | -| | | | expanding from: a | | | | | | | | -| | | | inlined predicates: b:Station | | | | | | | | -| | +----+----------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ -| +Filter | 3 | a.name = $autostring_0 | 1 | 1 | 18 | | | | | -| | +----+----------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | | -| +NodeByLabelScan | 4 | a:Station | 10 | 9 | 10 | 376 | 3/0 | 0.811 | Fused in Pipeline 0 | -+----------------------------+----+----------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ ----- - -However, the heuristic to favor `StatefulShortestPath(All)` can lead to worse query performance. -To have the planner choose the `StatefulShortestPath(Into)` instead, rewrite the query using a xref:subqueries/call-subquery.adoc[`CALL` subquery], which will execute once for each incoming row. - -For example, in the below query, using a `CALL` subquery ensures that the planner binds `a` and `b` to exactly one `Station` node respectively for each executed row, and this forces it to use `StatefulShortestPath(Into)` for each invocation of the `CALL` subquery, since a precondition of using this operator is that both boundary nodes match exactly one node each. +[options="header,footer",cols="1*m"] +|=== +| pathLength -[NOTE] -The below query uses a xref:subqueries/call-subquery.adoc#variable-scope-clause[variable scope clause] to import variables into the `CALL` subquery. +| 18 -.Query rewritten to use `StatefulShortestPath(Into)` -[source,cypher] +1+d|Rows: 1 +|=== + +The plan generated by this query shows that the planner cannot ascertain the existence of a single source-target node pair, even though the `trail` property is unique to each node in the graph (xref:patterns/shortest-paths.adoc#single-source-target-pair-index[no index has been created on this property yet]). +It, therefore, must exhaust all possible target nodes before determining the shortest path from the source using the `StatefulShortestPath(All)` operator. + +.Query Plan +[source, role="queryplan"] +---- ++-----------------------------------+----+----------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ +| Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | ++-----------------------------------+----+----------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ +| +ProduceResults | 0 | `length(p)` | 19612941 | 1 | 0 | 0 | 0/0 | 0.027 | | +| | +----+----------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+ | +| +Projection | 1 | length((source)-[anon_7*]-(target)) AS `length(p)` | 19612941 | 1 | 17 | | 9/0 | 0.036 | | +| | +----+----------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+ | +| +StatefulShortestPath(All, Trail) | 2 | SHORTEST 1 (source) ((`anon_3`)-[`anon_4`]-(`anon_5`)){1, } (target) | 19612941 | 1 | 354292 | 64720328 | 85358/0 | 139.138 | In Pipeline 1 | +| | | | expanding from: source | | | | | | | | +| | | | inlined predicates: target.trail = $autolist_1 | | | | | | | | +| | | | target:N | | | | | | | | +| | +----+----------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ +| +Filter | 3 | source.trail = $autolist_0 | 4429 | 1 | 177146 | | | | | +| | +----+----------------------------------------------------------------------+----------------+-------+---------+----------------+ | | | +| +NodeByLabelScan | 4 | source:N | 88573 | 88573 | 88574 | 376 | 2128/0 | 42.628 | Fused in Pipeline 0 | ++-----------------------------------+----+----------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ + +Total database accesses: 620029, total allocated memory: 64720664 + +1 row +ready to start consuming query after 59 ms, results consumed after another 183 ms +---- + +However, since each `trail` property is unique, rewriting the query to use a `CALL` subquery yields a more efficient plan. +This is because it forces the planner to use the `StatefulShortestPath(Into)` operator, which expands from the source node until it finds its specific target node, and ensures that `ANY SHORTEST` is executed once per source-target pair. + +.Shortest path query rewritten with a `CALL` subquery +[source, cypher] ---- PROFILE -MATCH - (a:Station {name: "Worcestershire Parkway"}), - (b:Station) -CALL (a, b) { - MATCH - p = SHORTEST 1 (a)(()-[]-()-[]-()){1,}(b) - RETURN p +MATCH (start:N {trail: ["C", "C", "A", "C", "A", "B", "B", "B", "A"]}), + (end:N {trail: ["A", "B", "C", "A", "B", "C", "A", "B", "C"]}) +CALL (start, end) { + MATCH p = ANY SHORTEST (start)--+(end) + RETURN p } -RETURN p +RETURN length(p) AS pathLength +---- + +The result is a significantly faster query (down from 59 to 9 milliseconds): + +.Query Plan +[source, role="queryplan"] +---- ++------------------------------------+----+----------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ +| Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | ++------------------------------------+----+----------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ +| +ProduceResults | 0 | `length(p)` | 19612941 | 1 | 0 | 0 | 0/0 | 0.019 | | +| | +----+----------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+ | +| +Projection | 1 | length(p) AS `length(p)` | 19612941 | 1 | 0 | | 0/0 | 0.007 | | +| | +----+----------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+ | +| +Projection | 2 | (start)-[anon_14*]-(end) AS p | 19612941 | 1 | 17 | | 9/0 | 0.073 | | +| | +----+----------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+ | +| +StatefulShortestPath(Into, Trail) | 3 | ANY 1 (start) ((`anon_10`)-[`anon_11`]-(`anon_12`)){1, } (end) | 19612941 | 1 | 1936 | 990280 | 205/0 | 1.135 | In Pipeline 3 | +| | +----+----------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ +| +CartesianProduct | 4 | | 19612941 | 1 | 0 | 9040 | | 0.131 | In Pipeline 2 | +| |\ +----+----------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ +| | +Filter | 5 | end.trail = $autolist_1 | 22143 | 1 | 177146 | | | | | +| | | +----+----------------------------------------------------------------+----------------+-------+---------+----------------+ | | | +| | +NodeByLabelScan | 6 | end:N | 442865 | 88573 | 88574 | 392 | 2128/0 | 29.822 | Fused in Pipeline 1 | +| | +----+----------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ +| +Filter | 7 | start.trail = $autolist_0 | 4429 | 1 | 177146 | | | | | +| | +----+----------------------------------------------------------------+----------------+-------+---------+----------------+ | | | +| +NodeByLabelScan | 8 | start:N | 88573 | 88573 | 88574 | 376 | 2128/0 | 40.743 | Fused in Pipeline 0 | ++------------------------------------+----+----------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ + +Total database accesses: 533393, total allocated memory: 999592 + +1 row +ready to start consuming query after 9 ms, results consumed after another 73 ms +---- + +====== + +[[single-source-target-pair-index]] +=== Enforcing a single source-target node pair with indexes and constraints + +Another way to inform the planner of the uniqueness of the target node in a shortest path is to create an xref:indexes/search-performance-indexes/index.adoc[index] or xref:constraints/managing-constraints.adoc#create-property-uniqueness-constraints[property uniqueness]/xref:constraints/managing-constraints.adoc#create-key-constraints[key constraint] (both of which are xref:constraints/managing-constraints.adoc#constraints-and-backing-indexes[index-backed]) on a property belonging to the matched nodes in the shortest path. +This will accurately inform the planner of node cardinality and thereby enable more efficient query planning (assuming the graph contains uniquely identifying node properties). + +.Impact of indexes and constraints +====== + +.Create a property uniqueness constraint on the `trail` property +[source, cypher] +---- +CREATE CONSTRAINT unique_trail FOR (n:N) REQUIRE n.trail IS UNIQUE +---- + +This constraint will inform the planner of the uniqueness of `trail` values up front. +As a result, the simpler shortest path query (without a `CALL` subquery) will now generate a faster plan (using the `StatefulShortestPath(Into)`) operator with a cardinality of 1 for both the source and target nodes of the shortest path. + +.Find a shortest path between two nodes +[source, cypher] +---- +PROFILE +MATCH p = ANY SHORTEST + (source:N {trail: ["C", "C", "A", "C", "A", "B", "B", "B", "A"]})--+ + (target:N {trail: ["A", "B", "C", "A", "B", "C", "A", "B", "C"]}) +RETURN length(p) AS pathLength +---- + +.Query Plan +[source, role="queryplan"] +---- ++------------------------------------+----+----------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+ +| Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | ++------------------------------------+----+----------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+ +| +ProduceResults | 0 | `length(p)` | 1 | 1 | 0 | 0 | 0/0 | 0.034 | | +| | +----+----------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+ | +| +Projection | 1 | length((source)-[anon_19*]-(target)) AS `length(p)` | 1 | 1 | 17 | | 9/0 | 0.057 | | +| | +----+----------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+ | +| +StatefulShortestPath(Into, Trail) | 2 | SHORTEST 1 (source) ((`anon_15`)-[`anon_16`]-(`anon_17`)){1, } (target) | 1 | 1 | 1936 | 990288 | 205/0 | 1.658 | In Pipeline 1 | +| | +----+----------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+ +| +MultiNodeIndexSeek | 3 | UNIQUE source:N(trail) WHERE trail = $autolist_0, UNIQUE target:N(trail) WHERE trail = $autolist_1 | 1 | 1 | 4 | 376 | 4/2 | 0.332 | In Pipeline 0 | ++------------------------------------+----+----------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+ + +Total database accesses: 1957, total allocated memory: 990608 + +1 row +ready to start consuming query after 48 ms, results consumed after another 3 ms +---- + +====== + +[[single-source-target-pair-limitatins]] +=== Limitations of enforcing a single source-target node pair + +Enforcing a single source-target node pair is not always preferable. +With one source and many targets, rewriting a shortest path query using a `CALL` subquery forces the planner to use `StatefulShortestPath(Into)`, which runs once per target node. +While this is efficient for a single pair, it can become slower as the number of targets increases because it forces the planner to traverse the graph for each individual pair of source-target nodes. +In such cases, it may be more efficient to let the planner use `StatefulShortestPath(All)`, which expands across the graph once and returns all matches. + +.Efficient planning for multi-target shortest paths +===== + +Consider the following query, which does not specify a unique target node and generates a total of 19682 shortest paths from the source nodes: + +.Find a shortest path to many target nodes +[source, cypher] +---- +PROFILE +MATCH p = ANY SHORTEST + (start:N {trail: ["C", "C", "A", "C", "A", "B", "B", "B", "A"]})--+ + (end:N {level: 9}) +RETURN count(*) AS pathCount ---- .Result -[role="queryplan", subs="attributes+"] ----- -+-----------------------------+----+----------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ -| Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | -+-----------------------------+----+----------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ -| +ProduceResults | 0 | p | 5 | 9 | 122 | 0 | 0/0 | 0.561 | | -| | +----+----------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+ | -| +Projection | 1 | (a) ((anon_12)-[anon_14]-(anon_13)-[anon_11]-())* (b) AS p | 5 | 9 | 0 | | 0/0 | 0.060 | | -| | +----+----------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+ | -| +StatefulShortestPath(Into) | 2 | SHORTEST 1 (a) ((`anon_5`)-[`anon_6`]-(`anon_7`)-[`anon_8`]-(`anon_9`)){1, } (b) | 5 | 9 | 176 | 17873 | 0/0 | 2.273 | In Pipeline 3 | -| | +----+----------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ -| +CartesianProduct | 3 | | 5 | 9 | 0 | 2056 | 0/0 | 0.048 | In Pipeline 2 | -| |\ +----+----------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ -| | +NodeByLabelScan | 4 | b:Station | 10 | 9 | 10 | 392 | 1/0 | 0.023 | In Pipeline 1 | -| | +----+----------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ -| +Filter | 5 | a.name = $autostring_0 | 1 | 1 | 18 | | | | | -| | +----+----------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | | -| +NodeByLabelScan | 6 | a:Station | 10 | 9 | 10 | 376 | 3/0 | 0.089 | Fused in Pipeline 0 | -+-----------------------------+----+----------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ ----- - -[TIP] -Sometimes the planner cannot make reliable estimations about how many nodes a pattern node will match. -Consider using a xref:constraints/managing-constraints.adoc#create-property-uniqueness-constraints[property uniqueness constraint] where applicable to help the planner get more reliable estimates. +[options="header,footer",cols="1*m"] +|=== +| pathLength + +| 19682 + +1+d|Rows: 1 +|=== + +Due to the existence of multiple target nodes without a specified, unique property value (there are 19683 nodes in the graph with a `level` property value of `9`), the planner will default to using the `StatefulShortestPath(All)` operator, which expands once from the source node until all valid shortest paths have been found. + +.Query Plan +[source, role="queryplan"] +---- ++-----------------------------------+----+------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------+ +| Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | ++-----------------------------------+----+------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------+ +| +ProduceResults | 0 | `count(*)` | 1 | 1 | 0 | 0 | 0/0 | 0.015 | | +| | +----+------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+ | +| +EagerAggregation | 1 | count(*) AS `count(*)` | 1 | 1 | 0 | 40 | 0/0 | 0.097 | In Pipeline 2 | +| | +----+------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------+ +| +StatefulShortestPath(All, Trail) | 2 | SHORTEST 1 (start) ((`anon_3`)-[`anon_4`]-(`anon_5`)){1, } (end) | 8052 | 19682 | 373974 | 81274328 | 65235/0 | 330.475 | In Pipeline 1 | +| | | | expanding from: start | | | | | | | | +| | | | inlined predicates: end.level = $autoint_1 | | | | | | | | +| | | | end:N | | | | | | | | +| | +----+------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------+ +| +NodeUniqueIndexSeek | 3 | UNIQUE start:N(trail) WHERE trail = $autolist_0 | 1 | 1 | 2 | 376 | 3/0 | 0.106 | In Pipeline 0 | ++-----------------------------------+----+------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------+ + +Total database accesses: 373976, total allocated memory: 81274688 + +1 row +ready to start consuming query after 40 ms, results consumed after another 331 ms +---- + +If the query is rewritten with a `CALL` subquery the planner will use `StatefulShortestPath(Into)` which performs separate traversals for each individual source-target node pairs. + +.Multi-target shortest path query rewritten with a `CALL` subquery +[source, cypher] +---- +PROFILE +MATCH (start:N {trail: ["C", "C", "A", "C", "A", "B", "B", "B", "A"]}), + (end:N {level: 9}) +CALL (start, end) { + MATCH p = ANY SHORTEST (start)--+(end) + RETURN p +} +RETURN count(*) AS pathCount +---- + +.Query Plan +[source, role="queryplan"] +---- ++------------------------------------+----+----------------------------------------------------------------------------------------------------+----------------+-------+----------+----------------+------------------------+-----------+---------------+ +| Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | ++------------------------------------+----+----------------------------------------------------------------------------------------------------+----------------+-------+----------+----------------+------------------------+-----------+---------------+ +| +ProduceResults | 0 | `count(*)` | 1 | 1 | 0 | 0 | 0/0 | 0.120 | | +| | +----+----------------------------------------------------------------------------------------------------+----------------+-------+----------+----------------+------------------------+-----------+ | +| +EagerAggregation | 1 | count(*) AS `count(*)` | 1 | 1 | 0 | 40 | 0/0 | 0.172 | In Pipeline 2 | +| | +----+----------------------------------------------------------------------------------------------------+----------------+-------+----------+----------------+------------------------+-----------+---------------+ +| +Projection | 2 | (start)-[anon_7*]-(end) AS p | 8052 | 19682 | 314930 | | 184197/0 | 35.430 | | +| | +----+----------------------------------------------------------------------------------------------------+----------------+-------+----------+----------------+------------------------+-----------+ | +| +StatefulShortestPath(Into, Trail) | 3 | SHORTEST 1 (start) ((`anon_3`)-[`anon_4`]-(`anon_5`)){1, } (end) | 8052 | 19682 | 32672226 | 157866776 | 3588500/0 | 14200.424 | In Pipeline 1 | +| | +----+----------------------------------------------------------------------------------------------------+----------------+-------+----------+----------------+------------------------+-----------+---------------+ +| +MultiNodeIndexSeek | 4 | UNIQUE start:N(trail) WHERE trail = $autolist_0, RANGE INDEX end:N(level) WHERE level = $autoint_1 | 8052 | 19683 | 19686 | 376 | 108/0 | 4.014 | In Pipeline 0 | ++------------------------------------+----+----------------------------------------------------------------------------------------------------+----------------+-------+----------+----------------+------------------------+-----------+---------------+ + +Total database accesses: 33006842, total allocated memory: 157867272 + +1 row +ready to start consuming query after 32 ms, results consumed after another 14244 ms +---- + +As the plan shows, in this scenario it is not more efficient to enforce a single source-target node pair. +On the contrary, doing so ensures that `StatefulShortestPath(Into)` is executed `19682` times, once for each source-target node pair, thereby generating a more expensive query. + +===== + + +[[operators]] +=== Shortest path operators + +Cypher uses three different operators to plan shortest path queries. +The criteria for when each is used is outlined in the table below. + +[options="header", cols="3a,2a,5a"] +|=== +| Operator +| Description +| Criteria + +| `ShortestPath` +| Performs bidirectional breadth-first searches (BFS) from target and source node. +Terminates when a shortest path is found between them. +a| Used when: + +* The xref:patterns/reference.adoc#shortest-functions[`shortestPath()` or `allShortestPaths()`] functions are used. + +Or, when the estimated cardinality of the source and target nodes in a shortest path are 1 or less and the following are all true: + +* Selector is one of: `SHORTEST 1`, `ANY`, `ANY SHORTEST`, `ALL SHORTEST`, `SHORTEST GROUP`, or `SHORTEST 1 GROUP`. +* There is only one relationship pattern. +* If the pattern is a xref:patterns/variable-length-patterns.adoc#quantified-path-patterns[quantified path pattern] in the form of `\(()-[]-())`, or is a xref:patterns/variable-length-patterns.adoc#quantified-relationship[quantified-relationship], and it uses a filter that can be applied directly to the relationship. +* In the case of a quantified path pattern, there are no node variables declared inside the quantified path pattern that are referenced elsewhere. + +| `StatefulShortestPath(Into)` +| Performs bidirectional BFS from target and source node. +Terminates when a shortest path is found between them. +a| Used when the estimated cardinality of the source and target nodes in a shortest path are 1 or less and either of the following are true: + +* Selector is one of: `ANY/SHORTEST k` or `SHORTEST k GROUPS` and `k` is larger than `1`. +* There is more than one relationship pattern. + +| `StatefulShortestPath(All)` +| Performs unidirectional BFS to find shortest paths from a source node to all nodes matching the target node conditions. +| Used when the planner estimates more than one source-target node pair in a shortest path. + +|=== + +[NOTE] +`StatefulShortestPath(Into)` and `StatefulShortestPath(All)` can match more complex shortest paths than `ShortestPath`. As a result, queries using these operators may be slower and more costly. + +[[shortest-path-fast-exhaustive]] +=== `ShortestPath` operator: fast vs. exhaustive search + +Queries planned with the `ShortestPath` operator (see the xref:patterns/shortest-paths.adoc#operators[table above] for when this operator is used), use two different search algorithms depending on the predicates in the query. + +If the predicate can be checked as the search progresses (for example, requiring every relationship in the path to have a specific property), the planner can exclude invalid paths early. +In such cases, a fast bidirectional breadth-first search (BFS) algorithm is used. + +.Fast search-algorithm +[source, cypher] +---- +MATCH (start:N {level: 1}), (end:N {level: 5}) +MATCH p = shortestPath((start)-[r*]-(end)) +WHERE all(rel IN r WHERE rel.flag IS NULL) +RETURN p +---- + +If the predicate requires inspecting the entire path after it has been matched (such as checking whether the path length exceeds a certain value), the planner cannot exclude paths early. +In such cases, a slower, exhaustive search-algorithm is used. +Exhaustive searches may be very time consuming in certain cases, such as when there is no shortest path between two nodes (to disallow exhaustive searches, set link:{neo4j-docs-base-uri}/operations-manual/current/configuration/configuration-settings#config_dbms.cypher.forbid_exhaustive_shortestpath[`dbms.cypher.forbid_exhaustive_shortestpath`] to `true`). + +.Exhaustive search-algorithm +[source, cypher] +---- +MATCH (start:N {level: 1}), (end:N {level: 5}) +MATCH p = shortestPath((start)-[*]-(end)) +WHERE length(p) > 3 +RETURN p +---- + +For queries that would otherwise trigger an exhaustive search, a practical workaround is to first bind the matched path and then filter it using a xref:clauses/filter.adoc[`FILTER`] clause (`FILTER` is a separate clause that performs a post-match filter, unlike xref:clauses/where.adoc[`WHERE`] which adds constraints to the pattern matched by the xref:clauses/match.adoc[`MATCH`] clause). +This allows the planner to use a fast search-algorithm while finding the shortest path, and only afterwards apply the filter. +Note that, because the filter is applied after the fast algorithm runs, it may eliminate all candidate paths and return no results. + +.Query rewritten to use fast search-algorithm +[source, cypher] +---- +MATCH (start:N {level: 1}), (end:N {level: 5}) +MATCH p = shortestPath((start)-[*]-(end)) +FILTER length(p) > 3 +RETURN p +---- From 50b9f08b38f28aea084ae5cf4fe5096c01316772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Fri, 22 Aug 2025 13:00:14 +0200 Subject: [PATCH 48/72] Clarify `indexes` return column for `SHOW TRANSACTIONS` when dynamic values are used (#1365) --- modules/ROOT/pages/clauses/transaction-clauses.adoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/clauses/transaction-clauses.adoc b/modules/ROOT/pages/clauses/transaction-clauses.adoc index 5bddba41e..7488331b2 100644 --- a/modules/ROOT/pages/clauses/transaction-clauses.adoc +++ b/modules/ROOT/pages/clauses/transaction-clauses.adoc @@ -91,7 +91,8 @@ For details, see xref::planning-and-tuning/runtimes/index.adoc[Cypher runtime]. m| STRING m| indexes -a| The indexes utilised by the query currently executing in this transaction, or `null` if no query is currently executing. +a| The indexes utilized by the query currently executing in this transaction, or `null` if no query is currently executing. +Only indexes evaluating static node labels and relationship types are shown in this column. m| LIST From 3617d8219d1fca04e8b2132746c27a4a1a240fe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Fri, 22 Aug 2025 13:17:50 +0200 Subject: [PATCH 49/72] remove old shortest path tutorial (#1367) Because: https://github.com/neo4j/docs-cypher/pull/1361 --- modules/ROOT/content-nav.adoc | 3 +- .../ROOT/pages/appendix/tutorials/index.adoc | 1 - .../tutorials/shortestpath-planning.adoc | 285 ------------------ 3 files changed, 1 insertion(+), 288 deletions(-) delete mode 100644 modules/ROOT/pages/appendix/tutorials/shortestpath-planning.adoc diff --git a/modules/ROOT/content-nav.adoc b/modules/ROOT/content-nav.adoc index ebe74336d..38315b153 100644 --- a/modules/ROOT/content-nav.adoc +++ b/modules/ROOT/content-nav.adoc @@ -153,5 +153,4 @@ *** xref:appendix/gql-conformance/additional-cypher.adoc[] ** xref:appendix/tutorials/index.adoc[] *** xref:appendix/tutorials/basic-query-tuning.adoc[] -*** xref:appendix/tutorials/advanced-query-tuning.adoc[] -*** xref:appendix/tutorials/shortestpath-planning.adoc[] \ No newline at end of file +*** xref:appendix/tutorials/advanced-query-tuning.adoc[] \ No newline at end of file diff --git a/modules/ROOT/pages/appendix/tutorials/index.adoc b/modules/ROOT/pages/appendix/tutorials/index.adoc index 45bd0294f..3afa74049 100644 --- a/modules/ROOT/pages/appendix/tutorials/index.adoc +++ b/modules/ROOT/pages/appendix/tutorials/index.adoc @@ -3,4 +3,3 @@ * xref:appendix/tutorials/basic-query-tuning.adoc[] * xref:appendix/tutorials/advanced-query-tuning.adoc[] -* xref:appendix/tutorials/shortestpath-planning.adoc[] - information about how to plan queries using the xref:patterns/reference.adoc#shortest-functions[`shortestPath()` function]. \ No newline at end of file diff --git a/modules/ROOT/pages/appendix/tutorials/shortestpath-planning.adoc b/modules/ROOT/pages/appendix/tutorials/shortestpath-planning.adoc deleted file mode 100644 index 40df8bc60..000000000 --- a/modules/ROOT/pages/appendix/tutorials/shortestpath-planning.adoc +++ /dev/null @@ -1,285 +0,0 @@ -:description: Shortest path and how it is planned. -[[query-shortestpath-planning]] -= Shortest path planning - -This page contains an example of how to plan queries using the xref:patterns/reference.adoc#shortest-functions[shortestPath()] function. - - -Planning shortest paths in Cypher can lead to different query plans depending on the predicates that need to be evaluated. -Internally, Neo4j will use a fast bidirectional breadth-first search algorithm if the predicates can be evaluated whilst searching for the path. -Therefore, this fast algorithm will always be certain to return the right answer when there are universal predicates on the path; for example, when searching for the shortest path where all nodes have the `Person` label, or where there are no nodes with a `name` property. - -If the predicates need to inspect the whole path before deciding on whether it is valid or not, this fast algorithm cannot be relied on to find the shortest path, and Neo4j may have to resort to using a slower exhaustive depth-first search algorithm to find the path. -This means that query plans for shortest path queries with non-universal predicates will include a fallback to running the exhaustive search to find the path should the fast algorithm not succeed. -For example, depending on the data, an answer to a shortest path query with existential predicates -- such as the requirement that at least one node contains the property `name='Kevin Bacon'` -- may not be able to be found by the fast algorithm. -In this case, Neo4j will fall back to using the exhaustive search to enumerate all paths and potentially return an answer. - -The running times of these two algorithms may differ by orders of magnitude, so it is important to ensure that the fast approach is used for time-critical queries. - -When the exhaustive search is planned, it is still only executed when the fast algorithm fails to find any matching paths. -The fast algorithm is always executed first, since it is possible that it can find a valid path even though that could not be guaranteed at planning time. - -Please note that falling back to the exhaustive search may prove to be a very time consuming strategy in some cases; such as when there is no shortest path between two nodes. -Therefore, in these cases, it is recommended to set `cypher.forbid_exhaustive_shortestpath` to `true`, as explained in link:{neo4j-docs-base-uri}/operations-manual/current/configuration/configuration-settings#config_dbms.cypher.forbid_exhaustive_shortestpath[Operations Manual -> Configuration settings]. - - -== Shortest path -- fast algorithm - - -.Query evaluated with the fast algorith -====== - -//// -[source, cypher, role=test-setup] ----- -CREATE - (KevinB:Person {name: 'Kevin Bacon'}), - (JackN:Person {name: 'Jack Nicholson'}), - (Keanu:Person {name: 'Keanu Reeves'}), - (Al:Person {name: 'Al Pacino'}), - (NancyM:Person {name: 'Nancy Meyers'}), - (RobR:Person {name: 'Rob Reiner'}), - (Taylor:Person {name: 'Taylor Hackford'}), - - (AFewGoodMen:Movie {title: 'A Few Good Men'}), - (JackN)-[:ACTED_IN {role: 'Col. Nathan R. Jessup'}]->(AFewGoodMen), - (KevinB)-[:ACTED_IN {role: 'Capt. Jack Ross'}]->(AFewGoodMen), - (RobR)-[:DIRECTED]->(AFewGoodMen), - - (SomethingsGottaGive:Movie {title: 'Something´s Gotta Give'}), - (JackN)-[:ACTED_IN {role: 'Harry Sanborn'}]->(SomethingsGottaGive), - (Keanu)-[:ACTED_IN {role: 'Julian Mercer'}]->(SomethingsGottaGive), - (NancyM)-[:DIRECTED]->(SomethingsGottaGive), - - (TheDevilsAdvocate:Movie {title: 'The Devil´s Advocate'}), - (Keanu)-[:ACTED_IN {role: 'Kevin Lomax'}]->(TheDevilsAdvocate), - (Al)-[:ACTED_IN {role: 'John Milton'}]->(TheDevilsAdvocate); - -CREATE INDEX FOR (n:Person) -ON (n.name) ----- -//// - -This query can be evaluated with the fast algorithm -- there are no predicates that need to see the whole path before being evaluated. - -.Query -[source, cypher, role="noplay"] ----- -PROFILE -MATCH - (KevinB:Person {name: 'Kevin Bacon'}), - (Al:Person {name: 'Al Pacino'}), - p = shortestPath((KevinB)-[:ACTED_IN*]-(Al)) -WHERE all(r IN relationships(p) WHERE r.role IS NOT NULL) -RETURN p ----- - -.Query plan -[role="queryplan", subs="attributes+"] ----- -Planner COST - -Runtime PIPELINED - -Runtime version {neo4j-version} - -Batch size 128 - -+---------------------+------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+ -| Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | -+---------------------+------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+ -| +ProduceResults | p | 2 | 1 | 0 | | 1/0 | 0.252 | | -| | +------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+ | -| +ShortestPath | p = (KevinB)-[anon_0:ACTED_IN*]-(Al) WHERE all(r IN relationships(p) WHERE r.role IS NOT NULL) | 2 | 1 | 23 | 1688 | | | In Pipeline 1 | -| | +------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+ -| +MultiNodeIndexSeek | RANGE INDEX KevinB:Person(name) WHERE name = $autostring_0, | 2 | 1 | 4 | 120 | 1/1 | 0.916 | In Pipeline 0 | -| | RANGE INDEX Al:Person(name) WHERE name = $autostring_1 | | | | | | | | -+---------------------+------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+ - -Total database accesses: 27, total allocated memory: 1752 ----- - -====== - - -== Shortest path -- additional predicate checks on the paths - -Predicates used in the `WHERE` clause that apply to the shortest path pattern are evaluated before deciding what the shortest matching path is. - - -.Consider using the exhaustive search as a fallback -====== - -//// -CREATE - (KevinB:Person {name: 'Kevin Bacon'}), - (JackN:Person {name: 'Jack Nicholson'}), - (Keanu:Person {name: 'Keanu Reeves'}), - (Al:Person {name: 'Al Pacino'}), - (NancyM:Person {name: 'Nancy Meyers'}), - (RobR:Person {name: 'Rob Reiner'}), - (Taylor:Person {name: 'Taylor Hackford'}), - - (AFewGoodMen:Movie {title: 'A Few Good Men'}), - (JackN)-[:ACTED_IN {role: 'Col. Nathan R. Jessup'}]->(AFewGoodMen), - (KevinB)-[:ACTED_IN {role: 'Capt. Jack Ross'}]->(AFewGoodMen), - (RobR)-[:DIRECTED]->(AFewGoodMen), - - (SomethingsGottaGive:Movie {title: 'Something´s Gotta Give'}), - (JackN)-[:ACTED_IN {role: 'Harry Sanborn'}]->(SomethingsGottaGive), - (Keanu)-[:ACTED_IN {role: 'Julian Mercer'}]->(SomethingsGottaGive), - (NancyM)-[:DIRECTED]->(SomethingsGottaGive), - - (TheDevilsAdvocate:Movie {title: 'The Devil´s Advocate'}), - (Keanu)-[:ACTED_IN {role: 'Kevin Lomax'}]->(TheDevilsAdvocate), - (Al)-[:ACTED_IN {role: 'John Milton'}]->(TheDevilsAdvocate) - -CREATE INDEX FOR (n:Person) -ON (n.name) -//// - -.Query -[source, cypher, role="noplay"] ----- -MATCH - (KevinB:Person {name: 'Kevin Bacon'}), - (Al:Person {name: 'Al Pacino'}), - p = shortestPath((KevinB)-[*]-(Al)) -WHERE length(p) > 1 -RETURN p ----- - -This query, in contrast with the one above, needs to check that the whole path follows the predicate before we know if it is valid or not, and so the query plan will also include the fallback to the slower exhaustive search algorithm. - -.Query plan -[source, query plan, subs="attributes+", role="noheader"] ----- -Planner COST - -Runtime PIPELINED - -Runtime version {neo4j-version} - -Batch size 1024 - -+--------------------------+-------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ -| Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | -+--------------------------+-------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ -| +ProduceResults | p | 1 | 1 | 0 | | | | | -| | +-------------------------------------------------------------+----------------+------+---------+----------------+ | | | -| +AntiConditionalApply | | 1 | 1 | 0 | 41464 | 0/0 | 0.332 | Fused in Pipeline 6 | -| |\ +-------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ -| | +Top | anon_1 ASC LIMIT 1 | 2 | 0 | 0 | 4280 | 0/0 | 0.000 | In Pipeline 5 | -| | | +-------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ -| | +Projection | length(p) AS anon_1 | 7966 | 0 | 0 | | | | | -| | | +-------------------------------------------------------------+----------------+------+---------+----------------+ | | | -| | +Filter | length(p) > $autoint_2 | 7966 | 0 | 0 | | | | | -| | | +-------------------------------------------------------------+----------------+------+---------+----------------+ | | | -| | +Projection | (KevinB)-[anon_0*]-(Al) AS p | 26554 | 0 | 0 | | | | | -| | | +-------------------------------------------------------------+----------------+------+---------+----------------+ | | | -| | +VarLengthExpand(Into) | (KevinB)-[anon_0*]-(Al) | 26554 | 0 | 0 | | | | | -| | | +-------------------------------------------------------------+----------------+------+---------+----------------+ | | | -| | +Argument | KevinB, Al | 2 | 0 | 0 | 0 | 0/0 | 0.000 | Fused in Pipeline 4 | -| | +-------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ -| +Apply | | 2 | 1 | 0 | | 0/0 | 0.026 | | -| |\ +-------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ -| | +Optional | KevinB, Al | 2 | 1 | 0 | 4840 | 0/0 | 0.134 | In Pipeline 3 | -| | | +-------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ -| | +ShortestPath | p = (KevinB)-[anon_0*]-(Al) WHERE length(p) > $autoint_2 | 1 | 1 | 1 | 1760 | | | In Pipeline 2 | -| | | +-------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ -| | +Argument | KevinB, Al | 2 | 1 | 0 | 24680 | 0/0 | 0.056 | In Pipeline 1 | -| | +-------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ -| +MultiNodeIndexSeek | RANGE INDEX KevinB:Person(name) WHERE name = $autostring_0, | 2 | 1 | 4 | 120 | 2/0 | 0.644 | In Pipeline 0 | -| | RANGE INDEX Al:Person(name) WHERE name = $autostring_1 | | | | | | | | -+--------------------------+-------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ - -Total database accesses: 5, total allocated memory: 50152 ----- - -====== - -The way the bigger exhaustive query plan works is by using `Apply`/`Optional` to ensure that when the fast algorithm does not find any results, a `null` result is generated instead of simply stopping the result stream. -On top of this, the planner will issue an `AntiConditionalApply`, which will run the exhaustive search if the path variable is pointing to `null` instead of a path. - -An `ErrorPlan` operator will appear in the execution plan in cases where: - -* `dbms.cypher.forbid_exhaustive_shortestpath` is set to `true`. -* The fast algorithm is not able to find the shortest path. - - -.Prevent the exhaustive search from being used as a fallback -====== - -//// -CREATE - (KevinB:Person {name: 'Kevin Bacon'}), - (JackN:Person {name: 'Jack Nicholson'}), - (Keanu:Person {name: 'Keanu Reeves'}), - (Al:Person {name: 'Al Pacino'}), - (NancyM:Person {name: 'Nancy Meyers'}), - (RobR:Person {name: 'Rob Reiner'}), - (Taylor:Person {name: 'Taylor Hackford'}), - - (AFewGoodMen:Movie {title: 'A Few Good Men'}), - (JackN)-[:ACTED_IN {role: 'Col. Nathan R. Jessup'}]->(AFewGoodMen), - (KevinB)-[:ACTED_IN {role: 'Capt. Jack Ross'}]->(AFewGoodMen), - (RobR)-[:DIRECTED]->(AFewGoodMen), - - (SomethingsGottaGive:Movie {title: 'Something´s Gotta Give'}), - (JackN)-[:ACTED_IN {role: 'Harry Sanborn'}]->(SomethingsGottaGive), - (Keanu)-[:ACTED_IN {role: 'Julian Mercer'}]->(SomethingsGottaGive), - (NancyM)-[:DIRECTED]->(SomethingsGottaGive), - - (TheDevilsAdvocate:Movie {title: 'The Devil´s Advocate'}), - (Keanu)-[:ACTED_IN {role: 'Kevin Lomax'}]->(TheDevilsAdvocate), - (Al)-[:ACTED_IN {role: 'John Milton'}]->(TheDevilsAdvocate) - -CREATE INDEX FOR (n:Person) -ON (n.name) -//// - -.Query -[source, cypher, role="noplay"] ----- -MATCH - (KevinB:Person {name: 'Kevin Bacon'}), - (Al:Person {name: 'Al Pacino'}), - p = shortestPath((KevinB)-[*]-(Al)) -WITH p -WHERE length(p) > 1 -RETURN p ----- - -This query, just like the one above, needs to check that the whole path follows the predicate before we know if it is valid or not. -However, the inclusion of the `WITH` clause means that the query plan will not include the fallback to the slower exhaustive search algorithm. -Instead, any paths found by the fast algorithm will subsequently be filtered, which may result in no answers being returned. - -.Query plan -[source, query plan, subs="attributes+", role="noheader"] ----- -Planner COST - -Runtime PIPELINED - -Runtime version {neo4j-version} - -Batch size 128 - -+---------------------+-------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+ -| Operator | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | -+---------------------+-------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+ -| +ProduceResults | p | 1 | 1 | 0 | | 1/0 | 0.353 | | -| | +-------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+ | -| +Filter | length(p) > $autoint_2 | 1 | 1 | 0 | | 0/0 | 0.255 | | -| | +-------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+ | -| +ShortestPath | p = (KevinB)-[anon_0*]-(Al) | 2 | 1 | 1 | 1760 | | | In Pipeline 1 | -| | +-------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+ -| +MultiNodeIndexSeek | RANGE INDEX KevinB:Person(name) WHERE name = $autostring_0, | 2 | 1 | 4 | 120 | 2/0 | 0.371 | In Pipeline 0 | -| | RANGE INDEX Al:Person(name) WHERE name = $autostring_1 | | | | | | | | -+---------------------+-------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+ - -Total database accesses: 5, total allocated memory: 1824 ----- - -====== - From 8dc738769aef5650840d5197685898ed5a7c42d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Mon, 25 Aug 2025 09:39:40 +0200 Subject: [PATCH 50/72] fix links --- modules/ROOT/pages/introduction/index.adoc | 2 +- modules/ROOT/pages/patterns/shortest-paths.adoc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/introduction/index.adoc b/modules/ROOT/pages/introduction/index.adoc index a60945cdc..2787c0fef 100644 --- a/modules/ROOT/pages/introduction/index.adoc +++ b/modules/ROOT/pages/introduction/index.adoc @@ -24,7 +24,7 @@ Additionally, https://graphacademy.neo4j.com/[Neo4j GraphAcademy] has a variety For a reference of all available Cypher features, see the link:{neo4j-docs-base-uri}/cypher-cheat-sheet/25/all/[Cypher Cheat Sheet]. -For a downloadable PDF version of the Cypher Manual, visit the link:{neo4j-docs-base-uri}/docs-archive/#_cypher_query_language[Neo4j documentation archive]. +For a downloadable PDF version of the Cypher Manual, visit the link:{neo4j-docs-base-uri}/reference/docs-archive/#_cypher_query_language[Neo4j documentation archive]. This introduction will cover the following topics: diff --git a/modules/ROOT/pages/patterns/shortest-paths.adoc b/modules/ROOT/pages/patterns/shortest-paths.adoc index fd8ed3e63..5ef622f0b 100644 --- a/modules/ROOT/pages/patterns/shortest-paths.adoc +++ b/modules/ROOT/pages/patterns/shortest-paths.adoc @@ -844,7 +844,7 @@ Or, when the estimated cardinality of the source and target nodes in a shortest * Selector is one of: `SHORTEST 1`, `ANY`, `ANY SHORTEST`, `ALL SHORTEST`, `SHORTEST GROUP`, or `SHORTEST 1 GROUP`. * There is only one relationship pattern. -* If the pattern is a xref:patterns/variable-length-patterns.adoc#quantified-path-patterns[quantified path pattern] in the form of `\(()-[]-())`, or is a xref:patterns/variable-length-patterns.adoc#quantified-relationship[quantified-relationship], and it uses a filter that can be applied directly to the relationship. +* If the pattern is a xref:patterns/variable-length-patterns.adoc#quantified-path-patterns[quantified path pattern] in the form of `\(()-[]-())`, or is a xref:patterns/variable-length-patterns.adoc#quantified-relationships[quantified-relationship], and it uses a filter that can be applied directly to the relationship. * In the case of a quantified path pattern, there are no node variables declared inside the quantified path pattern that are referenced elsewhere. | `StatefulShortestPath(Into)` From b0839437d482ee10e3ca9adf75f29e4cfda5dc2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Mon, 25 Aug 2025 14:52:33 +0200 Subject: [PATCH 51/72] clarifying note about default databases (#1370) --- modules/ROOT/pages/introduction/cypher-neo4j.adoc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/introduction/cypher-neo4j.adoc b/modules/ROOT/pages/introduction/cypher-neo4j.adoc index cbd2eea5f..1a1fc664a 100644 --- a/modules/ROOT/pages/introduction/cypher-neo4j.adoc +++ b/modules/ROOT/pages/introduction/cypher-neo4j.adoc @@ -18,7 +18,7 @@ Cypher works almost identically between the two editions, but there are key area | link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/[Multi-database] a| -Any number of user databases. +A `system` database and any number of user databases. a| Only `system` and one user database. @@ -41,6 +41,13 @@ Only xref::constraints/managing-constraints.adoc#create-property-uniqueness-cons |=== +[NOTE] +The `system` database cannot be deleted. +The default user database, `neo4j`, can be deleted. +If you want to delete it, first set another database as the default using the procedure link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_dbms_setDefaultDatabase[`dbms.setDefaultDatabase]` (this must be done from the `system` database). +For more information, see the link:{neo4j-docs-base-uri}/operations-manual/current/clustering/databases/#cluster-default-database[Operations Manual -> Change the default database]. + + [[neo4j-terminology]] == Key Neo4j terminology From 1c61fcb158712ec3cde9249d24aa56cc20029532 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Mon, 25 Aug 2025 15:04:34 +0200 Subject: [PATCH 52/72] Clarify runtimes on CE and EE (#1369) --- modules/ROOT/pages/introduction/cypher-neo4j.adoc | 8 ++++++++ .../ROOT/pages/planning-and-tuning/runtimes/concepts.adoc | 8 ++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/modules/ROOT/pages/introduction/cypher-neo4j.adoc b/modules/ROOT/pages/introduction/cypher-neo4j.adoc index 1a1fc664a..a424318eb 100644 --- a/modules/ROOT/pages/introduction/cypher-neo4j.adoc +++ b/modules/ROOT/pages/introduction/cypher-neo4j.adoc @@ -39,6 +39,14 @@ xref::constraints/managing-constraints.adoc#create-key-constraints[node and rela a| Only xref::constraints/managing-constraints.adoc#create-property-uniqueness-constraints[node and relationship property uniqueness constraints]. +| Runtimes +a| +All runtimes: +xref::planning-and-tuning/runtimes/concepts.adoc#runtimes-slotted-runtime[slotted runtime], xref::planning-and-tuning/runtimes/concepts.adoc#runtimes-pipelined-runtime[pipelined runtime] (default), xref::planning-and-tuning/runtimes/concepts.adoc#runtimes-parallel-runtime[parallel runtime]. + +a| +Only xref::planning-and-tuning/runtimes/concepts.adoc#runtimes-slotted-runtime[slotted runtime]. + |=== [NOTE] diff --git a/modules/ROOT/pages/planning-and-tuning/runtimes/concepts.adoc b/modules/ROOT/pages/planning-and-tuning/runtimes/concepts.adoc index 56602fd49..4aff85092 100644 --- a/modules/ROOT/pages/planning-and-tuning/runtimes/concepts.adoc +++ b/modules/ROOT/pages/planning-and-tuning/runtimes/concepts.adoc @@ -140,17 +140,13 @@ This is because the process of individual rows being pulled from different opera [[runtimes-pipelined-runtime]] == Pipelined runtime -The pipelined runtime is the default runtime for Neo4j Enterprise Edition. -This means that unless users of Neo4j Enterprise Edition specify a different runtime, queries will be run using the pipelined runtime. - -To specify that a query should use the pipelined runtime, prepend the query with `CYPHER runtime = pipelined`. -For example: +The pipelined runtime is the default runtime for Neo4j Enterprise Edition and all tiers of link:{neo4j-docs-base-uri}/aura/[Aura]. +This means that unless users of Neo4j Aura or Enterprise Edition specify a different runtime, queries will be run using the pipelined runtime. .Query [source, cypher] ---- EXPLAIN -CYPHER runtime = pipelined MATCH (:Station { name: 'Denmark Hill' })<-[:CALLS_AT]-(d:Stop) ((:Stop)-[:NEXT]->(:Stop))+ (a:Stop)-[:CALLS_AT]->(:Station { name: 'Clapham Junction' }) From e48f2608aa7ad1971a0a3faad4077d09822a72c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Tue, 26 Aug 2025 13:08:46 +0200 Subject: [PATCH 53/72] Add another criteria for when SHORTEST queries are rewritten with to use legacy operator (#1371) --- modules/ROOT/pages/patterns/shortest-paths.adoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/ROOT/pages/patterns/shortest-paths.adoc b/modules/ROOT/pages/patterns/shortest-paths.adoc index 5ef622f0b..e8d83f72e 100644 --- a/modules/ROOT/pages/patterns/shortest-paths.adoc +++ b/modules/ROOT/pages/patterns/shortest-paths.adoc @@ -845,6 +845,8 @@ Or, when the estimated cardinality of the source and target nodes in a shortest * Selector is one of: `SHORTEST 1`, `ANY`, `ANY SHORTEST`, `ALL SHORTEST`, `SHORTEST GROUP`, or `SHORTEST 1 GROUP`. * There is only one relationship pattern. * If the pattern is a xref:patterns/variable-length-patterns.adoc#quantified-path-patterns[quantified path pattern] in the form of `\(()-[]-())`, or is a xref:patterns/variable-length-patterns.adoc#quantified-relationships[quantified-relationship], and it uses a filter that can be applied directly to the relationship. +* If the pattern is a quantified path pattern or a quantified relationship and the relationship pattern is directed, the lower bound of the xref:patterns/reference.adoc#quantifiers[quantifier] is 0 or 1. +If the relationship pattern is directed, the lower bound is 0. * In the case of a quantified path pattern, there are no node variables declared inside the quantified path pattern that are referenced elsewhere. | `StatefulShortestPath(Into)` From f7f362baa6da10793ed6238a9749caa52ac97e05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Tue, 26 Aug 2025 14:57:41 +0200 Subject: [PATCH 54/72] Fulltext index provider to 2.0 in SHOW FULLTEXT INDEX examples (#1368) --- .../semantic-indexes/full-text-indexes.adoc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/ROOT/pages/indexes/semantic-indexes/full-text-indexes.adoc b/modules/ROOT/pages/indexes/semantic-indexes/full-text-indexes.adoc index 06aba7874..c202e0a74 100644 --- a/modules/ROOT/pages/indexes/semantic-indexes/full-text-indexes.adoc +++ b/modules/ROOT/pages/indexes/semantic-indexes/full-text-indexes.adoc @@ -291,9 +291,9 @@ SHOW FULLTEXT INDEXES +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | id | name | state | populationPercent | type | entityType | labelsOrTypes | properties | indexProvider | owningConstraint | lastRead | readCount | +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| 4 | "communications" | "ONLINE" | 100.0 | "FULLTEXT" | "RELATIONSHIP" | ["REVIEWED", "EMAILED"] | ["message"] | "fulltext-1.0" | NULL | 2023-10-31T15:06:10.270Z | 2 | -| 3 | "namesAndTeams" | "ONLINE" | 100.0 | "FULLTEXT" | "NODE" | ["Employee", "Manager"] | ["name", "team"] | "fulltext-1.0" | NULL | 2023-10-31T15:07:48.874Z | 5 | -| 6 | "peerReviews" | "ONLINE" | 100.0 | "FULLTEXT" | "NODE" | ["Employee", "Manager"] | ["peerReviews"] | "fulltext-1.0" | NULL | 2023-10-31T15:09:05.391Z | 3 | +| 4 | "communications" | "ONLINE" | 100.0 | "FULLTEXT" | "RELATIONSHIP" | ["REVIEWED", "EMAILED"] | ["message"] | "fulltext-2.0" | NULL | 2023-10-31T15:06:10.270Z | 2 | +| 3 | "namesAndTeams" | "ONLINE" | 100.0 | "FULLTEXT" | "NODE" | ["Employee", "Manager"] | ["name", "team"] | "fulltext-2.0" | NULL | 2023-10-31T15:07:48.874Z | 5 | +| 6 | "peerReviews" | "ONLINE" | 100.0 | "FULLTEXT" | "NODE" | ["Employee", "Manager"] | ["peerReviews"] | "fulltext-2.0" | NULL | 2023-10-31T15:09:05.391Z | 3 | +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ---- @@ -310,7 +310,7 @@ SHOW FULLTEXT INDEXES WHERE name CONTAINS "Team" +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | id | name | state | populationPercent | type | entityType | labelsOrTypes | properties | indexProvider | owningConstraint | lastRead | readCount | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| 5 | "namesAndTeams" | "ONLINE" | 100.0 | "FULLTEXT" | "NODE" | ["Employee", "Manager"] | ["name", "team"] | "fulltext-1.0" | NULL | NULL | 0 | +| 5 | "namesAndTeams" | "ONLINE" | 100.0 | "FULLTEXT" | "NODE" | ["Employee", "Manager"] | ["name", "team"] | "fulltext-2.0" | NULL | NULL | 0 | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ---- @@ -328,9 +328,9 @@ SHOW FULLTEXT INDEXES YIELD * +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | id | name | state | populationPercent | type | entityType | labelsOrTypes | properties | indexProvider | owningConstraint | lastRead | readCount | trackedSince | options | failureMessage | createStatement | +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| 4 | "communications" | "ONLINE" | 100.0 | "FULLTEXT" | "RELATIONSHIP" | ["REVIEWED", "EMAILED"] | ["message"] | "fulltext-1.0" | NULL | NULL | 0 | 2023-11-01T09:27:57.024Z | {indexConfig: {`fulltext.analyzer`: "standard-no-stop-words", `fulltext.eventually_consistent`: FALSE}} | "" | "CREATE FULLTEXT INDEX `communications` FOR ()-[r:`REVIEWED`|`EMAILED`]-() ON EACH [r.`message`] OPTIONS {indexConfig: {`fulltext.analyzer`: 'standard-no-stop-words',`fulltext.eventually_consistent`: false}}" | -| 5 | "namesAndTeams" | "ONLINE" | 100.0 | "FULLTEXT" | "NODE" | ["Employee", "Manager"] | ["name", "team"] | "fulltext-1.0" | NULL | NULL | 0 | 2023-11-01T12:24:48.002Z | {indexConfig: {`fulltext.analyzer`: "standard-no-stop-words", `fulltext.eventually_consistent`: FALSE}} | "" | "CREATE FULLTEXT INDEX `namesAndTeams` FOR (n:`Employee`|`Manager`) ON EACH [n.`name`, n.`team`] OPTIONS {indexConfig: {`fulltext.analyzer`: 'standard-no-stop-words',`fulltext.eventually_consistent`: false}}" | -| 6 | "peerReviews" | "ONLINE" | 100.0 | "FULLTEXT" | "NODE" | ["Employee", "Manager"] | ["peerReviews"] | "fulltext-1.0" | NULL | NULL | 0 | 2023-11-01T12:25:41.495Z | {indexConfig: {`fulltext.analyzer`: "english", `fulltext.eventually_consistent`: TRUE}} | "" | "CREATE FULLTEXT INDEX `peerReviews` FOR (n:`Employee`|`Manager`) ON EACH [n.`peerReviews`] OPTIONS {indexConfig: {`fulltext.analyzer`: 'english',`fulltext.eventually_consistent`: true}}" | +| 4 | "communications" | "ONLINE" | 100.0 | "FULLTEXT" | "RELATIONSHIP" | ["REVIEWED", "EMAILED"] | ["message"] | "fulltext-2.0" | NULL | NULL | 0 | 2023-11-01T09:27:57.024Z | {indexConfig: {`fulltext.analyzer`: "standard-no-stop-words", `fulltext.eventually_consistent`: FALSE}} | "" | "CREATE FULLTEXT INDEX `communications` FOR ()-[r:`REVIEWED`|`EMAILED`]-() ON EACH [r.`message`] OPTIONS {indexConfig: {`fulltext.analyzer`: 'standard-no-stop-words',`fulltext.eventually_consistent`: false}}" | +| 5 | "namesAndTeams" | "ONLINE" | 100.0 | "FULLTEXT" | "NODE" | ["Employee", "Manager"] | ["name", "team"] | "fulltext-2.0" | NULL | NULL | 0 | 2023-11-01T12:24:48.002Z | {indexConfig: {`fulltext.analyzer`: "standard-no-stop-words", `fulltext.eventually_consistent`: FALSE}} | "" | "CREATE FULLTEXT INDEX `namesAndTeams` FOR (n:`Employee`|`Manager`) ON EACH [n.`name`, n.`team`] OPTIONS {indexConfig: {`fulltext.analyzer`: 'standard-no-stop-words',`fulltext.eventually_consistent`: false}}" | +| 6 | "peerReviews" | "ONLINE" | 100.0 | "FULLTEXT" | "NODE" | ["Employee", "Manager"] | ["peerReviews"] | "fulltext-2.0" | NULL | NULL | 0 | 2023-11-01T12:25:41.495Z | {indexConfig: {`fulltext.analyzer`: "english", `fulltext.eventually_consistent`: TRUE}} | "" | "CREATE FULLTEXT INDEX `peerReviews` FOR (n:`Employee`|`Manager`) ON EACH [n.`peerReviews`] OPTIONS {indexConfig: {`fulltext.analyzer`: 'english',`fulltext.eventually_consistent`: true}}" | +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ ---- From a0fa067174e96309be31f054556ad5b56a1a2095 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Wed, 27 Aug 2025 13:48:44 +0200 Subject: [PATCH 55/72] allreduce cheat sheet tags update (#1373) --- modules/ROOT/pages/functions/predicate.adoc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/modules/ROOT/pages/functions/predicate.adoc b/modules/ROOT/pages/functions/predicate.adoc index 5c465c2cf..042db6fff 100644 --- a/modules/ROOT/pages/functions/predicate.adoc +++ b/modules/ROOT/pages/functions/predicate.adoc @@ -141,7 +141,7 @@ The below query finds `KNOWS` paths with a length of `3` where the `accumulator` Paths that do not meet this requirement are excluded, such as the path with the sequence `["Keanu Reeves (58)", "Carrie Anne Moss (55)", "Guy Pearce (55)", "Liam Neeson (70)"]` which has an aggregated `age` value of `238`. .Find aggregated ages within a boundary -// tag::functions_predicate_allreduce_boundary[] +// tag::functions_predicate_allreduce[] [source, cypher] ---- MATCH (s) (()-[:KNOWS]-(n)){3} @@ -154,7 +154,7 @@ RETURN [i IN [s] + n | i.name || " (" + toString(i.age) || ")"] AS ageSequence, reduce(acc = 0, node IN [s] + n | acc + node.age) AS aggregatedAges ORDER BY aggregatedAges ---- -// end::functions_predicate_allreduce_boundary[] +// end::functions_predicate_allreduce[] .Result [role="queryresult",options="header,footer",cols="2* Date: Wed, 27 Aug 2025 15:38:00 +0200 Subject: [PATCH 56/72] Bump @neo4j-antora/antora-modify-sitemaps from 0.7.1 to 0.7.2 in the prod-dependencies group (#1372) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the prod-dependencies group with 1 update: @neo4j-antora/antora-modify-sitemaps. Updates `@neo4j-antora/antora-modify-sitemaps` from 0.7.1 to 0.7.2 [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@neo4j-antora/antora-modify-sitemaps&package-manager=npm_and_yarn&previous-version=0.7.1&new-version=0.7.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jens Pryce-Åklundh <112686610+JPryce-Aklundh@users.noreply.github.com> --- package-lock.json | 15 +++++++-------- package.json | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index acdb7aeae..fff7844bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@antora/cli": "^3.1.12", "@antora/site-generator-default": "^3.1.12", "@neo4j-antora/antora-add-notes": "^0.3.2", - "@neo4j-antora/antora-modify-sitemaps": "^0.7.1", + "@neo4j-antora/antora-modify-sitemaps": "^0.7.2", "@neo4j-antora/antora-page-roles": "^0.3.1", "@neo4j-antora/antora-table-footnotes": "^0.3.3", "@neo4j-antora/mark-terms": "1.1.0", @@ -331,10 +331,9 @@ "license": "MIT" }, "node_modules/@neo4j-antora/antora-modify-sitemaps": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@neo4j-antora/antora-modify-sitemaps/-/antora-modify-sitemaps-0.7.1.tgz", - "integrity": "sha512-1XA4mfThu31PFEYvP8emBUruf7AT3C3/kjRv1yiB1NXcHESLM2mhpT64YwPNq6SRSGdWEGwQceSsM+CuHLZCwA==", - "license": "MIT", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@neo4j-antora/antora-modify-sitemaps/-/antora-modify-sitemaps-0.7.2.tgz", + "integrity": "sha512-4PY/dfsiMvsrNmQmgYdED4XE3DevOa1AKuKMMzS5B8X9AKSTnHVxpyznptCoDGFkYCM09OKA2gFiNAyp7pqEaA==", "dependencies": { "semver": "^7.6.3" } @@ -3111,9 +3110,9 @@ "integrity": "sha512-Jsv17dEBELSkqplEIZE9b5I2zjYPvoHi4momLRt1FfBRQnBTWbk4kkf2JQojRJ8mQEVscj2tApfTDOAUtAOSLA==" }, "@neo4j-antora/antora-modify-sitemaps": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@neo4j-antora/antora-modify-sitemaps/-/antora-modify-sitemaps-0.7.1.tgz", - "integrity": "sha512-1XA4mfThu31PFEYvP8emBUruf7AT3C3/kjRv1yiB1NXcHESLM2mhpT64YwPNq6SRSGdWEGwQceSsM+CuHLZCwA==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@neo4j-antora/antora-modify-sitemaps/-/antora-modify-sitemaps-0.7.2.tgz", + "integrity": "sha512-4PY/dfsiMvsrNmQmgYdED4XE3DevOa1AKuKMMzS5B8X9AKSTnHVxpyznptCoDGFkYCM09OKA2gFiNAyp7pqEaA==", "requires": { "semver": "^7.6.3" } diff --git a/package.json b/package.json index de3c926bd..80590fb7e 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "@antora/cli": "^3.1.12", "@antora/site-generator-default": "^3.1.12", "@neo4j-antora/antora-add-notes": "^0.3.2", - "@neo4j-antora/antora-modify-sitemaps": "^0.7.1", + "@neo4j-antora/antora-modify-sitemaps": "^0.7.2", "@neo4j-antora/antora-page-roles": "^0.3.1", "@neo4j-antora/antora-table-footnotes": "^0.3.3", "@neo4j-antora/mark-terms": "1.1.0", From eabe1e2a63bd77bccd1b0897ac5758f124771a92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Thu, 28 Aug 2025 10:05:04 +0200 Subject: [PATCH 57/72] remove duplicate replace tags --- modules/ROOT/pages/functions/string.adoc | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/ROOT/pages/functions/string.adoc b/modules/ROOT/pages/functions/string.adoc index c6e2fa13b..bf38ac11f 100644 --- a/modules/ROOT/pages/functions/string.adoc +++ b/modules/ROOT/pages/functions/string.adoc @@ -365,12 +365,10 @@ RETURN replace("hello", "l", "w") |=== .Query with limit -// tag::functions_string_replace[] [source, cypher, indent=0] ---- RETURN replace("hello", "l", "w", 1) ---- -// end::functions_string_replace[] .Result [role="queryresult",options="header,footer",cols="1* Date: Mon, 1 Sep 2025 09:18:32 +0200 Subject: [PATCH 58/72] Cypher 25 only roles (#1376) --- modules/ROOT/pages/clauses/filter.adoc | 2 +- modules/ROOT/pages/clauses/index.adoc | 4 +- modules/ROOT/pages/clauses/let.adoc | 2 +- modules/ROOT/pages/clauses/match.adoc | 2 +- modules/ROOT/pages/clauses/remove.adoc | 4 +- modules/ROOT/pages/clauses/with.adoc | 2 +- .../expressions/conditional-expressions.adoc | 2 +- modules/ROOT/pages/functions/index.adoc | 8 +- .../functions/mathematical-trigonometric.adoc | 8 +- .../ROOT/pages/introduction/cypher-neo4j.adoc | 2 +- modules/ROOT/pages/patterns/match-modes.adoc | 4 +- modules/ROOT/pages/patterns/reference.adoc | 2 +- .../composed-queries/combined-queries.adoc | 2 +- .../composed-queries/conditional-queries.adoc | 2 +- .../pages/queries/composed-queries/index.adoc | 4 +- .../composed-queries/sequential-queries.adoc | 2 +- modules/ROOT/pages/queries/index.adoc | 4 +- .../ROOT/pages/subqueries/call-subquery.adoc | 2 +- modules/ROOT/pages/subqueries/collect.adoc | 2 +- modules/ROOT/pages/subqueries/count.adoc | 2 +- .../ROOT/pages/subqueries/existential.adoc | 2 +- package-lock.json | 232 ++++++++++++++++++ package.json | 1 + preview.yml | 4 + publish.yml | 4 + 25 files changed, 273 insertions(+), 32 deletions(-) diff --git a/modules/ROOT/pages/clauses/filter.adoc b/modules/ROOT/pages/clauses/filter.adoc index b51017673..7c8bc39f9 100644 --- a/modules/ROOT/pages/clauses/filter.adoc +++ b/modules/ROOT/pages/clauses/filter.adoc @@ -1,7 +1,7 @@ = FILTER :description: Information about Cypher's `FILTER` clause. :table-caption!: -:page-role: new-2025.06 +:page-role: new-neo4j-2025.06 cypher-25-only `FILTER` is used to add filters to queries, similar to Cypher's xref:clauses/where.adoc[`WHERE`]. Unlike `WHERE`, `FILTER` is not a subclause, which means it can be used independently of the xref:clauses/match.adoc[`MATCH`], xref:clauses/optional-match.adoc[`OPTIONAL MATCH`], and xref:clauses/with.adoc[`WITH`] clauses, but not within them. diff --git a/modules/ROOT/pages/clauses/index.adoc b/modules/ROOT/pages/clauses/index.adoc index d0930a5b9..cb62f13f4 100644 --- a/modules/ROOT/pages/clauses/index.adoc +++ b/modules/ROOT/pages/clauses/index.adoc @@ -20,7 +20,7 @@ This set is refined and augmented by subsequent parts of the query. m| xref::clauses/filter.adoc[FILTER] | Adds filters to queries. -label:new[Introduced in Neo4j 2025.06] +label:cypher[Cypher 25 only] label:new[Introduced in Neo4j 2025.06] m| xref::clauses/match.adoc[MATCH] | Specify the patterns to search for in the database. @@ -45,7 +45,7 @@ m| xref::clauses/finish.adoc[FINISH] m| xref::clauses/let.adoc[LET] | Binds values to variables. -label:new[Introduced in Neo4j 2025.06] + label:cypher[Cypher 25 only] label:new[Introduced in Neo4j 2025.06] m| xref::clauses/return.adoc[RETURN ... [AS]] | Defines what to include in the query result set. diff --git a/modules/ROOT/pages/clauses/let.adoc b/modules/ROOT/pages/clauses/let.adoc index 3a6398f53..0c707f538 100644 --- a/modules/ROOT/pages/clauses/let.adoc +++ b/modules/ROOT/pages/clauses/let.adoc @@ -1,7 +1,7 @@ = LET :description: Information about Cypher's `LET` clause. :table-caption!: -:page-role: new-2025.06 +:page-role: new-neo4j-2025.06 cypher-25-only `LET` binds expressions to variables. For queries involving several chained expressions, it can be a more succinct and readable alternative to xref:clauses/with.adoc[`WITH`]. diff --git a/modules/ROOT/pages/clauses/match.adoc b/modules/ROOT/pages/clauses/match.adoc index ad6f5aba7..6304b38e3 100644 --- a/modules/ROOT/pages/clauses/match.adoc +++ b/modules/ROOT/pages/clauses/match.adoc @@ -494,7 +494,7 @@ RETURN actors.name AS actor, movieCount, collect(movies.title) AS movies <1> The `Person` and `Movie` nodes matched in this step are stored in variables, which are then passed on to the second row of the query. <2> The `movies` variable is implicitly imported by its occurrence in the `count()` function. The `WITH` clause explicitly imports the `actors` variable. -<3> An xref:clauses/order-by.adoc[`ORDER BY`] clause orders the results by `movieCount` in descending order, ensuring that the `Person` with the highest number of movies appears at the top, and xref:clauses/limit.adoc[`LIMIT] 1` ensures that all other `Person` nodes are discarded. +<3> An xref:clauses/order-by.adoc[`ORDER BY`] clause orders the results by `movieCount` in descending order, ensuring that the `Person` with the highest number of movies appears at the top, and xref:clauses/limit.adoc[`LIMIT`] `1` ensures that all other `Person` nodes are discarded. <4> The second `MATCH` clause finds all `Movie` nodes associated with the `Person` nodes currently bound to the `actors` variable. [NOTE] diff --git a/modules/ROOT/pages/clauses/remove.adoc b/modules/ROOT/pages/clauses/remove.adoc index dca91d959..066d6cd05 100644 --- a/modules/ROOT/pages/clauses/remove.adoc +++ b/modules/ROOT/pages/clauses/remove.adoc @@ -66,7 +66,7 @@ Properties set: 1 == Remove all properties `REMOVE` cannot be used to remove all existing properties from a node or relationship. -Instead, using xref::clauses/set.adoc#set-remove-properties-using-empty-map[`SET` with `=` and an empty map as the right operand] will clear all properties from the node or relationship. +Instead, using xref::clauses/set.adoc#set-remove-properties-using-empty-map[`SET`] with `=` and an empty map as the right operand will clear all properties from the node or relationship. [[dynamic-remove-property]] == Dynamically remove a property @@ -152,7 +152,7 @@ REMOVE n:$(label) RETURN n.name, labels(n) ---- -<1> xref:clauses/unwind.adoc[`UNWIND`] is used here to transform the list of labels from the xref:functions/list.adoc#functions-labels[`labels()]` function into separate rows, allowing subsequent operations to be performed on each label individually. +<1> xref:clauses/unwind.adoc[`UNWIND`] is used here to transform the list of labels from the xref:functions/list.adoc#functions-labels[`labels()`] function into separate rows, allowing subsequent operations to be performed on each label individually. .Result [role="queryresult",options="header,footer",cols="2*+`, `+<+`, `+>+`, `+<=+`, `+>=+` -* xref:expressions/predicates/comparison-operators.adoc[`IS [NOT] NULL`] +* xref:expressions/predicates/comparison-operators.adoc[`IS [NOT\] NULL`] * xref:expressions/predicates/type-predicate-expressions.adoc[Type predicate expressions]: `IS [NOT] TYPED ` (Note that the form `IS [NOT] :: ` is not accepted) * xref:expressions/predicates/string-operators.adoc[Normalization Predicate Expression]: `IS [NOT] NORMALIZED` * xref:expressions/predicates/string-operators.adoc[String Comparison Operators]: `STARTS WITH`, `ENDS WITH`, `=~` (regex matching) diff --git a/modules/ROOT/pages/functions/index.adoc b/modules/ROOT/pages/functions/index.adoc index c800083f3..7ac0eb4c6 100644 --- a/modules/ROOT/pages/functions/index.adoc +++ b/modules/ROOT/pages/functions/index.adoc @@ -313,7 +313,7 @@ All trigonometric functions operate on radians, unless otherwise specified. 1.1+| xref::functions/mathematical-trigonometric.adoc#functions-cosh[`cosh()`] | `cosh(input :: FLOAT) :: FLOAT` | Returns the hyperbolic cosine of a `FLOAT`. -label:new[Introduced in Neo4j 2025.06] +label:cypher[Cypher 25 only] label:new[Introduced in Neo4j 2025.06] 1.1+| xref::functions/mathematical-trigonometric.adoc#functions-cot[`cot()`] | `cot(input :: FLOAT) :: FLOAT` @@ -322,7 +322,7 @@ label:new[Introduced in Neo4j 2025.06] 1.1+| xref::functions/mathematical-trigonometric.adoc#functions-coth[`coth()`] | `coth(input :: FLOAT) :: FLOAT` | Returns the hyperbolic cotangent of a `FLOAT`. -label:new[Introduced in Neo4j 2025.06] +label:cypher[Cypher 25 only] label:new[Introduced in Neo4j 2025.06] 1.1+| xref::functions/mathematical-trigonometric.adoc#functions-degrees[`degrees()`] | `degrees(input :: FLOAT) :: FLOAT` @@ -347,7 +347,7 @@ label:new[Introduced in Neo4j 2025.06] 1.1+| xref::functions/mathematical-trigonometric.adoc#functions-sinh[`sinh()`] | `sinh(input :: FLOAT) :: FLOAT` | Returns the hyperbolic sine of a `FLOAT`. - label:new[Introduced in Neo4j 2025.06] +label:cypher[Cypher 25 only] label:new[Introduced in Neo4j 2025.06] 1.1+| xref::functions/mathematical-trigonometric.adoc#functions-tan[`tan()`] | `tan(input :: FLOAT) :: FLOAT` @@ -356,7 +356,7 @@ label:new[Introduced in Neo4j 2025.06] 1.1+| xref::functions/mathematical-trigonometric.adoc#functions-tanh[`tanh()`] | `tanh(input :: FLOAT) :: FLOAT` | Returns the hyperbolic tangent of a `FLOAT`. -label:new[Introduced in Neo4j 2025.06] +label:cypher[Cypher 25 only] label:new[Introduced in Neo4j 2025.06] |=== diff --git a/modules/ROOT/pages/functions/mathematical-trigonometric.adoc b/modules/ROOT/pages/functions/mathematical-trigonometric.adoc index 5eef50ec3..9a5c12049 100644 --- a/modules/ROOT/pages/functions/mathematical-trigonometric.adoc +++ b/modules/ROOT/pages/functions/mathematical-trigonometric.adoc @@ -234,7 +234,7 @@ The cosine of `0.5` is returned. ====== -[role=label--new-2025.06] +[role=label--new-Neo4j-2025.06 label--cypher-25-only] [[functions-cosh]] == cosh() @@ -327,7 +327,7 @@ The cotangent of `0.5` is returned. ====== -[role=label--new-2025.06] +[role=label--new-Neo4j-2025.06 label--cypher-25-only] [[functions-coth]] == coth() @@ -629,7 +629,7 @@ The sine of `0.5` is returned. ====== -[role=label--new-2025.06] +[role=label--new-Neo4j-2025.06 label--cypher-25-only] [[functions-sinh]] == sinh() @@ -723,7 +723,7 @@ The tangent of `0.5` is returned. -[role=label--new-2025.06] +[role=label--new-Neo4j-2025.06 label--cypher-25-only] [[functions-tanh]] == tanh() diff --git a/modules/ROOT/pages/introduction/cypher-neo4j.adoc b/modules/ROOT/pages/introduction/cypher-neo4j.adoc index a424318eb..90b7dd14d 100644 --- a/modules/ROOT/pages/introduction/cypher-neo4j.adoc +++ b/modules/ROOT/pages/introduction/cypher-neo4j.adoc @@ -52,7 +52,7 @@ Only xref::planning-and-tuning/runtimes/concepts.adoc#runtimes-slotted-runtime[s [NOTE] The `system` database cannot be deleted. The default user database, `neo4j`, can be deleted. -If you want to delete it, first set another database as the default using the procedure link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_dbms_setDefaultDatabase[`dbms.setDefaultDatabase]` (this must be done from the `system` database). +If you want to delete it, first set another database as the default using the procedure link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_dbms_setDefaultDatabase[`dbms.setDefaultDatabase`] (this must be done from the `system` database). For more information, see the link:{neo4j-docs-base-uri}/operations-manual/current/clustering/databases/#cluster-default-database[Operations Manual -> Change the default database]. diff --git a/modules/ROOT/pages/patterns/match-modes.adoc b/modules/ROOT/pages/patterns/match-modes.adoc index 45383a142..2671a1d5f 100644 --- a/modules/ROOT/pages/patterns/match-modes.adoc +++ b/modules/ROOT/pages/patterns/match-modes.adoc @@ -9,7 +9,7 @@ Cypher supports two match modes: The same restriction does not hold for nodes, which may be re-traversed any number of times in a matched path. This is Cypher’s default match mode, applicable to most use cases. * xref:patterns/match-modes.adoc#repeatable-elements[`REPEATABLE ELEMENTS`]: no restrictions on how often nodes and relationships can be traversed in a match for a graph pattern. -This match mode is required in order for paths to be able to traverse a relationship more than once. label:new[Introduced in Neo4j 2025.06] +This match mode is required in order for paths to be able to traverse a relationship more than once. label:cypher[Cypher 25 only] label:new[Introduced in Neo4j 2025.06] [[example-graph]] == Example graph @@ -141,7 +141,7 @@ This reflects the conclusion of Euler’s Seven bridges of Königsberg problem: For more information about this match mode, see xref:patterns/reference.adoc#match-modes-rules-different-relationships[Syntax & semantics -> `DIFFERENT RELATIONSHIPS`]. -[role=label--new-2025.06] +[role=label--new-Neo4j-2025.06 label--cypher-25-only] [[repeatable-elements]] == REPEATABLE ELEMENTS diff --git a/modules/ROOT/pages/patterns/reference.adoc b/modules/ROOT/pages/patterns/reference.adoc index a5009cfe8..c4d358e3e 100644 --- a/modules/ROOT/pages/patterns/reference.adoc +++ b/modules/ROOT/pages/patterns/reference.adoc @@ -1637,7 +1637,7 @@ MATCH ()-[r]->()-->(), ()-[r]-() A match mode specifies whether or not a relationship can be matched more than once when matching graph patterns. Cypher contains two match modes: * xref:patterns/reference.adoc#match-modes-rules-different-relationships[`DIFFERENT RELATIONSHIPS`] (default) -* xref:patterns/reference.adoc#match-modes-rules-repeatable-elements[`REPEATABLE ELEMENTS`] label:new[Introduced in Neo4j 2025.06] +* xref:patterns/reference.adoc#match-modes-rules-repeatable-elements[`REPEATABLE ELEMENTS`] label:cypher[Cypher 25 only] label:new[Introduced in Neo4j 2025.06] [[match-modes-syntax]] === Syntax diff --git a/modules/ROOT/pages/queries/composed-queries/combined-queries.adoc b/modules/ROOT/pages/queries/composed-queries/combined-queries.adoc index a85b6ac76..32c488cef 100644 --- a/modules/ROOT/pages/queries/composed-queries/combined-queries.adoc +++ b/modules/ROOT/pages/queries/composed-queries/combined-queries.adoc @@ -164,7 +164,7 @@ ORDER BY count For more information, see xref:subqueries/call-subquery.adoc#call-post-union[`CALL` subqueries -> Post-union processing]. -[role=label--new-2025.06] +[role=label--new-Neo4j-2025.06 label--cypher-25-only] [[combining-union-and-union-all]] == Combining UNION and UNION ALL diff --git a/modules/ROOT/pages/queries/composed-queries/conditional-queries.adoc b/modules/ROOT/pages/queries/composed-queries/conditional-queries.adoc index 00e9ad836..e804442fb 100644 --- a/modules/ROOT/pages/queries/composed-queries/conditional-queries.adoc +++ b/modules/ROOT/pages/queries/composed-queries/conditional-queries.adoc @@ -1,6 +1,6 @@ = Conditional queries (`WHEN`) :description: Information about how to use `WHEN` to construct conditional queries in Cypher. -:page-role: new-2025.06 +:page-role: new-neo4j-2025.06 cypher-25-only `WHEN`, together with `THEN` and `ELSE`, enables different branches of a query to execute based on certain conditions. In this way, it performs similar a control-flow mechanism to the `IF` statement in other programming languages. diff --git a/modules/ROOT/pages/queries/composed-queries/index.adoc b/modules/ROOT/pages/queries/composed-queries/index.adoc index fc74dbb97..a6091fb48 100644 --- a/modules/ROOT/pages/queries/composed-queries/index.adoc +++ b/modules/ROOT/pages/queries/composed-queries/index.adoc @@ -10,5 +10,5 @@ As such, `UNION`, `WHEN`, and `NEXT` manage in different ways the execution flow For more information, see: * xref:queries/composed-queries/combined-queries.adoc[] -* xref:queries/composed-queries/conditional-queries.adoc[] label:new[Introduced in Neo4j 2025.06] -* xref:queries/composed-queries/sequential-queries.adoc[] label:new[Introduced in Neo4j 2025.06] +* xref:queries/composed-queries/conditional-queries.adoc[] label:cypher[Cypher 25 only] label:new[Introduced in Neo4j 2025.06] +* xref:queries/composed-queries/sequential-queries.adoc[] label:cypher[Cypher 25 only] label:new[Introduced in Neo4j 2025.06] diff --git a/modules/ROOT/pages/queries/composed-queries/sequential-queries.adoc b/modules/ROOT/pages/queries/composed-queries/sequential-queries.adoc index 7a1265c13..227442929 100644 --- a/modules/ROOT/pages/queries/composed-queries/sequential-queries.adoc +++ b/modules/ROOT/pages/queries/composed-queries/sequential-queries.adoc @@ -1,7 +1,7 @@ = Sequential queries (`NEXT`) :description: Information about how to use `NEXT` to construct sequential queries in Cypher. :table-caption!: -:page-role: new-2025.06 +:page-role: new-neo4j-2025.06 cypher-25-only `NEXT` allows for linear composition of queries into a sequence of smaller, self-contained segments, passing the whole table of intermediate results from one segment to the next. diff --git a/modules/ROOT/pages/queries/index.adoc b/modules/ROOT/pages/queries/index.adoc index 85d6c36c5..ad9ca3b1e 100644 --- a/modules/ROOT/pages/queries/index.adoc +++ b/modules/ROOT/pages/queries/index.adoc @@ -9,6 +9,6 @@ It also explains how to select the version of Cypher in which queries are run, a * xref:queries/select-version.adoc[] label:new[Introduced in Neo4j 2025.06] * xref:queries/composed-queries/index.adoc[] ** xref:queries/composed-queries/combined-queries.adoc[] -** xref:queries/composed-queries/conditional-queries.adoc[] label:new[Introduced in Neo4j 2025.06] -** xref:queries/composed-queries/sequential-queries.adoc[] label:new[Introduced in Neo4j 2025.06] +** xref:queries/composed-queries/conditional-queries.adoc[] label:cypher[Cypher 25 only] label:new[Introduced in Neo4j 2025.06] +** xref:queries/composed-queries/sequential-queries.adoc[] label:cypher[Cypher 25 only] label:new[Introduced in Neo4j 2025.06] diff --git a/modules/ROOT/pages/subqueries/call-subquery.adoc b/modules/ROOT/pages/subqueries/call-subquery.adoc index fda792899..5d95e45fb 100644 --- a/modules/ROOT/pages/subqueries/call-subquery.adoc +++ b/modules/ROOT/pages/subqueries/call-subquery.adoc @@ -492,7 +492,7 @@ Now all `Player` nodes, regardless of whether they have any `PLAYS_FOR` relation ==== -[role=label--new-2025.06] +[role=label--new-Neo4j-2025.06 label--cypher-25-only] [[conditional-call]] == Conditional `CALL` subqueries diff --git a/modules/ROOT/pages/subqueries/collect.adoc b/modules/ROOT/pages/subqueries/collect.adoc index 7344fc40a..16dac0693 100644 --- a/modules/ROOT/pages/subqueries/collect.adoc +++ b/modules/ROOT/pages/subqueries/collect.adoc @@ -74,7 +74,7 @@ RETURN person.name as name, COLLECT { 2+d|Rows: 3 |=== -[role=label--new-2025.06] +[role=label--new-Neo4j-2025.06 label--cypher-25-only] [[conditional-collect]] == Conditional `COLLECT` subquery diff --git a/modules/ROOT/pages/subqueries/count.adoc b/modules/ROOT/pages/subqueries/count.adoc index 1708df583..9e2aa74c3 100644 --- a/modules/ROOT/pages/subqueries/count.adoc +++ b/modules/ROOT/pages/subqueries/count.adoc @@ -71,7 +71,7 @@ RETURN person.name AS name 1+d|Rows: 1 |=== -[role=label--new-2025.06] +[role=label--new-Neo4j-2025.06 label--cypher-25-only] [[conditional-count]] == Conditional `COUNT` subquery diff --git a/modules/ROOT/pages/subqueries/existential.adoc b/modules/ROOT/pages/subqueries/existential.adoc index 1c675ca5b..0d404d695 100644 --- a/modules/ROOT/pages/subqueries/existential.adoc +++ b/modules/ROOT/pages/subqueries/existential.adoc @@ -73,7 +73,7 @@ RETURN person.name AS name 1+d|Rows: 1 |=== -[role=label--new-2025.06] +[role=label--new-Neo4j-2025.06 label--cypher-25-only] [[conditional-exists]] == Conditional `EXISTS` subqueries diff --git a/package-lock.json b/package-lock.json index fff7844bb..1202516b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "@neo4j-antora/antora-page-roles": "^0.3.1", "@neo4j-antora/antora-table-footnotes": "^0.3.3", "@neo4j-antora/mark-terms": "1.1.0", + "@neo4j-antora/roles-labels": "^0.1.2", "@neo4j-documentation/macros": "^1.0.4", "@neo4j-documentation/remote-include": "^1.0.0", "asciidoctor-kroki": "^0.18.1" @@ -357,6 +358,15 @@ "resolved": "https://registry.npmjs.org/@neo4j-antora/mark-terms/-/mark-terms-1.1.0.tgz", "integrity": "sha512-Cd/ZxJa0gKIGQZCgIg0td2vSYeLz30/31fBxJNeOmDQzUPqduOYRVx/C7uK0y0SI38APBr11LyeDhyQIU0wtGw==" }, + "node_modules/@neo4j-antora/roles-labels": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@neo4j-antora/roles-labels/-/roles-labels-0.1.2.tgz", + "integrity": "sha512-ruMZvGRxD3WyFVK/GaAO7gmNnU9zHuzfSbRpCMFJTasv78qRInn1np6WmTHZPbqynBWD3uYkh4pzIutBdJ8WFg==", + "license": "MIT", + "dependencies": { + "node-html-parser": "^7.0.0" + } + }, "node_modules/@neo4j-documentation/macros": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@neo4j-documentation/macros/-/macros-1.0.4.tgz", @@ -601,6 +611,12 @@ "node": ">=18" } }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -855,6 +871,34 @@ "node": ">=0.8" } }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/dateformat": { "version": "4.6.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", @@ -926,6 +970,61 @@ "resolved": "https://registry.npmjs.org/diff3/-/diff3-0.0.3.tgz", "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==" }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -965,6 +1064,18 @@ "once": "^1.4.0" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -1384,6 +1495,15 @@ "node": ">= 0.4" } }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, "node_modules/help-me": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", @@ -1786,6 +1906,16 @@ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, + "node_modules/node-html-parser": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-7.0.1.tgz", + "integrity": "sha512-KGtmPY2kS0thCWGK0VuPyOS+pBKhhe8gXztzA2ilAOhbUbxa9homF1bOyKvhGzMLXUoRds9IOmr/v5lr/lqNmA==", + "license": "MIT", + "dependencies": { + "css-select": "^5.1.0", + "he": "1.2.0" + } + }, "node_modules/nodemon": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", @@ -1839,6 +1969,18 @@ "node": ">=0.10.0" } }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -3133,6 +3275,14 @@ "resolved": "https://registry.npmjs.org/@neo4j-antora/mark-terms/-/mark-terms-1.1.0.tgz", "integrity": "sha512-Cd/ZxJa0gKIGQZCgIg0td2vSYeLz30/31fBxJNeOmDQzUPqduOYRVx/C7uK0y0SI38APBr11LyeDhyQIU0wtGw==" }, + "@neo4j-antora/roles-labels": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@neo4j-antora/roles-labels/-/roles-labels-0.1.2.tgz", + "integrity": "sha512-ruMZvGRxD3WyFVK/GaAO7gmNnU9zHuzfSbRpCMFJTasv78qRInn1np6WmTHZPbqynBWD3uYkh4pzIutBdJ8WFg==", + "requires": { + "node-html-parser": "^7.0.0" + } + }, "@neo4j-documentation/macros": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@neo4j-documentation/macros/-/macros-1.0.4.tgz", @@ -3312,6 +3462,11 @@ "type-is": "^2.0.0" } }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -3479,6 +3634,23 @@ "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" }, + "css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==" + }, "dateformat": { "version": "4.6.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", @@ -3522,6 +3694,39 @@ "resolved": "https://registry.npmjs.org/diff3/-/diff3-0.0.3.tgz", "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==" }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + } + }, "dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -3552,6 +3757,11 @@ "once": "^1.4.0" } }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + }, "es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -3842,6 +4052,11 @@ "function-bind": "^1.1.2" } }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, "help-me": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", @@ -4115,6 +4330,15 @@ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, + "node-html-parser": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-7.0.1.tgz", + "integrity": "sha512-KGtmPY2kS0thCWGK0VuPyOS+pBKhhe8gXztzA2ilAOhbUbxa9homF1bOyKvhGzMLXUoRds9IOmr/v5lr/lqNmA==", + "requires": { + "css-select": "^5.1.0", + "he": "1.2.0" + } + }, "nodemon": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", @@ -4148,6 +4372,14 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "requires": { + "boolbase": "^1.0.0" + } + }, "object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", diff --git a/package.json b/package.json index 80590fb7e..84f38b499 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "@neo4j-antora/antora-page-roles": "^0.3.1", "@neo4j-antora/antora-table-footnotes": "^0.3.3", "@neo4j-antora/mark-terms": "1.1.0", + "@neo4j-antora/roles-labels": "^0.1.2", "@neo4j-documentation/macros": "^1.0.4", "@neo4j-documentation/remote-include": "^1.0.0", "asciidoctor-kroki": "^0.18.1" diff --git a/preview.yml b/preview.yml index 389d0ef01..38927ba19 100644 --- a/preview.yml +++ b/preview.yml @@ -22,6 +22,10 @@ ui: urls: html_extension_style: indexify +antora: + extensions: + - "@neo4j-antora/roles-labels" + asciidoc: extensions: - "@neo4j-documentation/remote-include" diff --git a/publish.yml b/publish.yml index 9da9ddb55..9bb6f80cc 100644 --- a/publish.yml +++ b/publish.yml @@ -22,6 +22,10 @@ ui: urls: html_extension_style: indexify +antora: + extensions: + - "@neo4j-antora/roles-labels" + asciidoc: extensions: - "@neo4j-documentation/remote-include" From 0f51f03aa26fbfc97bad878d862f5e7b26634342 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Mon, 1 Sep 2025 09:27:08 +0200 Subject: [PATCH 59/72] allReduce Cypher 25 label --- modules/ROOT/pages/functions/index.adoc | 2 +- modules/ROOT/pages/functions/predicate.adoc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/functions/index.adoc b/modules/ROOT/pages/functions/index.adoc index 7ac0eb4c6..a72524852 100644 --- a/modules/ROOT/pages/functions/index.adoc +++ b/modules/ROOT/pages/functions/index.adoc @@ -377,7 +377,7 @@ These functions return either true or false for the given arguments. 1.1+| xref::functions/predicate.adoc#functions-allreduce[`allReduce()`] | `allReduce(accumulator = initial, stepVariable IN list \| reductionFunction, predicate) :: BOOLEAN` | Returns true if, during the stepwise evaluation of a value across the elements in a given `LIST`, the accumulated result satisfies a specified predicate at every step. -Where that list is a group variable defined in a quantified path pattern, it allows for the early pruning of paths that do not satisfy the predicate. label:new[Introduced in Neo4j 2025.08] +Where that list is a group variable defined in a quantified path pattern, it allows for the early pruning of paths that do not satisfy the predicate. label:cypher[Cypher 25 only] label:new[Introduced in Neo4j 2025.08] 1.1+| xref::functions/predicate.adoc#functions-any[`any()`] | `any(variable :: ANY, list :: LIST, predicate :: ANY) :: BOOLEAN` diff --git a/modules/ROOT/pages/functions/predicate.adoc b/modules/ROOT/pages/functions/predicate.adoc index 042db6fff..5786177fc 100644 --- a/modules/ROOT/pages/functions/predicate.adoc +++ b/modules/ROOT/pages/functions/predicate.adoc @@ -103,7 +103,7 @@ RETURN all(i in emptyList WHERE true) as allTrue, all(i in emptyList WHERE false ====== [[functions-allreduce]] -[role=label--new-2025.08] +[role=label--new-2025.08 label--cypher-25-only] == allReduce() .Details From c572c20197ab86d6a0beeb968b9489dbc73cce03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Mon, 1 Sep 2025 09:29:24 +0200 Subject: [PATCH 60/72] different relationships keyword only cypher 25 --- modules/ROOT/pages/patterns/match-modes.adoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/patterns/match-modes.adoc b/modules/ROOT/pages/patterns/match-modes.adoc index 2671a1d5f..15f13b48c 100644 --- a/modules/ROOT/pages/patterns/match-modes.adoc +++ b/modules/ROOT/pages/patterns/match-modes.adoc @@ -47,7 +47,8 @@ As such, `DIFFERENT RELATIONSHIPS` is ideal to showcase the Königsberg bridges That is, if no match mode is specified, Cypher will default to solving graph patterns according to the restrictions imposed by `DIFFERENT RELATIONSHIPS`. [NOTE] -The `DIFFERENT RELATIONSHIPS` keyword was released in Neo4j 2025.06 and can be used to explicitly specify Cypher's default match mode after `MATCH`. +The `DIFFERENT RELATIONSHIPS` keyword was released in Neo4j 2025.06. +It is only available in Cypher 25 and can be used to explicitly specify Cypher's default match mode after `MATCH`. For example, `MATCH DIFFERENT RELATIONSHIPS p = (start)--{,2}(end)`. This is functionally equivalent to not specifying a match mode. From 5219e97d2e7c15c274d596ea8ea35ad5a8253fad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Mon, 1 Sep 2025 09:34:24 +0200 Subject: [PATCH 61/72] More Cypher 25 only labels --- modules/ROOT/pages/patterns/reference.adoc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/patterns/reference.adoc b/modules/ROOT/pages/patterns/reference.adoc index c4d358e3e..05e0040dc 100644 --- a/modules/ROOT/pages/patterns/reference.adoc +++ b/modules/ROOT/pages/patterns/reference.adoc @@ -1674,7 +1674,8 @@ MATCH (a)-[r]-(b)-[f]-(c)-[r]-(d) // r repeated twice MATCH (a)-[r]-(b), (c)-[r]-(d) // r repeated twice ---- -The `DIFFERENT RELATIONSHIPS` keyword was released in Neo4j 2025.06 and can be used to explicitly specify Cypher's default match mode after `MATCH`. +The `DIFFERENT RELATIONSHIPS` keyword was released in Neo4j 2025.06. +It is only available in Cypher 25 and can be used to explicitly specify Cypher's default match mode after `MATCH`. Specifying the `DIFFERENT RELATIONSHIPS` keyword is functionally equivalent to not specifying a match mode. For example, the following two `MATCH` clauses are equivalent: @@ -1684,6 +1685,7 @@ MATCH (a)--{2}(b) MATCH DIFFERENT RELATIONSHIPS (a)--{2}(b) ---- +[role=label--new-Neo4j-2025.06 label--cypher-25-only] [[match-modes-rules-repeatable-elements]] ==== REPEATABLE ELEMENTS From 903f13aac977952018eaae135123479c80591ced Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Tue, 2 Sep 2025 14:29:44 +0200 Subject: [PATCH 62/72] update antora for 2025.09 (#1379) --- antora.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/antora.yml b/antora.yml index 77f6d79a0..cb40025f0 100644 --- a/antora.yml +++ b/antora.yml @@ -7,4 +7,4 @@ nav: - modules/ROOT/content-nav.adoc asciidoc: attributes: - neo4j-version: '2025.08' + neo4j-version: '2025.09' From d1bf0106379963526d5744b81fd6230dc1b83985 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Wed, 3 Sep 2025 10:26:28 +0200 Subject: [PATCH 63/72] allReduce to additional Cypher GQL appendix page (#1381) --- .../pages/appendix/gql-conformance/additional-cypher.adoc | 4 ++++ modules/ROOT/pages/appendix/gql-conformance/index.adoc | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/appendix/gql-conformance/additional-cypher.adoc b/modules/ROOT/pages/appendix/gql-conformance/additional-cypher.adoc index 20fe2793b..a30d4fbbd 100644 --- a/modules/ROOT/pages/appendix/gql-conformance/additional-cypher.adoc +++ b/modules/ROOT/pages/appendix/gql-conformance/additional-cypher.adoc @@ -330,6 +330,10 @@ It is only supported in the xref:clauses/use.adoc[`USE`] clause. | xref:functions/predicate.adoc#functions-all[`all()`] | Returns true if the predicate holds for all elements in the given `LIST`. +| xref:functions/predicate.adoc#functions-allreduce[`allReduce()`] +| Returns true if, during the stepwise evaluation of a value across the elements in a given `LIST`, the accumulated result satisfies a specified predicate at every step. +Where that list is a group variable defined in a quantified path pattern, it allows for the early pruning of paths that do not satisfy the predicate. + | xref:functions/predicate.adoc#functions-any[`any()`] | Returns true if the predicate holds for at least one element in the given `LIST`. diff --git a/modules/ROOT/pages/appendix/gql-conformance/index.adoc b/modules/ROOT/pages/appendix/gql-conformance/index.adoc index 718d85745..9b1fa55d7 100644 --- a/modules/ROOT/pages/appendix/gql-conformance/index.adoc +++ b/modules/ROOT/pages/appendix/gql-conformance/index.adoc @@ -1,8 +1,8 @@ :description: Overview of Cypher's conformance to GQL. = GQL conformance -*Last updated*: 18 June 2025 + -*Neo4j version*: 2025.06 +*Last updated*: 2 September 2025 + +*Neo4j version*: 2025.08 GQL is the new link:https://www.iso.org/home.html[ISO] International Standard query language for graph databases. From cb62af26f739e8c53b982ae8d48d6709b26fbcaa Mon Sep 17 00:00:00 2001 From: Pontus Melke Date: Wed, 3 Sep 2025 10:59:12 +0200 Subject: [PATCH 64/72] Add documentation for new LockNodes operator (#1375) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jens Pryce-Åklundh <112686610+JPryce-Aklundh@users.noreply.github.com> --- ...ions-additions-removals-compatibility.adoc | 20 +++++ .../planning-and-tuning/operators/index.adoc | 7 ++ .../operators/operators-detail.adoc | 77 +++++++++++++++++++ 3 files changed, 104 insertions(+) diff --git a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc index 572c68093..a72a07534 100644 --- a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc +++ b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc @@ -22,6 +22,26 @@ Cypher 25 was introduced in Neo4j 2025.06 and can only be used on Neo4j 2025.06+ Features removed in Cypher 25 are still available on Neo4j 2025.06+ databases either by prepending a query with `CYPHER 5` or by having Cypher 5 as the default language for the database. For more information, see xref:queries/select-version.adoc[]. +[[cypher-deprecations-additions-removals-2025.09]] +== Neo4j 2025.09 + +=== New in Cypher 25 + +[cols="2", options="header"] +|=== +| Feature +| Details + +a| +label:functionality[] +label:new[] + +New operator: `LockNodes` + + +a| Introduced xref::planning-and-tuning/operators/operators-detail.adoc#query-plan-lock-nodes[`LockNodes`] operator, sometimes used in conjunction with the `LockingMerge` operator to lock nodes. +|=== + [[cypher-deprecations-additions-removals-2025.08]] == Neo4j 2025.08 diff --git a/modules/ROOT/pages/planning-and-tuning/operators/index.adoc b/modules/ROOT/pages/planning-and-tuning/operators/index.adoc index dcc7a393b..146bfb5b8 100644 --- a/modules/ROOT/pages/planning-and-tuning/operators/index.adoc +++ b/modules/ROOT/pages/planning-and-tuning/operators/index.adoc @@ -345,6 +345,13 @@ Tests for the presence of a pattern predicate in queries containing multiple pat | | +| xref::planning-and-tuning/operators/operators-detail.adoc#query-plan-lock-nodes[LockNodes] +| Sometimes used in conjunction with the xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-locking-merge[`LockingMerge`] operator to lock nodes. +| +| +| label:new[Introduced in Neo4j 2025.09] + + | xref::planning-and-tuning/operators/operators-detail.adoc#query-plan-merge[Merge] | The `Merge` operator will either read or create nodes and/or relationships. | diff --git a/modules/ROOT/pages/planning-and-tuning/operators/operators-detail.adoc b/modules/ROOT/pages/planning-and-tuning/operators/operators-detail.adoc index b04716780..a656bb82d 100644 --- a/modules/ROOT/pages/planning-and-tuning/operators/operators-detail.adoc +++ b/modules/ROOT/pages/planning-and-tuning/operators/operators-detail.adoc @@ -6059,6 +6059,83 @@ Total database accesses: 15, total allocated memory: 2232 ====== +[role=label--new-2025.09] +[[query-plan-lock-nodes]] +=== Lock Nodes + +The `LockNodes` operator is sometimes used in conjunction with the xref:planning-and-tuning/operators/operators-detail.adoc#query-plan-locking-merge[`LockingMerge`] operator to lock nodes. + + +.LockNodes +====== + +.Query +[source, cypher] +---- +PROFILE +MATCH (s:Person {name: 'me'}) +MERGE (s)-[:FRIENDS_WITH]->(t:Person {size: size([()-->()|1])}) +---- + +.Query Plan +[role="queryplan", subs="attributes+"] +---- +Planner COST + +Runtime PIPELINED + +Runtime version DEV + +Batch size 4 + ++----------------------------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ +| Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | ++----------------------------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ +| +ProduceResults | 0 | | 1 | 0 | 0 | 0 | 0/0 | 0.018 | | +| | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+ | +| +EmptyResult | 1 | | 1 | 0 | 0 | | 0/0 | 0.016 | In Pipeline 7 | +| | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ +| +Apply | 2 | | 1 | 0 | 0 | | 0/0 | | | +| |\ +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ +| | +ArgumentTracker | 19 | | 1 | 0 | 0 | 240 | 0/0 | 0.000 | | +| | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+ | +| | +LockingMerge | 3 | CREATE (t:Person {size: COUNT { MATCH (`anon_2`)-[`anon_3`]->(`anon_4`) RETURN $`autoint_1` AS ` | 1 | 1 | 3 | 400 | 0/0 | 15.340 | In Pipeline 7 | +| | | | | anon_0` }}), (s)-[anon_1:FRIENDS_WITH]->(t), LOCK(s) | | | | | | | | +| | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ +| | +AntiConditionalApply | 18 | | | 0 | 0 | 384 | | 0.010 | In Pipeline 6 | +| | |\ +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ +| | | +Filter | 17 | t.size = anon_5 AND t:Person | 0 | 0 | 4 | | | | | +| | | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | | +| | | +Apply | 16 | | 1 | 2 | 0 | | | | | +| | | |\ +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | | +| | | | +RelationshipCountFromCountStore | 15 | count( ()-[]->() ) AS anon_5 | 1 | 2 | 2 | 608 | 0/0 | 0.113 | Fused in Pipeline 5 | +| | | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ +| | | +Expand(All) | 14 | (s)-[anon_1:FRIENDS_WITH]->(t) | 1 | 2 | 3 | | | | | +| | | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | | +| | | +LockNodes | 13 | s | 1 | 1 | 0 | | | | | +| | | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | | +| | | +Argument | 12 | s | 1 | 1 | 0 | 584 | 0/0 | 1.494 | Fused in Pipeline 4 | +| | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ +| | +Optional | 11 | s | 0 | 1 | 0 | 528 | 0/0 | 2.057 | In Pipeline 3 | +| | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ +| | +Filter | 5 | t.size = anon_5 AND t:Person | 0 | 0 | 4 | | | | | +| | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | | +| | +Apply | 6 | | 1 | 2 | 0 | | | | | +| | |\ +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | | +| | | +RelationshipCountFromCountStore | 7 | count( ()-[]->() ) AS anon_5 | 1 | 2 | 2 | 528 | 0/0 | 4.220 | Fused in Pipeline 2 | +| | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ +| | +Expand(All) | 8 | (s)-[anon_1:FRIENDS_WITH]->(t) | 1 | 2 | 3 | | | | | +| | | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+ | | | +| | +Argument | 9 | s | 1 | 1 | 0 | 432 | 1/0 | 0.184 | Fused in Pipeline 1 | +| | +----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ +| +NodeIndexSeek | 10 | RANGE INDEX s:Person(name) WHERE name = $autostring_0 | 1 | 1 | 2 | 376 | 0/1 | 9.263 | In Pipeline 0 | ++----------------------------------------+----+------------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------------+ + +Total database accesses: 23, total allocated memory: 3248 +---- + +====== + [[query-plan-foreach]] From 8be799891fce633462c205ba6b6c17a10f73a44c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Mon, 8 Sep 2025 15:51:13 +0200 Subject: [PATCH 65/72] fix runtime version for locknodes --- .../pages/planning-and-tuning/operators/operators-detail.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/planning-and-tuning/operators/operators-detail.adoc b/modules/ROOT/pages/planning-and-tuning/operators/operators-detail.adoc index a656bb82d..b7593db64 100644 --- a/modules/ROOT/pages/planning-and-tuning/operators/operators-detail.adoc +++ b/modules/ROOT/pages/planning-and-tuning/operators/operators-detail.adoc @@ -6084,7 +6084,7 @@ Planner COST Runtime PIPELINED -Runtime version DEV +Runtime version {neo4j-version} Batch size 4 From f435fb44e42d254188b116c9361c04c3f4b33eed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Tue, 9 Sep 2025 09:42:11 +0200 Subject: [PATCH 66/72] drop not delete indexes --- .../search-performance-indexes/managing-indexes.adoc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/ROOT/pages/indexes/search-performance-indexes/managing-indexes.adoc b/modules/ROOT/pages/indexes/search-performance-indexes/managing-indexes.adoc index 1560019f8..c7428a486 100644 --- a/modules/ROOT/pages/indexes/search-performance-indexes/managing-indexes.adoc +++ b/modules/ROOT/pages/indexes/search-performance-indexes/managing-indexes.adoc @@ -1,9 +1,9 @@ :description: This page explains how to manage indexes used for search performance. include::https://raw.githubusercontent.com/neo4j-graphacademy/courses/main/asciidoc/courses/cypher-indexes-constraints/ad.adoc[] -= Create, show, and delete indexes += Create, show, and drop indexes -This page describes how to create, list, and delete search-performance indexes. +This page describes how to create, list, and drop search-performance indexes. The following index types are included in this category: * xref:indexes/search-performance-indexes/managing-indexes.adoc#create-range-index[Range indexes] @@ -541,7 +541,7 @@ Note that the wgs-84 and 3D cartesian settings, which are not specified in this Two token lookup indexes are created by default when creating a Neo4j database (one node label lookup index and one relationship type lookup index). Only one node label and one relationship type lookup index can exist at the same time. -If a token lookup index has been deleted, it can be recreated with the `CREATE LOOKUP INDEX` command. +If a token lookup index has been dropped, it can be recreated with the `CREATE LOOKUP INDEX` command. Note that the index name must be unique. Token lookup indexes have no supported index configuration. From 4e6a310e1845bb5c8f70826d22e2bde4fb43108a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Wed, 10 Sep 2025 09:19:15 +0200 Subject: [PATCH 67/72] Standardise admonitions (#1382) Most admonitions are either [NOTE], [TIP], [IMPORTANT]. This tries to standardise their use, using the following guidelines: [NOTE]: Use for general information or observations that are helpful but not critical. [TIP]: Use for optional advice, shortcuts, or suggestions that enhance understanding or efficiency. [IMPORTANT]: Use for essential information that the reader must follow to avoid mistakes or problems. --- modules/ROOT/pages/clauses/clause-composition.adoc | 4 +--- modules/ROOT/pages/clauses/foreach.adoc | 2 -- modules/ROOT/pages/clauses/load-csv.adoc | 2 +- modules/ROOT/pages/clauses/optional-match.adoc | 5 ----- modules/ROOT/pages/clauses/order-by.adoc | 2 +- modules/ROOT/pages/clauses/remove.adoc | 9 ++------- modules/ROOT/pages/clauses/return.adoc | 5 +---- modules/ROOT/pages/clauses/with.adoc | 2 +- .../expressions/predicates/comparison-operators.adoc | 2 +- modules/ROOT/pages/functions/aggregating.adoc | 8 +++----- modules/ROOT/pages/functions/load-csv.adoc | 4 +--- modules/ROOT/pages/genai-integrations.adoc | 9 +++------ .../search-performance-indexes/managing-indexes.adoc | 8 ++++---- .../search-performance-indexes/using-indexes.adoc | 2 +- .../indexes/semantic-indexes/full-text-indexes.adoc | 2 +- .../pages/indexes/semantic-indexes/vector-indexes.adoc | 6 +++--- modules/ROOT/pages/indexes/syntax.adoc | 6 +++--- modules/ROOT/pages/patterns/primer.adoc | 3 +-- modules/ROOT/pages/planning-and-tuning/query-tuning.adoc | 2 +- .../pages/planning-and-tuning/runtimes/reference.adoc | 2 +- .../ROOT/pages/query-caches/unified-query-caches.adoc | 5 ++--- .../pages/subqueries/subqueries-in-transactions.adoc | 2 +- modules/ROOT/pages/syntax/variables.adoc | 8 ++------ 23 files changed, 35 insertions(+), 65 deletions(-) diff --git a/modules/ROOT/pages/clauses/clause-composition.adoc b/modules/ROOT/pages/clauses/clause-composition.adoc index 4ce2db52b..c706e5e9e 100644 --- a/modules/ROOT/pages/clauses/clause-composition.adoc +++ b/modules/ROOT/pages/clauses/clause-composition.adoc @@ -128,10 +128,8 @@ The next section will explore these non-linear composition and write clauses. In a Cypher query, read and write clauses can take turns. The most important aspect of read-write queries is that the state of the graph also changes between clauses. -[IMPORTANT] -==== +[NOTE] A clause can never observe writes made by a later clause, and will observe all writes done by the previous clauses. -==== As of Cypher 25, read and write clauses can be combined in any order. That is, a write clause followed by a read clause no longer requires a separating xref:clauses/with.adoc[`WITH`] clause in order for the read clause to observe the changes made by a preceding write clause. diff --git a/modules/ROOT/pages/clauses/foreach.adoc b/modules/ROOT/pages/clauses/foreach.adoc index 5ec89cd1d..427ad97fa 100644 --- a/modules/ROOT/pages/clauses/foreach.adoc +++ b/modules/ROOT/pages/clauses/foreach.adoc @@ -12,9 +12,7 @@ This means that if you `CREATE` a node variable within a `FOREACH`, you will _no Within the `FOREACH` parentheses, you can do any of the updating commands -- `SET`, `REMOVE`, `CREATE`, `MERGE`, `DELETE`, and `FOREACH`. [TIP] -==== If you want to execute an additional `MATCH` for each element in a list then the xref::clauses/unwind.adoc[`UNWIND`] clause would be a more appropriate command. -==== image::graph-foreach-clause.svg[Person nodes connected between themselves via knows relationships,width=600,role=popup] diff --git a/modules/ROOT/pages/clauses/load-csv.adoc b/modules/ROOT/pages/clauses/load-csv.adoc index 1c98a6053..79ca46b9c 100644 --- a/modules/ROOT/pages/clauses/load-csv.adoc +++ b/modules/ROOT/pages/clauses/load-csv.adoc @@ -808,7 +808,7 @@ RETURN DISTINCT file() AS path |=== ==== -[TIP] +[NOTE] `file()` always returns a local path, even when loading remote CSV files. For remote resources, `file()` returns the temporary local path it was downloaded to. diff --git a/modules/ROOT/pages/clauses/optional-match.adoc b/modules/ROOT/pages/clauses/optional-match.adoc index 081c28352..9526a71d4 100644 --- a/modules/ROOT/pages/clauses/optional-match.adoc +++ b/modules/ROOT/pages/clauses/optional-match.adoc @@ -14,11 +14,6 @@ The `WHERE` clause is part of the pattern description, and its predicates will b This matters especially in the case of multiple (`OPTIONAL`) `MATCH` clauses, where it is crucial to put `WHERE` together with the `MATCH` it belongs to. -[TIP] -==== -To understand the patterns used in the `OPTIONAL MATCH` clause, read xref::patterns/index.adoc[Patterns]. -==== - == Example graph The following graph is used for the examples below: diff --git a/modules/ROOT/pages/clauses/order-by.adoc b/modules/ROOT/pages/clauses/order-by.adoc index 43fbcea32..a5dcf137b 100644 --- a/modules/ROOT/pages/clauses/order-by.adoc +++ b/modules/ROOT/pages/clauses/order-by.adoc @@ -10,7 +10,7 @@ It can also be used as a standalone clause, either on its own or in combination `ORDER BY` relies on comparisons to sort the output (see xref:values-and-types/ordering-equality-comparison.adoc[] for more details). You can sort on different values, such as node or relationship properties, IDs, or the result of expressions. -[IMPORTANT] +[NOTE] Unless `ORDER BY` is used, Neo4j does not guarantee the row order of a query result. diff --git a/modules/ROOT/pages/clauses/remove.adoc b/modules/ROOT/pages/clauses/remove.adoc index 066d6cd05..d9cc56634 100644 --- a/modules/ROOT/pages/clauses/remove.adoc +++ b/modules/ROOT/pages/clauses/remove.adoc @@ -4,17 +4,12 @@ = REMOVE The `REMOVE` clause is used to remove properties from nodes and relationships, and to remove labels from nodes. - -[TIP] -==== -For deleting nodes and relationships, see xref::clauses/delete.adoc[`DELETE`]. -==== +To delete nodes and relationships, use the xref::clauses/delete.adoc[`DELETE`] clause. [NOTE] -==== Removing labels from a node is an idempotent operation: if you try to remove a label from a node that does not have that label on it, nothing happens. The query statistics will tell you if something needed to be done or not. -==== + == Example graph diff --git a/modules/ROOT/pages/clauses/return.adoc b/modules/ROOT/pages/clauses/return.adoc index 8a5953e7e..df8b7eba0 100644 --- a/modules/ROOT/pages/clauses/return.adoc +++ b/modules/ROOT/pages/clauses/return.adoc @@ -95,10 +95,7 @@ d|Rows: 1 |=== [TIP] -==== -To only return the value of a property, do not not return the full node/relationship. -This will improve performance. -==== +It is more performant to return properties rather than the full node or relationship. [[return-all-elements]] diff --git a/modules/ROOT/pages/clauses/with.adoc b/modules/ROOT/pages/clauses/with.adoc index dba759b9c..a18ac29d9 100644 --- a/modules/ROOT/pages/clauses/with.adoc +++ b/modules/ROOT/pages/clauses/with.adoc @@ -13,7 +13,7 @@ The `WITH` clause serves multiple purposes in Cypher: * xref:clauses/with.adoc#ordering-pagination[Order and paginate results] * xref:clauses/with.adoc#filter-results[Filter results] -[IMPORTANT] +[NOTE] As of Cypher 25, `WITH` is no longer required as a separator between a write and a read clause. [[example-graph]] diff --git a/modules/ROOT/pages/expressions/predicates/comparison-operators.adoc b/modules/ROOT/pages/expressions/predicates/comparison-operators.adoc index 71266bc9f..bdecee3bf 100644 --- a/modules/ROOT/pages/expressions/predicates/comparison-operators.adoc +++ b/modules/ROOT/pages/expressions/predicates/comparison-operators.adoc @@ -14,7 +14,7 @@ Cypher contains the following comparison operators: * `IS NULL` * `IS NOT NULL` -[TIP] +[NOTE] For more information about how Cypher orders and compares different value types, see xref:values-and-types/ordering-equality-comparison.adoc[Values and types -> Equality, ordering, and comparison of value types] diff --git a/modules/ROOT/pages/functions/aggregating.adoc b/modules/ROOT/pages/functions/aggregating.adoc index db87890b0..5007b72a9 100644 --- a/modules/ROOT/pages/functions/aggregating.adoc +++ b/modules/ROOT/pages/functions/aggregating.adoc @@ -9,9 +9,8 @@ An aggregating function performs a calculation over a set of values, returning a Aggregation can be computed over all the matching paths, or it can be further divided by introducing xref:functions/aggregating.adoc#grouping-keys[grouping keys]. [TIP] -==== -To learn more about how Cypher handles aggregations performed on zero rows, refer to link:https://neo4j.com/developer/kb/understanding-aggregations-on-zero-rows/[Neo4j Knowledge Base -> Understanding aggregations on zero rows]. -==== +To learn more about how Cypher handles aggregations performed on zero rows, visit link:https://neo4j.com/developer/kb/understanding-aggregations-on-zero-rows/[Neo4j Knowledge Base -> Understanding aggregations on zero rows]. + == Example graph @@ -182,10 +181,9 @@ All the values are collected and returned in a single list: |=== [TIP] -==== Neo4j maintains a transactional count store for holding count metadata, which can significantly increase the speed of queries using the `count()` function. For more information about the count store, refer to link:https://neo4j.com/developer/kb/fast-counts-using-the-count-store/[Neo4j Knowledge Base -> Fast counts using the count store]. -==== + === Using `count(*)` to return the number of nodes diff --git a/modules/ROOT/pages/functions/load-csv.adoc b/modules/ROOT/pages/functions/load-csv.adoc index 53a99f265..73ecd84ef 100644 --- a/modules/ROOT/pages/functions/load-csv.adoc +++ b/modules/ROOT/pages/functions/load-csv.adoc @@ -6,11 +6,9 @@ LOAD CSV functions can be used to get information about the file that is processed by the xref:clauses/load-csv.adoc[`LOAD CSV`] clause. -[IMPORTANT] -==== +[NOTE] The functions described on this page are only useful when run on a query that uses `LOAD CSV`. In all other contexts they will always return `null`. -==== [[functions-linenumber]] diff --git a/modules/ROOT/pages/genai-integrations.adoc b/modules/ROOT/pages/genai-integrations.adoc index 2be9961eb..07ee4a344 100644 --- a/modules/ROOT/pages/genai-integrations.adoc +++ b/modules/ROOT/pages/genai-integrations.adoc @@ -60,11 +60,10 @@ See xref:genai-integrations.adoc#ai-providers[] for details of each supported pr Note that because this argument may contain sensitive data, it is obfuscated in the link:https://neo4j.com/docs/operations-manual/current/monitoring/logging/[query.log]. However, if the function call is misspelled or the query is otherwise malformed, it may be logged without being obfuscated. -[IMPORTANT] -==== +[NOTE] This function sends one API request every time it is called, which may result in a lot of overhead in terms of both network traffic and latency. If you want to generate many embeddings at once, use xref:genai-integrations.adoc#multiple-embeddings[]. -==== + Use the `db.create.setNodeVectorProperty` procedure to store an embedding to a node property. @@ -126,11 +125,9 @@ This result only shows the first 4 of the 1536 numbers in the embedding. Use the `genai.vector.encodeBatch` procedure to generate many vector embeddings with a single API request. This procedure takes a list of resources as an input, and returns the same number of result rows, instead of a single one. -[IMPORTANT] -==== +[NOTE] This procedure attempts to generate embeddings for all supplied resources in a single API request. Therefore, it is recommended to see the respective provider's documentation for details on, for example, the maximum number of embeddings that can be generated per request. -==== .Signature for `genai.vector.encodeBatch` label:procedure[] [source,syntax] diff --git a/modules/ROOT/pages/indexes/search-performance-indexes/managing-indexes.adoc b/modules/ROOT/pages/indexes/search-performance-indexes/managing-indexes.adoc index c7428a486..2374ae529 100644 --- a/modules/ROOT/pages/indexes/search-performance-indexes/managing-indexes.adoc +++ b/modules/ROOT/pages/indexes/search-performance-indexes/managing-indexes.adoc @@ -22,7 +22,7 @@ If no index type is specified in the create command a xref:indexes/search-perfor It is recommended to give the index a name when it is created. If the index is not explicitly named, it gets an auto-generated name. -[IMPORTANT] +[NOTE] ==== The index name must be unique among both indexes and constraints. ==== @@ -37,7 +37,7 @@ Index configuration settings can be specified using the `OPTIONS` clause. However, not all indexes have available configuration settings. In those cases, nothing needs to be specified and the `OPTIONS` map should be omitted from the query. -[TIP] +[NOTE] Creating an index requires link:{neo4j-docs-base-uri}/operations-manual/current/authentication-authorization/database-administration/#access-control-database-administration-index[the `CREATE INDEX` privilege]. [NOTE] @@ -783,7 +783,7 @@ There already exists a constraint called 'bookRecommendations'. Listing indexes can be done with `SHOW INDEXES`. -[TIP] +[NOTE] Listing indexes requires link:{neo4j-docs-base-uri}/operations-manual/current/authentication-authorization/database-administration/#access-control-database-administration-index[the `SHOW INDEX` privilege]. [discrete] @@ -1028,7 +1028,7 @@ This means that its default behavior is to throw an error if an attempt is made With `IF EXISTS`, no error is thrown and nothing happens should the index not exist. Instead, an informational notification is returned detailing that the index does not exist. -[TIP] +[NOTE] Dropping an index requires link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/authentication-authorization/database-administration/#access-control-database-administration-index[the `DROP INDEX` privilege]. [discrete] diff --git a/modules/ROOT/pages/indexes/search-performance-indexes/using-indexes.adoc b/modules/ROOT/pages/indexes/search-performance-indexes/using-indexes.adoc index 347119a26..14ca99722 100644 --- a/modules/ROOT/pages/indexes/search-performance-indexes/using-indexes.adoc +++ b/modules/ROOT/pages/indexes/search-performance-indexes/using-indexes.adoc @@ -101,7 +101,7 @@ The following example first creates a relevant index on the type property for `P CREATE INDEX range_index_type FOR (n:PointOfInterest) ON (n.type) ---- -[TIP] +[NOTE] If no index type is specified when creating an index, Neo4j will default to create a range index. For more information about creating indexes, see xref:indexes/search-performance-indexes/managing-indexes.adoc#create-indexes[Create, show, and delete indexes -> CREATE INDEX]. diff --git a/modules/ROOT/pages/indexes/semantic-indexes/full-text-indexes.adoc b/modules/ROOT/pages/indexes/semantic-indexes/full-text-indexes.adoc index c202e0a74..fd3d37427 100644 --- a/modules/ROOT/pages/indexes/semantic-indexes/full-text-indexes.adoc +++ b/modules/ROOT/pages/indexes/semantic-indexes/full-text-indexes.adoc @@ -41,7 +41,7 @@ If `IF NOT EXISTS` is appended to the command, no error is thrown and nothing ha Instead, an informational notification is returned showing the existing index which blocks the creation. The index name can also be given as a parameter, `CREATE FULLTEXT INDEX $name FOR ...`. -[TIP] +[NOTE] Creating a full-text index requires the link:{neo4j-docs-base-uri}/operations-manual/current/authentication-authorization/database-administration/#access-control-database-administration-index[`CREATE INDEX` privilege]. When creating a full-text index, you need to specify the labels/relationship types and property names it should apply to. diff --git a/modules/ROOT/pages/indexes/semantic-indexes/vector-indexes.adoc b/modules/ROOT/pages/indexes/semantic-indexes/vector-indexes.adoc index 5f3942293..9505afd85 100644 --- a/modules/ROOT/pages/indexes/semantic-indexes/vector-indexes.adoc +++ b/modules/ROOT/pages/indexes/semantic-indexes/vector-indexes.adoc @@ -78,7 +78,7 @@ The index name can also be given as a parameter: `CREATE VECTOR INDEX $name ...` The index name must be unique among both indexes and constraints. + A newly created index is not immediately available but is created in the background. -[TIP] +[NOTE] Creating indexes requires link:{neo4j-docs-base-uri}/operations-manual/current/authentication-authorization/database-administration/#access-control-database-administration-index[the `CREATE INDEX` privilege]. .Create vector index for `Movie` nodes on the `embedding` property @@ -262,7 +262,7 @@ For more information about what Java versions are supported by different Neo4j v To list all vector indexes in a database, use the `SHOW VECTOR INDEXES` command. This is the same xref:indexes/search-performance-indexes/managing-indexes.adoc#list-indexes[`SHOW` command as for other indexes], with the index type filtering on `VECTOR`. -[TIP] +[NOTE] Listing indexes requires link:{neo4j-docs-base-uri}/operations-manual/current/authentication-authorization/database-administration/#access-control-database-administration-index[the `SHOW INDEX` privilege]. .Show all vector indexes @@ -333,7 +333,7 @@ SHOW VECTOR INDEXES YIELD name, type, entityType, labelsOrTypes, properties A vector index is dropped by using the xref:indexes/search-performance-indexes/managing-indexes.adoc#drop-an-index[same command as for other indexes], `DROP INDEX`. The index name can also be given as a parameter when dropping an index: `DROP INDEX $name`. -[TIP] +[NOTE] Dropping indexes requires link:{neo4j-docs-base-uri}/operations-manual/current/database-administration/authentication-authorization/database-administration/#access-control-database-administration-index[the `DROP INDEX` privilege]. .Drop a vector index diff --git a/modules/ROOT/pages/indexes/syntax.adoc b/modules/ROOT/pages/indexes/syntax.adoc index 82e83035c..faae61678 100644 --- a/modules/ROOT/pages/indexes/syntax.adoc +++ b/modules/ROOT/pages/indexes/syntax.adoc @@ -31,7 +31,7 @@ Index configuration settings can be specified using the `OPTIONS` clause. However, not all indexes have available configuration settings. In those cases, nothing needs to be specified and the `OPTIONS` map should be omitted from the query. -[TIP] +[NOTE] Creating an index requires link:{neo4j-docs-base-uri}/operations-manual/current/authentication-authorization/database-administration/#access-control-database-administration-index[the `CREATE INDEX` privilege]. [[create-range-index]] @@ -225,7 +225,7 @@ For more information, see xref:indexes/semantic-indexes/vector-indexes.adoc#crea [[list-index]] == SHOW INDEX -[TIP] +[NOTE] Listing indexes requires link:{neo4j-docs-base-uri}/operations-manual/current/authentication-authorization/database-administration/#access-control-database-administration-index[the `SHOW INDEX` privilege]. .List indexes in the database (either all or filtered on index type) @@ -303,7 +303,7 @@ This means that its default behavior is to throw an error if an attempt is made With `IF EXISTS`, no error is thrown and nothing happens should the index not exist. Instead, an informational notification is returned detailing that the index does not exist. -[TIP] +[NOTE] Dropping indexes requires link:{neo4j-docs-base-uri}/operations-manual/current/authentication-authorization/database-administration/#access-control-database-administration-index[the `DROP INDEX` privilege]. .Drop an index of any index type diff --git a/modules/ROOT/pages/patterns/primer.adoc b/modules/ROOT/pages/patterns/primer.adoc index c2a0af229..cc155e024 100644 --- a/modules/ROOT/pages/patterns/primer.adoc +++ b/modules/ROOT/pages/patterns/primer.adoc @@ -152,8 +152,7 @@ RETURN reduce(acc = 0.0, l IN link | round(acc + l.distance, 2)) AS 1+d|Rows: 2 |=== -[TIP] - +[NOTE] `-[:LINK]-+` is a xref:patterns/reference.adoc#quantified-relationships[quantified relationship]. It is composed of a relationship pattern `-[:LINK]-` that matches relationships going in either direction, and a quantifier `+` that means it will match one or more relationships. As no node patterns are included with quantified relationships, they will match any intermediate nodes. Variable-length paths can also be matched with xref::patterns/variable-length-patterns.adoc#quantified-path-patterns[quantified path patterns], which allow both `WHERE` clauses and accessing the nodes traversed by the path. diff --git a/modules/ROOT/pages/planning-and-tuning/query-tuning.adoc b/modules/ROOT/pages/planning-and-tuning/query-tuning.adoc index ea0a96297..606279a3f 100644 --- a/modules/ROOT/pages/planning-and-tuning/query-tuning.adoc +++ b/modules/ROOT/pages/planning-and-tuning/query-tuning.adoc @@ -106,7 +106,7 @@ Using this option can significantly _increase_ the planning time of the query bu |=== -[IMPORTANT] +[NOTE] ==== The Cypher query option `connectComponentsPlanner` is deprecated and will be removed without a replacement. The product's default behavior of using a cost-based IDP search algorithm when combining sub-plans will be kept. diff --git a/modules/ROOT/pages/planning-and-tuning/runtimes/reference.adoc b/modules/ROOT/pages/planning-and-tuning/runtimes/reference.adoc index 1625330f1..7fa0d6d2d 100644 --- a/modules/ROOT/pages/planning-and-tuning/runtimes/reference.adoc +++ b/modules/ROOT/pages/planning-and-tuning/runtimes/reference.adoc @@ -90,7 +90,7 @@ Attempting to run a query with parallel runtime on AuraDB Free will throw the fo Parallel runtime has been disabled, please enable it or upgrade to a bigger Aura instance. ---- -[TIP] +[NOTE] ==== Users of AuraDB Professional, AuraDB Business Critical, and AuraDB Virtual Dedicated Cloud select the the size and the number of available CPUs when creating an instance. More information about the various tiers of AuraDB can be found on the link:https://neo4j.com/pricing/[Neo4j Pricing page]. diff --git a/modules/ROOT/pages/query-caches/unified-query-caches.adoc b/modules/ROOT/pages/query-caches/unified-query-caches.adoc index 20c7a1ca8..3aa6ddc91 100644 --- a/modules/ROOT/pages/query-caches/unified-query-caches.adoc +++ b/modules/ROOT/pages/query-caches/unified-query-caches.adoc @@ -26,10 +26,9 @@ but not cache entries. When this feature is enabled, all databases use only one set of query caches. A database may store and retrieve entries from the shared cache, but it may not retrieve entries produced by another database. -[IMPORTANT] -==== +[NOTE] While databases use the same set of caches, a database may not observe entries originating from other databases. -==== + The database may, however, evict entries from other databases as necessary, according to the constrained cache size and cache eviction policy. In essence, databases may compete for cache space, but may not observe each other's entries. diff --git a/modules/ROOT/pages/subqueries/subqueries-in-transactions.adoc b/modules/ROOT/pages/subqueries/subqueries-in-transactions.adoc index f621bac94..effdf1a26 100644 --- a/modules/ROOT/pages/subqueries/subqueries-in-transactions.adoc +++ b/modules/ROOT/pages/subqueries/subqueries-in-transactions.adoc @@ -272,7 +272,7 @@ CALL { } IN TRANSACTIONS ---- -[TIP] +[NOTE] Since the batching is performed on the input rows fed into `CALL { ... } IN TRANSACTIONS`, the data must be supplied from outside the subquery in order for the batching to have an effect. That is why the nodes are matched in a subquery _preceding_ the one that actually deletes the data. If the `MATCH` clause were inside the second subquery, the data deletion would run as one single transaction. diff --git a/modules/ROOT/pages/syntax/variables.adoc b/modules/ROOT/pages/syntax/variables.adoc index 9c4096199..b0330c0f4 100644 --- a/modules/ROOT/pages/syntax/variables.adoc +++ b/modules/ROOT/pages/syntax/variables.adoc @@ -18,19 +18,15 @@ RETURN b The variables are `n` and `b`. -Information regarding the naming of variables may be found xref::syntax/naming.adoc[here]. -[IMPORTANT] -.Variables are only visible in the same query part +[NOTE] ==== +.Variables are only visible in the same query part Variables are not carried over to subsequent queries. If multiple query parts are chained together using `WITH`, variables defined in one part have to be listed in the `WITH` clause to be carried over to the next part. For more information see xref::clauses/with.adoc[WITH]. -==== -[IMPORTANT] .Variables imported into a `CALL` subquery are visible in the whole subquery -==== Even if the subquery consists of multiple query parts chained together using `WITH`, variables imported from the outer query do not have to be listed in a `WITH` clause to be visible in subsequent parts of the subquery. For more information see xref::subqueries/call-subquery.adoc#variable-scope-clause[The variable scope clause]. ==== From b07fd09f9f3b8512e915015f2e1bba1be3425671 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Mon, 15 Sep 2025 10:35:46 +0200 Subject: [PATCH 68/72] fix case-sensitive links to procedures (#1386) --- modules/ROOT/pages/clauses/call.adoc | 2 +- ...ions-additions-removals-compatibility.adoc | 4 +-- .../semantic-indexes/full-text-indexes.adoc | 10 +++---- .../semantic-indexes/vector-indexes.adoc | 14 ++++----- .../ROOT/pages/introduction/cypher-neo4j.adoc | 2 +- .../planning-and-tuning/execution-plans.adoc | 2 +- .../runtimes/reference.adoc | 30 +++++++++---------- .../subqueries-in-transactions.adoc | 2 +- 8 files changed, 33 insertions(+), 33 deletions(-) diff --git a/modules/ROOT/pages/clauses/call.adoc b/modules/ROOT/pages/clauses/call.adoc index f4366f28e..b0cb32ac4 100644 --- a/modules/ROOT/pages/clauses/call.adoc +++ b/modules/ROOT/pages/clauses/call.adoc @@ -72,7 +72,7 @@ Omission of parentheses is available only in a so-called standalone procedure ca ==== -This example calls the procedure link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_dbms_checkconfigvalue[`dbms.checkConfigValue()`], which checks the validity of a configuration setting value, using literal arguments. +This example calls the procedure link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_dbms_checkConfigValue[`dbms.checkConfigValue()`], which checks the validity of a configuration setting value, using literal arguments. .Query [source, cypher] diff --git a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc index a72a07534..bc6ccdf1a 100644 --- a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc +++ b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc @@ -378,7 +378,7 @@ CALL db.schema.nodeTypeProperties() YIELD propertyTypes RETURN propertyTypes; CALL db.schema.relTypeProperties() YIELD propertyTypes RETURN propertyTypes; ---- a| -The column `propertyTypes` returned by the procedures link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_schema_nodetypeproperties[`db.schema.nodeTypeProperties()`] and link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_schema_reltypeproperties[`db.schema.relTypeProperties()`] previously returned a list of strings representing the potential Java types for a given property. +The column `propertyTypes` returned by the procedures link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_schema_nodeTypeProperties[`db.schema.nodeTypeProperties()`] and link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_schema_relTypeProperties[`db.schema.relTypeProperties()`] previously returned a list of strings representing the potential Java types for a given property. It now returns a list of strings representing the possible Cypher Types the given property has. For all available Cypher types, see the section on xref::values-and-types/property-structural-constructed.adoc#types-synonyms[types and their synonyms]. @@ -934,7 +934,7 @@ CALL db.schema.nodeTypeProperties() YIELD propertyTypes RETURN propertyTypes; CALL db.schema.relTypeProperties() YIELD propertyTypes RETURN propertyTypes; ---- a| -The column `propertyTypes` currently returned by the procedures link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_schema_nodetypeproperties[`db.schema.nodeTypeProperties()`] and link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_schema_reltypeproperties[`db.schema.relTypeProperties()`] produces a list of strings representing the potential Java types for a given property. +The column `propertyTypes` currently returned by the procedures link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_schema_nodeTypeProperties[`db.schema.nodeTypeProperties()`] and link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_schema_relTypeProperties[`db.schema.relTypeProperties()`] produces a list of strings representing the potential Java types for a given property. In an upcoming major release of Neo4j, this will be updated to represent the possible Cypher types for that property instead. For all available Cypher types, see the section on xref::values-and-types/property-structural-constructed.adoc#types-synonyms[types and their synonyms]. diff --git a/modules/ROOT/pages/indexes/semantic-indexes/full-text-indexes.adoc b/modules/ROOT/pages/indexes/semantic-indexes/full-text-indexes.adoc index fd3d37427..e14812ad2 100644 --- a/modules/ROOT/pages/indexes/semantic-indexes/full-text-indexes.adoc +++ b/modules/ROOT/pages/indexes/semantic-indexes/full-text-indexes.adoc @@ -91,7 +91,7 @@ Removing stop words can help reduce the size of stored data and thereby improve In some cases, using different analyzers for the indexed values and query string is more appropriate. For example, if handling `STRING` values written in Swedish, it may be beneficial to select the `swedish` analyzer, which knows how to tokenize Swedish words, and will avoid indexing Swedish stop words. -The link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_fulltext_listavailableanalyzers[`db.index.fulltext.listAvailableAnalyzers()`] procedure shows all available analyzers. +The link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_fulltext_listAvailableAnalyzers[`db.index.fulltext.listAvailableAnalyzers()`] procedure shows all available analyzers. Neo4j also supports the use of custom analyzers. For more information, see the link:{neo4j-docs-base-uri}/java-reference/current/extending-neo4j/full-text-analyzer-provider[Java Reference Manual -> Full-text index analyzer providers]. @@ -134,7 +134,7 @@ For more information on how to configure full-text indexes, refer to the link:{n == Query full-text indexes Unlike xref:indexes/search-performance-indexes/managing-indexes.adoc[search-performance indexes], full-text indexes are not automatically used by the xref:planning-and-tuning/execution-plans.adoc[Cypher query planner]. -To query a full-text index, use either the link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_fulltext_querynodes[`db.index.fulltext.queryNodes`] or the link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_fulltext_queryRelationships[`db.index.fulltext.queryRelationships`] procedure. +To query a full-text index, use either the link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_fulltext_queryNodes[`db.index.fulltext.queryNodes`] or the link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_fulltext_queryRelationships[`db.index.fulltext.queryRelationships`] procedure. [NOTE] An index cannot be used while its `state` is `POPULATING`, which occurs immediately after it is created. @@ -362,15 +362,15 @@ The procedures for full-text indexes are listed in the table below: | Usage | Procedure/Command | Description | Eventually consistent indexes. -| https://neo4j.com/docs/operations-manual/current/procedures/#procedure_db_index_fulltext_awaiteventuallyconsistentindexrefresh[`db.index.fulltext.awaitEventuallyConsistentIndexRefresh`] +| https://neo4j.com/docs/operations-manual/current/procedures/#procedure_db_index_fulltext_awaitEventuallyConsistentIndexRefresh[`db.index.fulltext.awaitEventuallyConsistentIndexRefresh`] | Wait for the updates from recently committed transactions to be applied to any eventually-consistent full-text indexes. | List available analyzers. -| https://neo4j.com/docs/operations-manual/current/procedures/#procedure_db_index_fulltext_listavailableanalyzers[`db.index.fulltext.listAvailableAnalyzers`] +| https://neo4j.com/docs/operations-manual/current/procedures/#procedure_db_index_fulltext_listAvailableAnalyzers[`db.index.fulltext.listAvailableAnalyzers`] | List the available analyzers that the full-text indexes can be configured with. | Use full-text node index. -| https://neo4j.com/docs/operations-manual/current/procedures/#procedure_db_index_fulltext_querynodes[`db.index.fulltext.queryNodes`] +| https://neo4j.com/docs/operations-manual/current/procedures/#procedure_db_index_fulltext_queryNodes[`db.index.fulltext.queryNodes`] | Query the given full-text index. Returns the matching nodes and their Lucene query score, ordered by score. | Use full-text relationship index. diff --git a/modules/ROOT/pages/indexes/semantic-indexes/vector-indexes.adoc b/modules/ROOT/pages/indexes/semantic-indexes/vector-indexes.adoc index 9505afd85..a6b1b78b4 100644 --- a/modules/ROOT/pages/indexes/semantic-indexes/vector-indexes.adoc +++ b/modules/ROOT/pages/indexes/semantic-indexes/vector-indexes.adoc @@ -180,7 +180,7 @@ Default value::: `100` [[query-vector-index]] == Query vector indexes -To query a node vector index, use the link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_vector_querynodes[`db.index.vector.queryNodes`] procedure. +To query a node vector index, use the link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_vector_queryNodes[`db.index.vector.queryNodes`] procedure. [NOTE] An index cannot be used while its `state` is `POPULATING`, which occurs immediately after it is created. @@ -226,7 +226,7 @@ Note that all movies returned have a plot centred around criminal family organiz The `score` results are returned in _descending order_, where the best matching result entry is put first (in this case, `The Godfather` has a similarity score of `1.0`, which is to be expected as the index was queried with this specific property). If the query vector itself is not wanted, adding the predicate `WHERE score < 1` removes identical vectors. -To query a relationship vector index, use the link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_vector_queryrelationships[`db.index.vector.queryRelationships`] procedure. +To query a relationship vector index, use the link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_vector_queryRelationships[`db.index.vector.queryRelationships`] procedure. .Signature for `db.index.vector.queryRelationships` [source,syntax] @@ -471,21 +471,21 @@ image::euclidean-similarity-equation.svg["The Euclidean of vector v and vector u | Usage | Procedure | Description | Use node vector index. -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_vector_querynodes[`db.index.vector.queryNodes`] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_vector_queryNodes[`db.index.vector.queryNodes`] | Query the given node vector index. Returns the requested number of approximate nearest neighbor nodes and their similarity score, ordered by score. | Use relationship vector index. -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_vector_queryrelationships[`db.index.vector.queryRelationships`] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_vector_queryRelationships[`db.index.vector.queryRelationships`] | Query the given relationship vector index. Returns the requested number of approximate nearest neighbor relationships and their similarity score, ordered by score. | Set node vector property. -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_create_setnodevectorproperty[`db.create.setNodeVectorProperty`] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_create_setNodeVectorProperty[`db.create.setNodeVectorProperty`] | Update a given node property with the given vector in a more space-efficient way than directly using xref:clauses/set.adoc#set-set-a-property[`SET`]. | Set relationship vector property. -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_create_setrelationshipvectorproperty[`db.create.setRelationshipVectorProperty`] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_create_setRelationshipVectorProperty[`db.create.setRelationshipVectorProperty`] | Update a given relationship property with the given vector in a more space-efficient way than directly using xref:clauses/set.adoc#set-set-a-property[`SET`]. |=== @@ -514,7 +514,7 @@ The following table lists the issues and, if fixed, the version in which they we |=== | Known issues | Fixed in -| The creation of a vector index using the legacy procedure link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_vector_createnodeindex[`db.index.vector.createNodeIndex`] may fail with an error in Neo4j 5.18 and later if the database was last written to with a version prior to Neo4j 5.11, and the legacy procedure is the first write operation used on the newer version. +| The creation of a vector index using the legacy procedure link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_vector_createNodeIndex[`db.index.vector.createNodeIndex`] may fail with an error in Neo4j 5.18 and later if the database was last written to with a version prior to Neo4j 5.11, and the legacy procedure is the first write operation used on the newer version. In Neo4j 5.20, the error was clarified. [TIP] -- diff --git a/modules/ROOT/pages/introduction/cypher-neo4j.adoc b/modules/ROOT/pages/introduction/cypher-neo4j.adoc index 90b7dd14d..76d52810d 100644 --- a/modules/ROOT/pages/introduction/cypher-neo4j.adoc +++ b/modules/ROOT/pages/introduction/cypher-neo4j.adoc @@ -136,7 +136,7 @@ For examples of the API, or the commands used to start and commit transactions, * For information on using transactions with a Neo4j driver, see _The session API_ in the link:{docs-base-uri}[Neo4j Driver manuals]. * For information on using transactions over the HTTP API, see the link:{neo4j-docs-base-uri}/http-api/current/transactions[HTTP API documentation -> Run transactions]. * For information on using transactions within the embedded Core API, see the link:{neo4j-docs-base-uri}/java-reference/current/java-embedded/cypher-java/[Java Reference -> Cypher queries]. -* For information on using transactions within the Neo4j Browser or Cypher-shell, see the link:{neo4j-docs-base-uri}/browser-manual/current/reference-commands/[Neo4j Browser documentation] or the link:{neo4j-docs-base-uri}/operations-manual/current/cypher-shell/#cypher-shell-commands[Cypher-shell documentation]. +* For information on using transactions within the Neo4j Browser or Cypher-shell, see the link:{neo4j-docs-base-uri}/browser/reference-commands/[Neo4j Browser documentation] or the link:{neo4j-docs-base-uri}/operations-manual/current/cypher-shell/#cypher-shell-commands[Cypher-shell documentation]. When writing procedures or using Neo4j embedded, remember that all iterators returned from an execution result should be either fully exhausted or closed. This ensures that the resources bound to them are properly released. diff --git a/modules/ROOT/pages/planning-and-tuning/execution-plans.adoc b/modules/ROOT/pages/planning-and-tuning/execution-plans.adoc index c4b2dc900..8871d16bb 100644 --- a/modules/ROOT/pages/planning-and-tuning/execution-plans.adoc +++ b/modules/ROOT/pages/planning-and-tuning/execution-plans.adoc @@ -92,7 +92,7 @@ RETURN count(*) ---- This is the resulting execution planfootnote:[The format of the execution plans displayed in this section are those generated when using link:{neo4j-docs-base-uri}/operations-manual/current/cypher-shell/[Cypher Shell]. -The execution plans generated by link:{neo4j-docs-base-uri}/browser-manual/current/[Neo4j Browser] use a different format.]: +The execution plans generated by link:{neo4j-docs-base-uri}/browser/[Neo4j Browser] use a different format.]: [role="queryplan"] ---- diff --git a/modules/ROOT/pages/planning-and-tuning/runtimes/reference.adoc b/modules/ROOT/pages/planning-and-tuning/runtimes/reference.adoc index 7fa0d6d2d..fb94d1b2e 100644 --- a/modules/ROOT/pages/planning-and-tuning/runtimes/reference.adoc +++ b/modules/ROOT/pages/planning-and-tuning/runtimes/reference.adoc @@ -103,7 +103,7 @@ Procedures and functions that read the database are supported by the parallel ru Apart from this, there are two categories of procedures and functions to keep in mind when using the parallel runtime. The first can be categorized as _updating procedures_. -These are procedures that update the graph with write queries, such as the Neo4j procedures link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_createlabel[db.createLabel] and link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_createproperty[db.createProperty]. +These are procedures that update the graph with write queries, such as the Neo4j procedures link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_createLabel[db.createLabel] and link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_createProperty[db.createProperty]. If such procedures are called in a query run on the parallel runtime, the query will fail. The second can be categorized as _non-thread-safe_ procedures and functions. @@ -129,9 +129,9 @@ Instead the query will automatically run on the pipelined runtime. | Procedure -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_awaitindex[db.awaitIndex] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_awaitIndex[db.awaitIndex] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_awaitindexes[db.awaitIndexes] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_awaitIndexes[db.awaitIndexes] | link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_checkpoint[db.checkpoint] @@ -139,33 +139,33 @@ Instead the query will automatically run on the pipelined runtime. | link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_labels[db.labels] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_listlocks[db.listLocks] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_listLocks[db.listLocks] | link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_ping[db.ping] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_propertykeys[db.propertyKeys] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_propertyKeys[db.propertyKeys] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_prepareforreplanning[db.prepareForReplanning] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_prepareForReplanning[db.prepareForReplanning] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_relationshiptypes[db.relationshipTypes] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_relationshipTypes[db.relationshipTypes] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_resampleindex[db.resampleIndex] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_resampleIndex[db.resampleIndex] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_resampleoutdatedindexes[db.resampleOutdatedIndexes] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_resampleOutdatedIndexes[db.resampleOutdatedIndexes] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_schema_nodetypeproperties[db.schema.nodeTypeProperties] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_schema_nodeTypeProperties[db.schema.nodeTypeProperties] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_schema_reltypeproperties[db.schema.relTypeProperties] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_schema_relTypeProperties[db.schema.relTypeProperties] | link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_schema_visualization[db.schema.visualization] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_dbms_checkconfigvalue[dbms.checkConfigValue] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_dbms_checkConfigValue[dbms.checkConfigValue] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_dbms_listactivelocks[dbms.listActiveLocks] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_dbms_listActiveLocks[dbms.listActiveLocks] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_dbms_listpools[dbms.listPools] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_dbms_listPools[dbms.listPools] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_dbms_scheduler_failedjobs[dbms.scheduler.failedJobs] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_dbms_scheduler_failedJobs[dbms.scheduler.failedJobs] | link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_dbms_scheduler_groups[dbms.scheduler.groups] diff --git a/modules/ROOT/pages/subqueries/subqueries-in-transactions.adoc b/modules/ROOT/pages/subqueries/subqueries-in-transactions.adoc index effdf1a26..a6ade238e 100644 --- a/modules/ROOT/pages/subqueries/subqueries-in-transactions.adoc +++ b/modules/ROOT/pages/subqueries/subqueries-in-transactions.adoc @@ -13,7 +13,7 @@ Cancelling the outer transaction will cancel the inner ones as well. [NOTE] `CALL { ... } IN TRANSACTIONS` is only allowed in xref::introduction/cypher-neo4j.adoc#cypher-neo4j-transactions[implicit transactions]. + -If you are using link:https://neo4j.com/docs/browser-manual/current/[Neo4j Browser], you must prepend any queries using `CALL { ... } IN TRANSACTIONS` with `:auto`. +If you are using link:https://neo4j.com/docs/browser/[Neo4j Browser], you must prepend any queries using `CALL { ... } IN TRANSACTIONS` with `:auto`. [NOTE] The examples on this page use a xref:subqueries/call-subquery.adoc#variable-scope-clause[variable scope clause] to import variables into the `CALL` subquery. From 90f1992e00e3166859f0b9b992277195193c5c66 Mon Sep 17 00:00:00 2001 From: Richard Sill <156673635+rsill-neo4j@users.noreply.github.com> Date: Tue, 16 Sep 2025 09:22:57 +0200 Subject: [PATCH 69/72] Document format function (#1374) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Gem Lamont <106068376+gem-neo4j@users.noreply.github.com> Co-authored-by: Jens Pryce-Åklundh <112686610+JPryce-Aklundh@users.noreply.github.com> --- modules/ROOT/content-nav.adoc | 1 + .../gql-conformance/additional-cypher.adoc | 14 + ...ions-additions-removals-compatibility.adoc | 12 + modules/ROOT/pages/functions/index.adoc | 17 + .../ROOT/pages/functions/temporal/format.adoc | 339 ++++++++++++++++++ .../ROOT/pages/values-and-types/temporal.adoc | 50 +++ package-lock.json | 1 + 7 files changed, 434 insertions(+) create mode 100644 modules/ROOT/pages/functions/temporal/format.adoc diff --git a/modules/ROOT/content-nav.adoc b/modules/ROOT/content-nav.adoc index 38315b153..1779cdcb4 100644 --- a/modules/ROOT/content-nav.adoc +++ b/modules/ROOT/content-nav.adoc @@ -100,6 +100,7 @@ ** xref:functions/string.adoc[] ** xref:functions/temporal/duration.adoc[] ** xref:functions/temporal/index.adoc[] +** xref:functions/temporal/format.adoc[] ** xref:functions/user-defined.adoc[] ** xref:functions/vector.adoc[] diff --git a/modules/ROOT/pages/appendix/gql-conformance/additional-cypher.adoc b/modules/ROOT/pages/appendix/gql-conformance/additional-cypher.adoc index a30d4fbbd..f50145571 100644 --- a/modules/ROOT/pages/appendix/gql-conformance/additional-cypher.adoc +++ b/modules/ROOT/pages/appendix/gql-conformance/additional-cypher.adoc @@ -542,6 +542,20 @@ If the points are in a Cartesian CRS, the function returns the Euclidean distanc |=== +[[temporal-format-functions]] +=== Temporal format functions + +[options="header", cols="2a,5a"] +|=== +| Cypher feature +| Description + +| xref:functions/temporal/format.adoc[`format()`] +| Returns the temporal value as an ISO-formatted `STRING` or as a `STRING` formatted by the provided pattern. + +|=== + + [[vector-functions]] === Vector functions diff --git a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc index bc6ccdf1a..dc042e559 100644 --- a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc +++ b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc @@ -32,6 +32,17 @@ For more information, see xref:queries/select-version.adoc[]. | Feature | Details +a| +label:functionality[] +label:new[] +[source, cypher, role="noheader"] +---- +WITH datetime('1986-11-18T6:04:45.123456789+01:00[Europe/Berlin]') AS dt +RETURN format(dt, "MM/dd/yyyy") AS US, format(dt, "dd/MM/yyyy") AS EU +---- + +| Cypher's new xref:functions/temporal/format.adoc[`format()`] function can create dynamically formatted string representations of temporal instance and duration types. + a| label:functionality[] label:new[] @@ -40,6 +51,7 @@ New operator: `LockNodes` a| Introduced xref::planning-and-tuning/operators/operators-detail.adoc#query-plan-lock-nodes[`LockNodes`] operator, sometimes used in conjunction with the `LockingMerge` operator to lock nodes. + |=== [[cypher-deprecations-additions-removals-2025.08]] diff --git a/modules/ROOT/pages/functions/index.adoc b/modules/ROOT/pages/functions/index.adoc index a72524852..d24012d48 100644 --- a/modules/ROOT/pages/functions/index.adoc +++ b/modules/ROOT/pages/functions/index.adoc @@ -764,6 +764,23 @@ Values of the xref::values-and-types/temporal.adoc[temporal types] -- `DATE`, `Z |=== +[role=label--cypher-25-only label--new-Neo4j-2025.09] +[[header-query-functions-temporal-format]] +== Temporal format functions + +These functions format temporal instance and duration values: + +[options="header"] +|=== +| Function | Signature | Description + +1.1+| xref::functions/temporal/format.adoc#query-functions-temporal-format-function[`format()`] +| `format(value :: DATE \| LOCAL TIME \| ZONED TIME \| LOCAL DATETIME \| ZONED DATETIME \| DURATION[, pattern :: STRING]) :: STRING` +| Returns the temporal value as an ISO-formatted `STRING` or as a `STRING` formatted by the provided pattern. + +|=== + + [[header-query-functions-user-defined]] == User-defined functions diff --git a/modules/ROOT/pages/functions/temporal/format.adoc b/modules/ROOT/pages/functions/temporal/format.adoc new file mode 100644 index 000000000..d7d7d4999 --- /dev/null +++ b/modules/ROOT/pages/functions/temporal/format.adoc @@ -0,0 +1,339 @@ +:description: Information about Cypher's function to format temporal instance and duration values. +:table-caption!: + +[[query-functions-temporal-format]] += Temporal functions - format + +[role=label--cypher-25-only label--new-Neo4j-2025.09] +[[query-functions-temporal-format-function]] +== format() + +The `format()` function creates dynamically formatted string representations of temporal instance and duration types. + +.Details +|=== +| *Syntax* 3+| `format(value[, pattern])` +| *Description* 3+| Returns the temporal value as an ISO-formatted `STRING` or as a `STRING` formatted by the provided pattern. +.3+| *Arguments* | *Name* | *Type* | *Description* + | `value` | `DATE \| LOCAL TIME \| ZONED TIME \| LOCAL DATETIME \| ZONED DATETIME \| DURATION` | A temporal value to be formatted. + | `pattern` | `STRING` | A pattern used to format the temporal value. If the pattern is not provided the value will be formatted according to ISO 8601. +| *Returns* 3+| `STRING` +|=== + +.Considerations +|=== +| The output format can be customized via the `pattern` parameter. +| The `pattern` parameter follows the link:https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/time/format/DateTimeFormatter.html[Java DateTimeFormatter]. +| If no pattern is specified, the function returns an ISO-formatted string. +| Most characters yield a different output when they are repeated. +| Some characters cannot be applied to certain types, for instance, `u` cannot be used to construct a string for a `LOCAL TIME` because it represents a year which is not part of the temporal value. +| Any character that is not reserved, other than `[`, `]`, `{`, `}`, `#`, and `'`, are output directly. To ensure future compatibility it is recommended to wrap all characters that you want to output directly with single quotes. +|=== + +[[query-functions-temporal-format-instance-types]] +== Instance types + +Cypher's instance types are `DATE`, `LOCAL TIME`, `ZONED TIME`, `LOCAL DATETIME` and `ZONED DATETIME`. +For more information, see xref:/values-and-types/temporal.adoc#cypher-temporal-instants[Values and types -> temporal instants]. + +Use the characters in xref:#query-functions-temporal-format-instance-types-characters[] to create a string pattern for instance types. + + +[[query-functions-temporal-format-instance-types-examples]] +=== Examples + +.Instance formatting, US American and European dates +====== + +.Query +// tag::functions_format_instance_type[] +[source, cypher, indent=0] +---- +WITH datetime('1986-11-18T6:04:45.123456789+01:00[Europe/Berlin]') AS dt +RETURN format(dt, "MM/dd/yyyy") AS US, format(dt, "dd/MM/yyyy") AS EU +---- +// end::functions_format_instance_type[] + +.Result +[role="queryresult",options="header,footer",cols="2* components of durations]. + +If the string pattern contains a character from a component group but does not contain a character denoting a longer duration from the same group, `format()` converts the longer duration to the equivalent duration with the character that is present. +For example a missing `y` (year) will be converted to four quarters, if `q` is present in the string pattern. +This is because without a reference point, there is no way to determine the specifics of a duration. + + +[[query-functions-temporal-format-duration-types-examples]] +=== Examples + +.Duration formatting, years converted to quarters +====== + +.Query +// tag::functions_format_duration_type[] +[source, cypher, indent=0] +---- +WITH duration({years: 1, months: 4}) AS d +RETURN format(d, "y 'years' q 'quarters' M 'months'") AS withYears, format(d, "q 'quarters' M 'months'") AS withoutYears +---- +// end::functions_format_duration_type[] + +.Result +[role="queryresult",options="header,footer",cols="2* Date: Wed, 17 Sep 2025 09:46:34 +0200 Subject: [PATCH 70/72] fix SHORTEST queries (#1388) --- .../ROOT/pages/patterns/shortest-paths.adoc | 165 +++++++++--------- 1 file changed, 82 insertions(+), 83 deletions(-) diff --git a/modules/ROOT/pages/patterns/shortest-paths.adoc b/modules/ROOT/pages/patterns/shortest-paths.adoc index e8d83f72e..9bab3cfd5 100644 --- a/modules/ROOT/pages/patterns/shortest-paths.adoc +++ b/modules/ROOT/pages/patterns/shortest-paths.adoc @@ -572,7 +572,7 @@ Without `CALL`, the planner does not know how many targets there are per source ---- PROFILE MATCH p = ANY SHORTEST - (source:N {trail: ["C", "C", "A", "C", "A", "B", "B", "B", "A"]})--+ + (source:N {trail: ["C", "C", "A", "C", "A", "B", "B", "B", "A"]})--{2,} (target:N {trail: ["A", "B", "C", "A", "B", "C", "A", "B", "C"]}) RETURN length(p) AS pathLength ---- @@ -593,27 +593,27 @@ It, therefore, must exhaust all possible target nodes before determining the sho .Query Plan [source, role="queryplan"] ---- -+-----------------------------------+----+----------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ -| Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | -+-----------------------------------+----+----------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ -| +ProduceResults | 0 | `length(p)` | 19612941 | 1 | 0 | 0 | 0/0 | 0.027 | | -| | +----+----------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+ | -| +Projection | 1 | length((source)-[anon_7*]-(target)) AS `length(p)` | 19612941 | 1 | 17 | | 9/0 | 0.036 | | -| | +----+----------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+ | -| +StatefulShortestPath(All, Trail) | 2 | SHORTEST 1 (source) ((`anon_3`)-[`anon_4`]-(`anon_5`)){1, } (target) | 19612941 | 1 | 354292 | 64720328 | 85358/0 | 139.138 | In Pipeline 1 | -| | | | expanding from: source | | | | | | | | -| | | | inlined predicates: target.trail = $autolist_1 | | | | | | | | -| | | | target:N | | | | | | | | -| | +----+----------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ -| +Filter | 3 | source.trail = $autolist_0 | 4429 | 1 | 177146 | | | | | -| | +----+----------------------------------------------------------------------+----------------+-------+---------+----------------+ | | | -| +NodeByLabelScan | 4 | source:N | 88573 | 88573 | 88574 | 376 | 2128/0 | 42.628 | Fused in Pipeline 0 | -+-----------------------------------+----+----------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ - -Total database accesses: 620029, total allocated memory: 64720664 ++-----------------------------------+----+-------------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ +| Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | ++-----------------------------------+----+-------------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ +| +ProduceResults | 0 | pathLength | 19612941 | 1 | 0 | 0 | 0/0 | 0.088 | | +| | +----+-------------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+ | +| +Projection | 1 | length((source)-[anon_39*]-(target)) AS pathLength | 19612941 | 1 | 17 | | 9/0 | 0.091 | | +| | +----+-------------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+ | +| +StatefulShortestPath(All, Trail) | 2 | SHORTEST 1 (source) ((`anon_35`)-[`anon_36`]-(`anon_37`)){2, } (target) | 19612941 | 1 | 354300 | 65608284 | 85662/0 | 158.664 | In Pipeline 1 | +| | | | expanding from: source | | | | | | | | +| | | | inlined predicates: target.trail = $autolist_1 | | | | | | | | +| | | | target:N | | | | | | | | +| | +----+-------------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ +| +Filter | 3 | source.trail = $autolist_0 | 4429 | 1 | 177146 | | | | | +| | +----+-------------------------------------------------------------------------+----------------+-------+---------+----------------+ | | | +| +NodeByLabelScan | 4 | source:N | 88573 | 88573 | 88574 | 376 | 1853/0 | 53.311 | Fused in Pipeline 0 | ++-----------------------------------+----+-------------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ + +Total database accesses: 620037, total allocated memory: 65608620 1 row -ready to start consuming query after 59 ms, results consumed after another 183 ms +ready to start consuming query after 45 ms, results consumed after another 214 ms ---- However, since each `trail` property is unique, rewriting the query to use a `CALL` subquery yields a more efficient plan. @@ -626,43 +626,43 @@ PROFILE MATCH (start:N {trail: ["C", "C", "A", "C", "A", "B", "B", "B", "A"]}), (end:N {trail: ["A", "B", "C", "A", "B", "C", "A", "B", "C"]}) CALL (start, end) { - MATCH p = ANY SHORTEST (start)--+(end) + MATCH p = ANY SHORTEST (start)--{2,}(end) RETURN p } RETURN length(p) AS pathLength ---- -The result is a significantly faster query (down from 59 to 9 milliseconds): +The result is a significantly faster query (down from 45 to 4 milliseconds): .Query Plan [source, role="queryplan"] ---- -+------------------------------------+----+----------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ -| Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | -+------------------------------------+----+----------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ -| +ProduceResults | 0 | `length(p)` | 19612941 | 1 | 0 | 0 | 0/0 | 0.019 | | -| | +----+----------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+ | -| +Projection | 1 | length(p) AS `length(p)` | 19612941 | 1 | 0 | | 0/0 | 0.007 | | -| | +----+----------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+ | -| +Projection | 2 | (start)-[anon_14*]-(end) AS p | 19612941 | 1 | 17 | | 9/0 | 0.073 | | -| | +----+----------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+ | -| +StatefulShortestPath(Into, Trail) | 3 | ANY 1 (start) ((`anon_10`)-[`anon_11`]-(`anon_12`)){1, } (end) | 19612941 | 1 | 1936 | 990280 | 205/0 | 1.135 | In Pipeline 3 | -| | +----+----------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ -| +CartesianProduct | 4 | | 19612941 | 1 | 0 | 9040 | | 0.131 | In Pipeline 2 | -| |\ +----+----------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ -| | +Filter | 5 | end.trail = $autolist_1 | 22143 | 1 | 177146 | | | | | -| | | +----+----------------------------------------------------------------+----------------+-------+---------+----------------+ | | | -| | +NodeByLabelScan | 6 | end:N | 442865 | 88573 | 88574 | 392 | 2128/0 | 29.822 | Fused in Pipeline 1 | -| | +----+----------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ -| +Filter | 7 | start.trail = $autolist_0 | 4429 | 1 | 177146 | | | | | -| | +----+----------------------------------------------------------------+----------------+-------+---------+----------------+ | | | -| +NodeByLabelScan | 8 | start:N | 88573 | 88573 | 88574 | 376 | 2128/0 | 40.743 | Fused in Pipeline 0 | -+------------------------------------+----+----------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ - -Total database accesses: 533393, total allocated memory: 999592 ++------------------------------------+----+---------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ +| Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | ++------------------------------------+----+---------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ +| +ProduceResults | 0 | pathLength | 19612941 | 1 | 0 | 0 | 0/0 | 0.080 | | +| | +----+---------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+ | +| +Projection | 1 | length(p) AS pathLength | 19612941 | 1 | 0 | | 0/0 | 0.023 | | +| | +----+---------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+ | +| +Projection | 2 | (start)-[anon_15*]-(end) AS p | 19612941 | 1 | 17 | | 9/0 | 0.063 | | +| | +----+---------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+ | +| +StatefulShortestPath(Into, Trail) | 3 | SHORTEST 1 (start) ((`anon_11`)-[`anon_12`]-(`anon_13`)){2, } (end) | 19612941 | 1 | 1952 | 1337576 | 209/0 | 1.938 | In Pipeline 3 | +| | +----+---------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ +| +CartesianProduct | 4 | | 19612941 | 1 | 0 | 9040 | | 0.054 | In Pipeline 2 | +| |\ +----+---------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ +| | +Filter | 5 | end.trail = $autolist_1 | 22143 | 1 | 177146 | | | | | +| | | +----+---------------------------------------------------------------------+----------------+-------+---------+----------------+ | | | +| | +NodeByLabelScan | 6 | end:N | 442865 | 88573 | 88574 | 392 | 1853/0 | 44.047 | Fused in Pipeline 1 | +| | +----+---------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ +| +Filter | 7 | start.trail = $autolist_0 | 4429 | 1 | 177146 | | | | | +| | +----+---------------------------------------------------------------------+----------------+-------+---------+----------------+ | | | +| +NodeByLabelScan | 8 | start:N | 88573 | 88573 | 88574 | 376 | 1853/0 | 57.818 | Fused in Pipeline 0 | ++------------------------------------+----+---------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------------+ + +Total database accesses: 533409, total allocated memory: 1346888 1 row -ready to start consuming query after 9 ms, results consumed after another 73 ms +ready to start consuming query after 4 ms, results consumed after another 106 ms ---- ====== @@ -683,14 +683,14 @@ CREATE CONSTRAINT unique_trail FOR (n:N) REQUIRE n.trail IS UNIQUE ---- This constraint will inform the planner of the uniqueness of `trail` values up front. -As a result, the simpler shortest path query (without a `CALL` subquery) will now generate a faster plan (using the `StatefulShortestPath(Into)`) operator with a cardinality of 1 for both the source and target nodes of the shortest path. +As a result, the simpler shortest path query (without a `CALL` subquery) will now generate a faster plan (using the `StatefulShortestPath(Into)` operator) with a cardinality of 1 for both the source and target nodes of the shortest path. .Find a shortest path between two nodes [source, cypher] ---- PROFILE MATCH p = ANY SHORTEST - (source:N {trail: ["C", "C", "A", "C", "A", "B", "B", "B", "A"]})--+ + (source:N {trail: ["C", "C", "A", "C", "A", "B", "B", "B", "A"]})--{2,} (target:N {trail: ["A", "B", "C", "A", "B", "C", "A", "B", "C"]}) RETURN length(p) AS pathLength ---- @@ -701,13 +701,13 @@ RETURN length(p) AS pathLength +------------------------------------+----+----------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +------------------------------------+----+----------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+ -| +ProduceResults | 0 | `length(p)` | 1 | 1 | 0 | 0 | 0/0 | 0.034 | | +| +ProduceResults | 0 | pathLength | 1 | 1 | 0 | 0 | 0/0 | 0.058 | | | | +----+----------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+ | -| +Projection | 1 | length((source)-[anon_19*]-(target)) AS `length(p)` | 1 | 1 | 17 | | 9/0 | 0.057 | | +| +Projection | 1 | length((source)-[anon_55*]-(target)) AS pathLength | 1 | 1 | 17 | | 9/0 | 0.081 | | | | +----+----------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+ | -| +StatefulShortestPath(Into, Trail) | 2 | SHORTEST 1 (source) ((`anon_15`)-[`anon_16`]-(`anon_17`)){1, } (target) | 1 | 1 | 1936 | 990288 | 205/0 | 1.658 | In Pipeline 1 | +| +StatefulShortestPath(Into, Trail) | 2 | SHORTEST 1 (source) ((`anon_51`)-[`anon_52`]-(`anon_53`)){2, } (target) | 1 | 1 | 1952 | 1337568 | 209/0 | 2.213 | In Pipeline 1 | | | +----+----------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+ -| +MultiNodeIndexSeek | 3 | UNIQUE source:N(trail) WHERE trail = $autolist_0, UNIQUE target:N(trail) WHERE trail = $autolist_1 | 1 | 1 | 4 | 376 | 4/2 | 0.332 | In Pipeline 0 | +| +MultiNodeIndexSeek | 3 | UNIQUE source:N(trail) WHERE trail = $autolist_0, UNIQUE target:N(trail) WHERE trail = $autolist_1 | 1 | 1 | 4 | 376 | 1/5 | 0.400 | In Pipeline 0 | +------------------------------------+----+----------------------------------------------------------------------------------------------------+----------------+------+---------+----------------+------------------------+-----------+---------------+ Total database accesses: 1957, total allocated memory: 990608 @@ -722,7 +722,7 @@ ready to start consuming query after 48 ms, results consumed after another 3 ms === Limitations of enforcing a single source-target node pair Enforcing a single source-target node pair is not always preferable. -With one source and many targets, rewriting a shortest path query using a `CALL` subquery forces the planner to use `StatefulShortestPath(Into)`, which runs once per target node. +With one source and many targets, rewriting a shortest path query using a `CALL` subquery forces the planner to use either the `ShortestPath` or `StatefulShortestPath(Into)` operator, which runs once per target node. While this is efficient for a single pair, it can become slower as the number of targets increases because it forces the planner to traverse the graph for each individual pair of source-target nodes. In such cases, it may be more efficient to let the planner use `StatefulShortestPath(All)`, which expands across the graph once and returns all matches. @@ -736,7 +736,7 @@ Consider the following query, which does not specify a unique target node and ge ---- PROFILE MATCH p = ANY SHORTEST - (start:N {trail: ["C", "C", "A", "C", "A", "B", "B", "B", "A"]})--+ + (start:N {trail: ["C", "C", "A", "C", "A", "B", "B", "B", "A"]})--{2,} (end:N {level: 9}) RETURN count(*) AS pathCount ---- @@ -756,28 +756,28 @@ Due to the existence of multiple target nodes without a specified, unique proper .Query Plan [source, role="queryplan"] ---- -+-----------------------------------+----+------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------+ -| Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | -+-----------------------------------+----+------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------+ -| +ProduceResults | 0 | `count(*)` | 1 | 1 | 0 | 0 | 0/0 | 0.015 | | -| | +----+------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+ | -| +EagerAggregation | 1 | count(*) AS `count(*)` | 1 | 1 | 0 | 40 | 0/0 | 0.097 | In Pipeline 2 | -| | +----+------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------+ -| +StatefulShortestPath(All, Trail) | 2 | SHORTEST 1 (start) ((`anon_3`)-[`anon_4`]-(`anon_5`)){1, } (end) | 8052 | 19682 | 373974 | 81274328 | 65235/0 | 330.475 | In Pipeline 1 | -| | | | expanding from: start | | | | | | | | -| | | | inlined predicates: end.level = $autoint_1 | | | | | | | | -| | | | end:N | | | | | | | | -| | +----+------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------+ -| +NodeUniqueIndexSeek | 3 | UNIQUE start:N(trail) WHERE trail = $autolist_0 | 1 | 1 | 2 | 376 | 3/0 | 0.106 | In Pipeline 0 | -+-----------------------------------+----+------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------+ - -Total database accesses: 373976, total allocated memory: 81274688 ++-----------------------------------+----+---------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------+ +| Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | ++-----------------------------------+----+---------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------+ +| +ProduceResults | 0 | pathCount | 1 | 1 | 0 | 0 | 0/0 | 0.082 | | +| | +----+---------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+ | +| +EagerAggregation | 1 | count(*) AS pathCount | 1 | 1 | 0 | 40 | 0/0 | 1.151 | In Pipeline 2 | +| | +----+---------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------+ +| +StatefulShortestPath(All, Trail) | 2 | SHORTEST 1 (start) ((`anon_19`)-[`anon_20`]-(`anon_21`)){2, } (end) | 8052 | 19682 | 373982 | 82162292 | 65705/0 | 455.921 | In Pipeline 1 | +| | | | expanding from: start | | | | | | | | +| | | | inlined predicates: end.level = $autoint_1 | | | | | | | | +| | | | end:N | | | | | | | | +| | +----+---------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------+ +| +NodeUniqueIndexSeek | 3 | UNIQUE start:N(trail) WHERE trail = $autolist_0 | 1 | 1 | 2 | 376 | 3/0 | 0.509 | In Pipeline 0 | ++-----------------------------------+----+---------------------------------------------------------------------+----------------+-------+---------+----------------+------------------------+-----------+---------------+ + +Total database accesses: 373984, total allocated memory: 82162652 1 row -ready to start consuming query after 40 ms, results consumed after another 331 ms +ready to start consuming query after 83 ms, results consumed after another 592 ms ---- -If the query is rewritten with a `CALL` subquery the planner will use `StatefulShortestPath(Into)` which performs separate traversals for each individual source-target node pairs. +If the query is rewritten with a `CALL` subquery the planner will use the `StatefulShortestPath(Into)` operator which performs separate traversals for each individual source-target node pairs. .Multi-target shortest path query rewritten with a `CALL` subquery [source, cypher] @@ -786,7 +786,7 @@ PROFILE MATCH (start:N {trail: ["C", "C", "A", "C", "A", "B", "B", "B", "A"]}), (end:N {level: 9}) CALL (start, end) { - MATCH p = ANY SHORTEST (start)--+(end) + MATCH p = ANY SHORTEST (start)--{2,}(end) RETURN p } RETURN count(*) AS pathCount @@ -798,25 +798,25 @@ RETURN count(*) AS pathCount +------------------------------------+----+----------------------------------------------------------------------------------------------------+----------------+-------+----------+----------------+------------------------+-----------+---------------+ | Operator | Id | Details | Estimated Rows | Rows | DB Hits | Memory (Bytes) | Page Cache Hits/Misses | Time (ms) | Pipeline | +------------------------------------+----+----------------------------------------------------------------------------------------------------+----------------+-------+----------+----------------+------------------------+-----------+---------------+ -| +ProduceResults | 0 | `count(*)` | 1 | 1 | 0 | 0 | 0/0 | 0.120 | | +| +ProduceResults | 0 | pathCount | 1 | 1 | 0 | 0 | 0/0 | 0.185 | | | | +----+----------------------------------------------------------------------------------------------------+----------------+-------+----------+----------------+------------------------+-----------+ | -| +EagerAggregation | 1 | count(*) AS `count(*)` | 1 | 1 | 0 | 40 | 0/0 | 0.172 | In Pipeline 2 | +| +EagerAggregation | 1 | count(*) AS pathCount | 1 | 1 | 0 | 40 | 0/0 | 1.571 | In Pipeline 2 | | | +----+----------------------------------------------------------------------------------------------------+----------------+-------+----------+----------------+------------------------+-----------+---------------+ -| +Projection | 2 | (start)-[anon_7*]-(end) AS p | 8052 | 19682 | 314930 | | 184197/0 | 35.430 | | +| +Projection | 2 | (start)-[anon_15*]-(end) AS p | 8052 | 19682 | 314930 | | 189543/0 | 67.007 | | | | +----+----------------------------------------------------------------------------------------------------+----------------+-------+----------+----------------+------------------------+-----------+ | -| +StatefulShortestPath(Into, Trail) | 3 | SHORTEST 1 (start) ((`anon_3`)-[`anon_4`]-(`anon_5`)){1, } (end) | 8052 | 19682 | 32672226 | 157866776 | 3588500/0 | 14200.424 | In Pipeline 1 | +| +StatefulShortestPath(Into, Trail) | 3 | SHORTEST 1 (start) ((`anon_11`)-[`anon_12`]-(`anon_13`)){2, } (end) | 8052 | 19682 | 32986690 | 221424672 | 3775866/0 | 22680.410 | In Pipeline 1 | | | +----+----------------------------------------------------------------------------------------------------+----------------+-------+----------+----------------+------------------------+-----------+---------------+ -| +MultiNodeIndexSeek | 4 | UNIQUE start:N(trail) WHERE trail = $autolist_0, RANGE INDEX end:N(level) WHERE level = $autoint_1 | 8052 | 19683 | 19686 | 376 | 108/0 | 4.014 | In Pipeline 0 | +| +MultiNodeIndexSeek | 4 | UNIQUE start:N(trail) WHERE trail = $autolist_0, RANGE INDEX end:N(level) WHERE level = $autoint_1 | 8052 | 19683 | 19686 | 376 | 57/0 | 12.979 | In Pipeline 0 | +------------------------------------+----+----------------------------------------------------------------------------------------------------+----------------+-------+----------+----------------+------------------------+-----------+---------------+ -Total database accesses: 33006842, total allocated memory: 157867272 +Total database accesses: 33321306, total allocated memory: 221425168 1 row -ready to start consuming query after 32 ms, results consumed after another 14244 ms +ready to start consuming query after 49 ms, results consumed after another 22774 ms ---- As the plan shows, in this scenario it is not more efficient to enforce a single source-target node pair. -On the contrary, doing so ensures that `StatefulShortestPath(Into)` is executed `19682` times, once for each source-target node pair, thereby generating a more expensive query. +On the contrary, doing so ensures that the `StatefulShortestPath(Into)` operator is executed `19682` times, once for each source-target node pair, thereby generating a more expensive query. ===== @@ -845,8 +845,7 @@ Or, when the estimated cardinality of the source and target nodes in a shortest * Selector is one of: `SHORTEST 1`, `ANY`, `ANY SHORTEST`, `ALL SHORTEST`, `SHORTEST GROUP`, or `SHORTEST 1 GROUP`. * There is only one relationship pattern. * If the pattern is a xref:patterns/variable-length-patterns.adoc#quantified-path-patterns[quantified path pattern] in the form of `\(()-[]-())`, or is a xref:patterns/variable-length-patterns.adoc#quantified-relationships[quantified-relationship], and it uses a filter that can be applied directly to the relationship. -* If the pattern is a quantified path pattern or a quantified relationship and the relationship pattern is directed, the lower bound of the xref:patterns/reference.adoc#quantifiers[quantifier] is 0 or 1. -If the relationship pattern is directed, the lower bound is 0. +* If the pattern is a quantified path pattern or a quantified relationship and the lower bound of the xref:patterns/reference.adoc#quantifiers[quantifier] is 0 or 1. * In the case of a quantified path pattern, there are no node variables declared inside the quantified path pattern that are referenced elsewhere. | `StatefulShortestPath(Into)` From f17b40605b69d294c83eed33f13299b5f4737973 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Wed, 17 Sep 2025 10:42:42 +0200 Subject: [PATCH 71/72] standardise procedure formatting to use `()` (#1389) --- modules/ROOT/pages/clauses/call.adoc | 2 +- modules/ROOT/pages/genai-integrations.adoc | 16 +++---- .../semantic-indexes/full-text-indexes.adoc | 16 +++---- .../semantic-indexes/vector-indexes.adoc | 18 ++++---- modules/ROOT/pages/indexes/syntax.adoc | 10 ++--- .../runtimes/reference.adoc | 44 +++++++++---------- 6 files changed, 53 insertions(+), 53 deletions(-) diff --git a/modules/ROOT/pages/clauses/call.adoc b/modules/ROOT/pages/clauses/call.adoc index b0cb32ac4..5f90ab942 100644 --- a/modules/ROOT/pages/clauses/call.adoc +++ b/modules/ROOT/pages/clauses/call.adoc @@ -208,7 +208,7 @@ RETURN count(*) AS results `YIELD` can be used to filter for specific results. This requires knowing the names of the arguments within a procedure's signature, which can either be found in the link:{neo4j-docs-base-uri}/operations-manual/current/procedures/[Operations Manual -> Procedures] or in the `signature` column returned by a `SHOW PROCEDURES` command (see example below). -.Find the argument names of `db.propertyKeys` +.Find the argument names of `db.propertyKeys()` [source, cypher] ---- SHOW PROCEDURES YIELD name, signature diff --git a/modules/ROOT/pages/genai-integrations.adoc b/modules/ROOT/pages/genai-integrations.adoc index 07ee4a344..7751c8e79 100644 --- a/modules/ROOT/pages/genai-integrations.adoc +++ b/modules/ROOT/pages/genai-integrations.adoc @@ -65,17 +65,17 @@ This function sends one API request every time it is called, which may result in If you want to generate many embeddings at once, use xref:genai-integrations.adoc#multiple-embeddings[]. -Use the `db.create.setNodeVectorProperty` procedure to store an embedding to a node property. +Use the `db.create.setNodeVectorProperty()` procedure to store an embedding to a node property. -.Signature for `db.create.setNodeVectorProperty` label:procedure[] +.Signature for `db.create.setNodeVectorProperty()` label:procedure[] [source,syntax] ---- db.create.setNodeVectorProperty(node :: NODE, key :: STRING, vector :: ANY) ---- -Use the `db.create.setRelationshipVectorProperty` procedure to store an embedding to a relationship property. +Use the `db.create.setRelationshipVectorProperty()` procedure to store an embedding to a relationship property. -.Signature for `db.create.setRelationshipVectorProperty` label:procedure[] +.Signature for `db.create.setRelationshipVectorProperty()` label:procedure[] [source,syntax] ---- db.create.setRelationshipVectorProperty(relationship :: RELATIONSHIP, key :: STRING, vector :: ANY) @@ -122,14 +122,14 @@ This result only shows the first 4 of the 1536 numbers in the embedding. [[multiple-embeddings]] == Generating a batch of embeddings and store them -Use the `genai.vector.encodeBatch` procedure to generate many vector embeddings with a single API request. +Use the `genai.vector.encodeBatch()` procedure to generate many vector embeddings with a single API request. This procedure takes a list of resources as an input, and returns the same number of result rows, instead of a single one. [NOTE] This procedure attempts to generate embeddings for all supplied resources in a single API request. Therefore, it is recommended to see the respective provider's documentation for details on, for example, the maximum number of embeddings that can be generated per request. -.Signature for `genai.vector.encodeBatch` label:procedure[] +.Signature for `genai.vector.encodeBatch()` label:procedure[] [source,syntax] ---- genai.vector.encodeBatch(resources :: LIST, provider :: STRING, configuration :: MAP = {}) :: (index :: INTEGER, resource :: STRING, vector :: LIST) @@ -166,7 +166,7 @@ CALL db.create.setNodeVectorProperty(moviesList[index], 'embedding', vector) // <1> xref:functions/aggregating.adoc#functions-collect[Collect] all 20 `Movie` nodes into a `LIST`. <2> Use a xref:expressions/list-expressions.adoc#list-comprehension[list comprehension] (`[]`) to extract the `title` and `plot` properties of the movies in `moviesList` into a new `LIST`. -<3> `db.create.setNodeVectorProperty` is run for each `vector` returned by `genai.vector.encodeBatch`, and stores that vector as a property named `embedding` on the corresponding node. +<3> `db.create.setNodeVectorProperty()` is run for each `vector` returned by `genai.vector.encodeBatch()`, and stores that vector as a property named `embedding` on the corresponding node. ==== .Create embeddings from a large number of properties and store them @@ -208,7 +208,7 @@ For an alternative method more suitable to processing large amounts of data, see == GenAI providers The following GenAI providers are supported for generating vector embeddings. -Each provider has its own configuration map that can be passed to `genai.vector.encode` or `genai.vector.encodeBatch`. +Each provider has its own configuration map that can be passed to `genai.vector.encode()` or `genai.vector.encodeBatch()`. [[vertex-ai]] === Vertex AI diff --git a/modules/ROOT/pages/indexes/semantic-indexes/full-text-indexes.adoc b/modules/ROOT/pages/indexes/semantic-indexes/full-text-indexes.adoc index e14812ad2..7f3b1dbc6 100644 --- a/modules/ROOT/pages/indexes/semantic-indexes/full-text-indexes.adoc +++ b/modules/ROOT/pages/indexes/semantic-indexes/full-text-indexes.adoc @@ -124,7 +124,7 @@ OPTIONS { <1> The `fulltext.analyzer` setting can be used to configure an index-specific analyzer. In this case, it is set to the `english` analyzer. -The possible values for the `fulltext.analyzer` setting can be listed with the `db.index.fulltext.listAvailableAnalyzers` procedure. +The possible values for the `fulltext.analyzer` setting can be listed with the `db.index.fulltext.listAvailableAnalyzers()` procedure. <2> The `fulltext.eventually_consistent` setting, if set to `true`, will put the index in an _eventually consistent_ update mode. This means that updates will be applied in a background thread "as soon as possible", instead of during a transaction commit, which is true for other indexes. @@ -134,13 +134,13 @@ For more information on how to configure full-text indexes, refer to the link:{n == Query full-text indexes Unlike xref:indexes/search-performance-indexes/managing-indexes.adoc[search-performance indexes], full-text indexes are not automatically used by the xref:planning-and-tuning/execution-plans.adoc[Cypher query planner]. -To query a full-text index, use either the link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_fulltext_queryNodes[`db.index.fulltext.queryNodes`] or the link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_fulltext_queryRelationships[`db.index.fulltext.queryRelationships`] procedure. +To query a full-text index, use either the link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_fulltext_queryNodes[`db.index.fulltext.queryNodes()`] or the link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_fulltext_queryRelationships[`db.index.fulltext.queryRelationships()`] procedure. [NOTE] An index cannot be used while its `state` is `POPULATING`, which occurs immediately after it is created. To check the `state` of a full-text index -- whether it is `ONLINE` (usable) or `POPULATING` (still being built; the `populationPercent` column shows the progress of the index creation) -- run the following command: `SHOW FULLTEXT INDEXES`. -This query uses the `db.index.fulltext.queryNodes` to look for `nils` in the previously created full-text index `namesAndTeams`: +This query uses the `db.index.fulltext.queryNodes()` procedure to look for `nils` in the previously created full-text index `namesAndTeams`: .Query a full-text index for a node property [source, cypher] @@ -172,7 +172,7 @@ This is possible because both the property values that are indexed, and the quer The `score` results are always returned in _descending score order_, where the best matching result entry is put first. -This query uses the `db.index.fulltext.queryRelationships` to query the previously created `communications` full-text index for any `message` containing "meeting": +This query uses the `db.index.fulltext.queryRelationships()` procedure to query the previously created `communications` full-text index for any `message` containing "meeting": .Query a full-text index for a relationship property [source, cypher] @@ -362,19 +362,19 @@ The procedures for full-text indexes are listed in the table below: | Usage | Procedure/Command | Description | Eventually consistent indexes. -| https://neo4j.com/docs/operations-manual/current/procedures/#procedure_db_index_fulltext_awaitEventuallyConsistentIndexRefresh[`db.index.fulltext.awaitEventuallyConsistentIndexRefresh`] +| https://neo4j.com/docs/operations-manual/current/procedures/#procedure_db_index_fulltext_awaitEventuallyConsistentIndexRefresh[`db.index.fulltext.awaitEventuallyConsistentIndexRefresh()`] | Wait for the updates from recently committed transactions to be applied to any eventually-consistent full-text indexes. | List available analyzers. -| https://neo4j.com/docs/operations-manual/current/procedures/#procedure_db_index_fulltext_listAvailableAnalyzers[`db.index.fulltext.listAvailableAnalyzers`] +| https://neo4j.com/docs/operations-manual/current/procedures/#procedure_db_index_fulltext_listAvailableAnalyzers[`db.index.fulltext.listAvailableAnalyzers()`] | List the available analyzers that the full-text indexes can be configured with. | Use full-text node index. -| https://neo4j.com/docs/operations-manual/current/procedures/#procedure_db_index_fulltext_queryNodes[`db.index.fulltext.queryNodes`] +| https://neo4j.com/docs/operations-manual/current/procedures/#procedure_db_index_fulltext_queryNodes[`db.index.fulltext.queryNodes()`] | Query the given full-text index. Returns the matching nodes and their Lucene query score, ordered by score. | Use full-text relationship index. -| https://neo4j.com/docs/operations-manual/current/procedures/#procedure_db_index_fulltext_queryRelationships[`db.index.fulltext.queryRelationships`] +| https://neo4j.com/docs/operations-manual/current/procedures/#procedure_db_index_fulltext_queryRelationships[`db.index.fulltext.queryRelationships()`] | Query the given full-text index. Returns the matching relationships and their Lucene query score, ordered by score. |=== diff --git a/modules/ROOT/pages/indexes/semantic-indexes/vector-indexes.adoc b/modules/ROOT/pages/indexes/semantic-indexes/vector-indexes.adoc index a6b1b78b4..efe955296 100644 --- a/modules/ROOT/pages/indexes/semantic-indexes/vector-indexes.adoc +++ b/modules/ROOT/pages/indexes/semantic-indexes/vector-indexes.adoc @@ -180,13 +180,13 @@ Default value::: `100` [[query-vector-index]] == Query vector indexes -To query a node vector index, use the link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_vector_queryNodes[`db.index.vector.queryNodes`] procedure. +To query a node vector index, use the link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_vector_queryNodes[`db.index.vector.queryNodes()`] procedure. [NOTE] An index cannot be used while its `state` is `POPULATING`, which occurs immediately after it is created. To check the `state` of a vector index -- whether it is `ONLINE` (usable) or `POPULATING` (still being built; the `populationPercent` column shows the progress of the index creation) -- run the following command: `SHOW VECTOR INDEXES`. -.Signature for `db.index.vector.queryNodes` +.Signature for `db.index.vector.queryNodes()` [source,syntax] ---- db.index.vector.queryNodes(indexName :: STRING, numberOfNearestNeighbours :: INTEGER, query :: ANY) :: (node :: NODE, score :: FLOAT) @@ -228,13 +228,13 @@ If the query vector itself is not wanted, adding the predicate `WHERE score < 1` To query a relationship vector index, use the link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_vector_queryRelationships[`db.index.vector.queryRelationships`] procedure. -.Signature for `db.index.vector.queryRelationships` +.Signature for `db.index.vector.queryRelationships()` [source,syntax] ---- db.index.vector.queryRelationships(indexName :: STRING, numberOfNearestNeighbours :: INTEGER, query :: ANY) :: (relationship :: RELATIONSHIP, score :: FLOAT) ---- -`db.index.vector.queryRelationships` has the same argument descriptions as `db.index.vector.queryNodes`. +`db.index.vector.queryRelationships()` has the same argument descriptions as `db.index.vector.queryNodes()`. [TIP] Use xref:functions/vector.adoc[] to compute the similarity score between two specific vector pairs without using a vector index. @@ -471,21 +471,21 @@ image::euclidean-similarity-equation.svg["The Euclidean of vector v and vector u | Usage | Procedure | Description | Use node vector index. -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_vector_queryNodes[`db.index.vector.queryNodes`] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_vector_queryNodes[`db.index.vector.queryNodes()`] | Query the given node vector index. Returns the requested number of approximate nearest neighbor nodes and their similarity score, ordered by score. | Use relationship vector index. -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_vector_queryRelationships[`db.index.vector.queryRelationships`] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_vector_queryRelationships[`db.index.vector.queryRelationships()`] | Query the given relationship vector index. Returns the requested number of approximate nearest neighbor relationships and their similarity score, ordered by score. | Set node vector property. -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_create_setNodeVectorProperty[`db.create.setNodeVectorProperty`] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_create_setNodeVectorProperty[`db.create.setNodeVectorProperty()`] | Update a given node property with the given vector in a more space-efficient way than directly using xref:clauses/set.adoc#set-set-a-property[`SET`]. | Set relationship vector property. -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_create_setRelationshipVectorProperty[`db.create.setRelationshipVectorProperty`] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_create_setRelationshipVectorProperty[`db.create.setRelationshipVectorProperty()`] | Update a given relationship property with the given vector in a more space-efficient way than directly using xref:clauses/set.adoc#set-set-a-property[`SET`]. |=== @@ -514,7 +514,7 @@ The following table lists the issues and, if fixed, the version in which they we |=== | Known issues | Fixed in -| The creation of a vector index using the legacy procedure link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_vector_createNodeIndex[`db.index.vector.createNodeIndex`] may fail with an error in Neo4j 5.18 and later if the database was last written to with a version prior to Neo4j 5.11, and the legacy procedure is the first write operation used on the newer version. +| The creation of a vector index using the legacy procedure link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_index_vector_createNodeIndex[`db.index.vector.createNodeIndex()`] may fail with an error in Neo4j 5.18 and later if the database was last written to with a version prior to Neo4j 5.11, and the legacy procedure is the first write operation used on the newer version. In Neo4j 5.20, the error was clarified. [TIP] -- diff --git a/modules/ROOT/pages/indexes/syntax.adoc b/modules/ROOT/pages/indexes/syntax.adoc index faae61678..8ca4b2e38 100644 --- a/modules/ROOT/pages/indexes/syntax.adoc +++ b/modules/ROOT/pages/indexes/syntax.adoc @@ -177,7 +177,7 @@ ON EACH “[“ r.propertyName[, ...] “]” The following settings can be specified for full-text indexes: -* `fulltext.analyzer` - specifies what analyzer to use (the `db.index.fulltext.listAvailableAnalyzers` procedure lists what analyzers are available). +* `fulltext.analyzer` - specifies what analyzer to use (the `db.index.fulltext.listAvailableAnalyzers()` procedure lists what analyzers are available). * `fulltext.eventually_consistent` - specifies whether a full-text index is eventually consistent. If set to `true`, it will ensure that updates from committing transactions are applied in a background thread. @@ -250,13 +250,13 @@ To use them, specific procedures must be called. Their signatures can be seen be [[query-full-text-index]] === Full-text indexes -.Query full-text index on nodes: db.index.fulltext.queryNodes +.Query full-text index on nodes: db.index.fulltext.queryNodes() [source,syntax] ---- CALL db.index.fulltext.queryNodes(indexName :: STRING, queryString :: STRING, options = {} :: MAP) ---- -.Query full-text index on relationships: db.index.fulltext.queryRelationships +.Query full-text index on relationships: db.index.fulltext.queryRelationships() [source, syntax] ---- CALL db.index.fulltext.queryRelationships(indexName :: STRING, queryString :: STRING, options = {} :: MAP) @@ -275,13 +275,13 @@ For more information, see xref:indexes/semantic-indexes/full-text-indexes.adoc#q [[query-vector-index]] === Vector indexes -.Query vector-text index on nodes: db.index.vector.queryNodes +.Query vector-text index on nodes: db.index.vector.queryNodes() [source,syntax] ---- CALL db.index.vector.queryNodes(indexName :: STRING, numberOfNearestNeighbours :: INTEGER, query :: LIST) ---- -.Query vector-text index on relationships: db.index.vector.queryRelationships +.Query vector-text index on relationships: db.index.vector.queryRelationships() [source,syntax] ---- CALL db.index.vector.queryRelationships(indexName :: STRING, numberOfNearestNeighbours :: INTEGER, query :: LIST) diff --git a/modules/ROOT/pages/planning-and-tuning/runtimes/reference.adoc b/modules/ROOT/pages/planning-and-tuning/runtimes/reference.adoc index fb94d1b2e..3117ce78c 100644 --- a/modules/ROOT/pages/planning-and-tuning/runtimes/reference.adoc +++ b/modules/ROOT/pages/planning-and-tuning/runtimes/reference.adoc @@ -103,7 +103,7 @@ Procedures and functions that read the database are supported by the parallel ru Apart from this, there are two categories of procedures and functions to keep in mind when using the parallel runtime. The first can be categorized as _updating procedures_. -These are procedures that update the graph with write queries, such as the Neo4j procedures link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_createLabel[db.createLabel] and link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_createProperty[db.createProperty]. +These are procedures that update the graph with write queries, such as the Neo4j procedures link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_createLabel[`db.createLabel()`] and link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_createProperty[`db.createProperty()`]. If such procedures are called in a query run on the parallel runtime, the query will fail. The second can be categorized as _non-thread-safe_ procedures and functions. @@ -129,47 +129,47 @@ Instead the query will automatically run on the pipelined runtime. | Procedure -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_awaitIndex[db.awaitIndex] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_awaitIndex[`db.awaitIndex()`] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_awaitIndexes[db.awaitIndexes] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_awaitIndexes[`db.awaitIndexes()`] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_checkpoint[db.checkpoint] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_checkpoint[`db.checkpoint()`] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_info[db.info] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_info[`db.info()`] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_labels[db.labels] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_labels[`db.labels()`] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_listLocks[db.listLocks] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_listLocks[`db.listLocks()`] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_ping[db.ping] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_ping[`db.ping()`] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_propertyKeys[db.propertyKeys] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_propertyKeys[`db.propertyKeys()`] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_prepareForReplanning[db.prepareForReplanning] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_prepareForReplanning[`db.prepareForReplanning()`] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_relationshipTypes[db.relationshipTypes] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_relationshipTypes[`db.relationshipTypes()`] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_resampleIndex[db.resampleIndex] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_resampleIndex[`db.resampleIndex()`] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_resampleOutdatedIndexes[db.resampleOutdatedIndexes] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_resampleOutdatedIndexes[`db.resampleOutdatedIndexes()`] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_schema_nodeTypeProperties[db.schema.nodeTypeProperties] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_schema_nodeTypeProperties[`db.schema.nodeTypeProperties()`] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_schema_relTypeProperties[db.schema.relTypeProperties] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_schema_relTypeProperties[`db.schema.relTypeProperties()`] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_schema_visualization[db.schema.visualization] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_db_schema_visualization[`db.schema.visualization()`] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_dbms_checkConfigValue[dbms.checkConfigValue] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_dbms_checkConfigValue[`dbms.checkConfigValue()`] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_dbms_listActiveLocks[dbms.listActiveLocks] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_dbms_listActiveLocks[`dbms.listActiveLocks()`] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_dbms_listPools[dbms.listPools] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_dbms_listPools[`dbms.listPools()`] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_dbms_scheduler_failedJobs[dbms.scheduler.failedJobs] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_dbms_scheduler_failedJobs[`dbms.scheduler.failedJobs()`] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_dbms_scheduler_groups[dbms.scheduler.groups] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_dbms_scheduler_groups[`dbms.scheduler.groups()`] -| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_dbms_scheduler_jobs[dbms.scheduler.jobs] +| link:{neo4j-docs-base-uri}/operations-manual/current/procedures/#procedure_dbms_scheduler_jobs[`dbms.scheduler.jobs()`] |=== From c042eef7bcff7a1103b77e0e781c6346a731fbe5 Mon Sep 17 00:00:00 2001 From: Richard Sill <156673635+rsill-neo4j@users.noreply.github.com> Date: Mon, 29 Sep 2025 10:53:16 +0200 Subject: [PATCH 72/72] Group math and temporal functions (#1393) tried to be minimal about this --- modules/ROOT/content-nav.adoc | 14 +++++++------ modules/ROOT/pages/functions/index.adoc | 20 +++++++++++++------ .../functions/mathematical-logarithmic.adoc | 2 +- .../pages/functions/mathematical-numeric.adoc | 2 +- .../functions/mathematical-trigonometric.adoc | 2 +- .../pages/functions/temporal/duration.adoc | 2 +- .../ROOT/pages/functions/temporal/format.adoc | 2 +- .../ROOT/pages/functions/temporal/index.adoc | 2 +- 8 files changed, 28 insertions(+), 18 deletions(-) diff --git a/modules/ROOT/content-nav.adoc b/modules/ROOT/content-nav.adoc index 1779cdcb4..e51eb3bea 100644 --- a/modules/ROOT/content-nav.adoc +++ b/modules/ROOT/content-nav.adoc @@ -91,16 +91,18 @@ ** xref:functions/graph.adoc[] ** xref:functions/list.adoc[] ** xref:functions/load-csv.adoc[] -** xref:functions/mathematical-logarithmic.adoc[] -** xref:functions/mathematical-numeric.adoc[] -** xref:functions/mathematical-trigonometric.adoc[] +** Mathematical functions +*** xref:functions/mathematical-logarithmic.adoc[] +*** xref:functions/mathematical-numeric.adoc[] +*** xref:functions/mathematical-trigonometric.adoc[] ** xref:functions/predicate.adoc[] ** xref:functions/scalar.adoc[] ** xref:functions/spatial.adoc[] ** xref:functions/string.adoc[] -** xref:functions/temporal/duration.adoc[] -** xref:functions/temporal/index.adoc[] -** xref:functions/temporal/format.adoc[] +** Temporal functions +*** xref:functions/temporal/duration.adoc[] +*** xref:functions/temporal/index.adoc[] +*** xref:functions/temporal/format.adoc[] ** xref:functions/user-defined.adoc[] ** xref:functions/vector.adoc[] diff --git a/modules/ROOT/pages/functions/index.adoc b/modules/ROOT/pages/functions/index.adoc index d24012d48..0bde5f886 100644 --- a/modules/ROOT/pages/functions/index.adoc +++ b/modules/ROOT/pages/functions/index.adoc @@ -207,8 +207,12 @@ LOAD CSV functions can be used to get information about the file that is process |=== +[[header-query-functions-mathematical]] +== Mathematical functions + + [[header-query-functions-logarithmic]] -== Logarithmic functions +=== Logarithmic functions These functions all operate on numerical expressions only, and will return an error if used on any other values. @@ -240,7 +244,7 @@ These functions all operate on numerical expressions only, and will return an er [[header-query-functions-numeric]] -== Numeric functions +=== Numeric functions These functions all operate on numerical expressions only, and will return an error if used on any other values. @@ -280,7 +284,7 @@ These functions all operate on numerical expressions only, and will return an er [[header-query-functions-trigonometric]] -== Trigonometric functions +=== Trigonometric functions These functions all operate on numerical expressions only, and will return an error if used on any other values. @@ -613,8 +617,12 @@ If the points are in a Cartesian CRS, the function returns the Euclidean distanc |=== +[[header-query-functions-temporal]] +== Temporal functions + + [[header-query-functions-temporal-duration]] -== Temporal duration functions +=== Duration functions `DURATION` values of the xref::values-and-types/temporal.adoc[temporal types] can be created manipulated using the following functions: @@ -645,7 +653,7 @@ If the points are in a Cartesian CRS, the function returns the Euclidean distanc |=== [[header-query-functions-temporal-instant-types]] -== Temporal instant types functions +=== Instant type functions Values of the xref::values-and-types/temporal.adoc[temporal types] -- `DATE`, `ZONED TIME`, `LOCAL TIME`, `ZONED DATETIME`, and `LOCAL DATETIME` -- can be created manipulated using the following functions: @@ -766,7 +774,7 @@ Values of the xref::values-and-types/temporal.adoc[temporal types] -- `DATE`, `Z [role=label--cypher-25-only label--new-Neo4j-2025.09] [[header-query-functions-temporal-format]] -== Temporal format functions +=== Format functions These functions format temporal instance and duration values: diff --git a/modules/ROOT/pages/functions/mathematical-logarithmic.adoc b/modules/ROOT/pages/functions/mathematical-logarithmic.adoc index 412c69268..341c96e93 100644 --- a/modules/ROOT/pages/functions/mathematical-logarithmic.adoc +++ b/modules/ROOT/pages/functions/mathematical-logarithmic.adoc @@ -2,7 +2,7 @@ :table-caption!: [[query-functions-logarithmic]] -= Mathematical functions - logarithmic += Logarithmic functions Logarithmic mathematical functions operate on numeric expressions only, and will return an error if used on any other values. See also xref:expressions/mathematical-operators.adoc[Mathematical operators]. diff --git a/modules/ROOT/pages/functions/mathematical-numeric.adoc b/modules/ROOT/pages/functions/mathematical-numeric.adoc index a5dea7961..7cc662f81 100644 --- a/modules/ROOT/pages/functions/mathematical-numeric.adoc +++ b/modules/ROOT/pages/functions/mathematical-numeric.adoc @@ -2,7 +2,7 @@ :table-caption!: [[query-functions-numeric]] -= Mathematical functions - numeric += Numeric functions Numeric mathematical functions operate on numeric expressions only, and will return an error if used on any other values. See also xref:expressions/mathematical-operators.adoc[Mathematical operators]. diff --git a/modules/ROOT/pages/functions/mathematical-trigonometric.adoc b/modules/ROOT/pages/functions/mathematical-trigonometric.adoc index 9a5c12049..bb46450da 100644 --- a/modules/ROOT/pages/functions/mathematical-trigonometric.adoc +++ b/modules/ROOT/pages/functions/mathematical-trigonometric.adoc @@ -2,7 +2,7 @@ :table-caption!: [[query-functions-trigonometric]] -= Mathematical functions - trigonometric += Trigonometric functions Trigonometric mathematical functions operate on numeric expressions only, and will return an error if used on any other values. See also xref:expressions/mathematical-operators.adoc[Mathematical operators]. diff --git a/modules/ROOT/pages/functions/temporal/duration.adoc b/modules/ROOT/pages/functions/temporal/duration.adoc index 0612c789e..529705f46 100644 --- a/modules/ROOT/pages/functions/temporal/duration.adoc +++ b/modules/ROOT/pages/functions/temporal/duration.adoc @@ -1,7 +1,7 @@ :description: Cypher provides functions allowing for the creation and manipulation of temporal `DURATION` values. [[query-functions-temporal-duration]] -= Temporal functions - duration += Duration functions :table-caption!: Duration functions allow for the creation and manipulation of temporal `DURATION` values. diff --git a/modules/ROOT/pages/functions/temporal/format.adoc b/modules/ROOT/pages/functions/temporal/format.adoc index d7d7d4999..fe501ef6f 100644 --- a/modules/ROOT/pages/functions/temporal/format.adoc +++ b/modules/ROOT/pages/functions/temporal/format.adoc @@ -2,7 +2,7 @@ :table-caption!: [[query-functions-temporal-format]] -= Temporal functions - format += Format functions [role=label--cypher-25-only label--new-Neo4j-2025.09] [[query-functions-temporal-format-function]] diff --git a/modules/ROOT/pages/functions/temporal/index.adoc b/modules/ROOT/pages/functions/temporal/index.adoc index 5ca5b37b7..111f9ce6e 100644 --- a/modules/ROOT/pages/functions/temporal/index.adoc +++ b/modules/ROOT/pages/functions/temporal/index.adoc @@ -2,7 +2,7 @@ :table-caption!: [[query-functions-temporal-instant-types]] -= Temporal functions - instant types += Instant type functions Temporal functions allow for the creation and manipulation of values for each temporal type -- `DATE`, `ZONED TIME`, `LOCAL TIME`, `ZONED DATETIME`, and `LOCAL DATETIME`.