From 723c092072cf5727990b08d5d3840c1a14599173 Mon Sep 17 00:00:00 2001 From: Stefano Ottolenghi Date: Tue, 23 Jul 2024 11:23:06 +0200 Subject: [PATCH 1/9] Update version to 5.23. --- antora.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/antora.yml b/antora.yml index 986c4d003..3efd4c638 100644 --- a/antora.yml +++ b/antora.yml @@ -7,5 +7,5 @@ nav: asciidoc: attributes: neo4j-version: '5' - neo4j-version-minor: '5.22' - neo4j-version-exact: '5.22.0' + neo4j-version-minor: '5.23' + neo4j-version-exact: '5.23.0' From 87a4ebfa980a9da039534375cbbfa199cc66ded9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Aug 2024 10:04:34 +0200 Subject: [PATCH 2/9] Bump the prod-dependencies group with 2 updates (#1001) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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.8 to 3.1.9
Changelog

Sourced from @​antora/cli's changelog.

== 3.1.9 (2024-07-05)

=== Changed

  • site-generator: Detect and warn when an AsciiDoc extension is registered as an Antora extension, but do no skip it (#1141)
  • Replace "AsciiDoc extension" with "Asciidoctor extension" in log messages

=== Fixed

  • file-publisher: Wrap legacy stream on file when preparing files for output providers; remove listeners limit (#1139)
Commits

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

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

== 3.1.9 (2024-07-05)

=== Changed

  • site-generator: Detect and warn when an AsciiDoc extension is registered as an Antora extension, but do no skip it (#1141)
  • Replace "AsciiDoc extension" with "Asciidoctor extension" in log messages

=== Fixed

  • file-publisher: Wrap legacy stream on file when preparing files for output providers; remove listeners limit (#1139)
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 | 320 +++++++++++++++++++++++----------------------- package.json | 4 +- 2 files changed, 162 insertions(+), 162 deletions(-) diff --git a/package-lock.json b/package-lock.json index 74567389f..73be5181f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,8 @@ "version": "5.0.0", "license": "ISC", "dependencies": { - "@antora/cli": "^3.1.8", - "@antora/site-generator-default": "^3.1.8", + "@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", "@neo4j-antora/antora-page-roles": "^0.3.1", @@ -26,11 +26,11 @@ } }, "node_modules/@antora/asciidoc-loader": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/asciidoc-loader/-/asciidoc-loader-3.1.8.tgz", - "integrity": "sha512-tNa9YBA/wVA3RGmDhAF2i4s7TPWgMcZsKZF1+mFBiYmhVuIiI5mkp6sH2M+/8MlApydSOc8p375gudgLKPKrJw==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@antora/asciidoc-loader/-/asciidoc-loader-3.1.9.tgz", + "integrity": "sha512-flE27T2yI8TX7rUNjbBHWN3iR6s+kBuRBbUPncUFcWjx6mXzll8JLiTkxnc8JXHGzgKlveT+t5AkPYGACLfasg==", "dependencies": { - "@antora/logger": "3.1.8", + "@antora/logger": "3.1.9", "@antora/user-require-helper": "~2.0", "@asciidoctor/core": "~2.2" }, @@ -39,12 +39,12 @@ } }, "node_modules/@antora/cli": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/cli/-/cli-3.1.8.tgz", - "integrity": "sha512-V7oIbbAONovCQWX2tKG14YmX03p6tquLP753NJEjj7QXjiWmJhOI0JsTD+fvaXr7DzkDnjnls4OwFBmiHZIkOw==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@antora/cli/-/cli-3.1.9.tgz", + "integrity": "sha512-kCUqWX3G/9Pvf8SWZ45ioHwWdOc9uamy2E5/FFwyGiTeu4ubNbadOauLVvMzSZHUxVDnGxXwCsmmQ2HwM919ew==", "dependencies": { - "@antora/logger": "3.1.8", - "@antora/playbook-builder": "3.1.8", + "@antora/logger": "3.1.9", + "@antora/playbook-builder": "3.1.9", "@antora/user-require-helper": "~2.0", "commander": "~11.1" }, @@ -56,12 +56,12 @@ } }, "node_modules/@antora/content-aggregator": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/content-aggregator/-/content-aggregator-3.1.8.tgz", - "integrity": "sha512-xBWbw2fiQ6UMEIGzknvpDLUW0gTpyiQVaRXjAOYe0JDAAvifjt0uJuBsu7WrRe1FmRkfkrYj8BJ6Yv34NWZJuA==", + "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==", "dependencies": { "@antora/expand-path-helper": "~2.0", - "@antora/logger": "3.1.8", + "@antora/logger": "3.1.9", "@antora/user-require-helper": "~2.0", "braces": "~3.0", "cache-directory": "~2.0", @@ -92,12 +92,12 @@ } }, "node_modules/@antora/content-classifier": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/content-classifier/-/content-classifier-3.1.8.tgz", - "integrity": "sha512-0EzsZl7oBR5/MzLGIo3WwFeub2YtyDqExrELDmyDcJ4opZMREWfgUFu5Kls1MFAQPSbzEmQyIdyGacOrwTQHrg==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@antora/content-classifier/-/content-classifier-3.1.9.tgz", + "integrity": "sha512-PVJqwp5uvZE1PlpeJtb0p6al75fN+fmXGIC6DHcKysRnr0xo+sgz8X2r4mnNWdTWRqum2yVigMmmuXYTg3cJlQ==", "dependencies": { - "@antora/asciidoc-loader": "3.1.8", - "@antora/logger": "3.1.8", + "@antora/asciidoc-loader": "3.1.9", + "@antora/logger": "3.1.9", "mime-types": "~2.1", "vinyl": "~3.0" }, @@ -106,11 +106,11 @@ } }, "node_modules/@antora/document-converter": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/document-converter/-/document-converter-3.1.8.tgz", - "integrity": "sha512-dUGqgSdWnJYigbPZ9mDcoxITnufOEF5Vb5DKUxEstXe6MMn0yTZ03jJUbLs5YFgjqjhyULDMMIPo6no55zvx+w==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@antora/document-converter/-/document-converter-3.1.9.tgz", + "integrity": "sha512-pH7tQaIjcPsFdYkaBEAvA/5ki04IQwQGHoR+2jadKdMl6P+J5KA1VzNnMgyIL6gHn7auJIkoOKadfItRB9lHGQ==", "dependencies": { - "@antora/asciidoc-loader": "3.1.8" + "@antora/asciidoc-loader": "3.1.9" }, "engines": { "node": ">=16.0.0" @@ -125,9 +125,9 @@ } }, "node_modules/@antora/file-publisher": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/file-publisher/-/file-publisher-3.1.8.tgz", - "integrity": "sha512-crVP9EF5NZJDzeYPSpy74x35GRJIa4PfjfYBUxhzoNfqgX3JZcNuP8IwsWrSNyBDGO9a7ZCQ7+p4kpnVpF2x8Q==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@antora/file-publisher/-/file-publisher-3.1.9.tgz", + "integrity": "sha512-C0VwVjuFbE1CVpZDgwYR1gZCNr1tMw5vueyF9wHZH0KCqAsp9iwo7bwj8wKWMPogxcxdYhnAvtDJnYmYFCuDWQ==", "dependencies": { "@antora/expand-path-helper": "~2.0", "@antora/user-require-helper": "~2.0", @@ -139,9 +139,9 @@ } }, "node_modules/@antora/logger": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/logger/-/logger-3.1.8.tgz", - "integrity": "sha512-zbfjB1oMDDuuHjiRnBIbVTUBW1l1hCHbK4Q1oIRujnSz2LLjyY/aZfvgwODpREBGmvjkFb6Dlc9VUkKObQKi7g==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@antora/logger/-/logger-3.1.9.tgz", + "integrity": "sha512-MKuANodcX0lfRyiB+Rxl/Kv7UOxc2glzTYFoIoBB7uzxF0A+AhvUJDmpGQFRFN2ihxy99N3nLJmZpDebwXyE+A==", "dependencies": { "@antora/expand-path-helper": "~2.0", "pino": "~9.2", @@ -153,22 +153,22 @@ } }, "node_modules/@antora/navigation-builder": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/navigation-builder/-/navigation-builder-3.1.8.tgz", - "integrity": "sha512-u/USiJ1HhKSUxfUtLv7aQBFCJfBz6RtdzapKIy4z2Wol0FrwQwdaUhv7Amzabi2nrPEzkaNAM6ZX7iNPjGOw6Q==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@antora/navigation-builder/-/navigation-builder-3.1.9.tgz", + "integrity": "sha512-zyl2yNjK31Dl6TRJgnoFb4Czwt9ar3wLTycAdMeZ+U/8YcAUHD8z7NCssPFFvZ0BbUr00NP+gbqDmCr6yz32NQ==", "dependencies": { - "@antora/asciidoc-loader": "3.1.8" + "@antora/asciidoc-loader": "3.1.9" }, "engines": { "node": ">=16.0.0" } }, "node_modules/@antora/page-composer": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/page-composer/-/page-composer-3.1.8.tgz", - "integrity": "sha512-dw1ECMLYdf9GC9Zj8sHPd9Fgcg6BjU5BDbP+HI4omtOhLUiBVwWL1lZwFRVwgGMDgKSVgnxd9yotk+WTy2iLEg==", + "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==", "dependencies": { - "@antora/logger": "3.1.8", + "@antora/logger": "3.1.9", "handlebars": "~4.7", "require-from-string": "~2.0" }, @@ -177,9 +177,9 @@ } }, "node_modules/@antora/playbook-builder": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/playbook-builder/-/playbook-builder-3.1.8.tgz", - "integrity": "sha512-VDIP8cVnmyRcbg4orP2mE8HkqHTh7MRE+QyJ8XyHvFZsZjcS0Qw5UqPcrlmqXrzQKmJcBj2plqSv+wKXAYbNcQ==", + "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==", "dependencies": { "@iarna/toml": "~2.2", "convict": "~6.2", @@ -191,9 +191,9 @@ } }, "node_modules/@antora/redirect-producer": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/redirect-producer/-/redirect-producer-3.1.8.tgz", - "integrity": "sha512-ZSRnK/rXZ715baFheXMWEsyz0BpR+6RxFAem8A7rZPt2HMMKCOiuaFNdf9C97dxU5FxSELBIkRpqQ7eTRk+PPA==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@antora/redirect-producer/-/redirect-producer-3.1.9.tgz", + "integrity": "sha512-9OLwoMhqifsBxTebInh/5W16GdDsdj+YkKG3TiCASlAOYsDbuhbeRPFUlyKKSRkMrtKKnFgHR0Z3DNPXYlH2NQ==", "dependencies": { "vinyl": "~3.0" }, @@ -202,23 +202,23 @@ } }, "node_modules/@antora/site-generator": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/site-generator/-/site-generator-3.1.8.tgz", - "integrity": "sha512-xy1aUxTsCiC/KPlKQIoj2VWK956Mal8YyeokqXQTlTfRkuT5LPTJdmTA1ZHMEY9INy0z01Jx56Uyns62q98UtQ==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@antora/site-generator/-/site-generator-3.1.9.tgz", + "integrity": "sha512-YYESPG22tGX1CxRPSAr6acKILCO8JfGkM1OYc7Sw3D7ZvCy1YgZMAaTYK0T5yl9LXg+l/UZi1xq/Ej0qHnYQiw==", "dependencies": { - "@antora/asciidoc-loader": "3.1.8", - "@antora/content-aggregator": "3.1.8", - "@antora/content-classifier": "3.1.8", - "@antora/document-converter": "3.1.8", - "@antora/file-publisher": "3.1.8", - "@antora/logger": "3.1.8", - "@antora/navigation-builder": "3.1.8", - "@antora/page-composer": "3.1.8", - "@antora/playbook-builder": "3.1.8", - "@antora/redirect-producer": "3.1.8", - "@antora/site-mapper": "3.1.8", - "@antora/site-publisher": "3.1.8", - "@antora/ui-loader": "3.1.8", + "@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" }, "engines": { @@ -226,22 +226,22 @@ } }, "node_modules/@antora/site-generator-default": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/site-generator-default/-/site-generator-default-3.1.8.tgz", - "integrity": "sha512-6cjgxatANsp4iTbX6gbadfWwYngH4EXG3AyFWOmf6jMRih2MQSGc9zYL+QfHP6uqUiBfhIPCFwLbh3IiQ1v8JQ==", + "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==", "dependencies": { - "@antora/site-generator": "3.1.8" + "@antora/site-generator": "3.1.9" }, "engines": { "node": ">=16.0.0" } }, "node_modules/@antora/site-mapper": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/site-mapper/-/site-mapper-3.1.8.tgz", - "integrity": "sha512-RV6SRiNFDd/dQRXvsckTsFQIiEpH7rHIoKlsOFB261rRY4JhXSu21TjR0dpk2vJ6iPMyudIuTkwoTWsdDi389Q==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@antora/site-mapper/-/site-mapper-3.1.9.tgz", + "integrity": "sha512-9FCObL+JIjBoby8z+beu2uuvAtCjm5EsEQt+16gCIMX1ktVP3W3gVsdRSvVcGcVEpizILFhMawkcQknZPUp5mg==", "dependencies": { - "@antora/content-classifier": "3.1.8", + "@antora/content-classifier": "3.1.9", "vinyl": "~3.0" }, "engines": { @@ -249,20 +249,20 @@ } }, "node_modules/@antora/site-publisher": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/site-publisher/-/site-publisher-3.1.8.tgz", - "integrity": "sha512-DdC+IDdzeYlmTu+LwMZ24hFJJRU+f8WG2MjM7kvKQ8fkPdk0TdzNoq3TkH78sYd+2WYXKuQU6DFU/OPxY44ulA==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@antora/site-publisher/-/site-publisher-3.1.9.tgz", + "integrity": "sha512-L5To8f4QswZliXu6yB6O7O8CuBbLctjNbxZqP3m0FP7VaOONp85ftzEq1BFEm4BXXSwH1n4ujZx1qGBHP9ooOQ==", "dependencies": { - "@antora/file-publisher": "3.1.8" + "@antora/file-publisher": "3.1.9" }, "engines": { "node": ">=16.0.0" } }, "node_modules/@antora/ui-loader": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/ui-loader/-/ui-loader-3.1.8.tgz", - "integrity": "sha512-wiStSKnt+QGTeVRpnM9fxOUf1xxyB4Y3cgRgdi5hb291pG/izz8imh3csjgMwN2jB3zZD4qYSJ29xnGr4+pK8Q==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@antora/ui-loader/-/ui-loader-3.1.9.tgz", + "integrity": "sha512-g0/9dRE5JVMYukIU3x+Rvr41bPdK3sUD2xQIAniRjE6usIZs1mEsTGshVKVEoOqqnSekXE85HVhybjNHsC+qbQ==", "dependencies": { "@antora/expand-path-helper": "~2.0", "braces": "~3.0", @@ -2354,9 +2354,9 @@ } }, "node_modules/text-decoder": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.0.tgz", - "integrity": "sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==", + "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==", "dependencies": { "b4a": "^1.6.4" } @@ -2415,9 +2415,9 @@ } }, "node_modules/uglify-js": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.18.0.tgz", - "integrity": "sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==", + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.1.tgz", + "integrity": "sha512-y/2wiW+ceTYR2TSSptAhfnEtpLaQ4Ups5zrjB2d3kuVxHj16j/QJwPl5PvuGy9uARb39J0+iKxcRPvtpsx4A4A==", "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -2542,33 +2542,33 @@ }, "dependencies": { "@antora/asciidoc-loader": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/asciidoc-loader/-/asciidoc-loader-3.1.8.tgz", - "integrity": "sha512-tNa9YBA/wVA3RGmDhAF2i4s7TPWgMcZsKZF1+mFBiYmhVuIiI5mkp6sH2M+/8MlApydSOc8p375gudgLKPKrJw==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@antora/asciidoc-loader/-/asciidoc-loader-3.1.9.tgz", + "integrity": "sha512-flE27T2yI8TX7rUNjbBHWN3iR6s+kBuRBbUPncUFcWjx6mXzll8JLiTkxnc8JXHGzgKlveT+t5AkPYGACLfasg==", "requires": { - "@antora/logger": "3.1.8", + "@antora/logger": "3.1.9", "@antora/user-require-helper": "~2.0", "@asciidoctor/core": "~2.2" } }, "@antora/cli": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/cli/-/cli-3.1.8.tgz", - "integrity": "sha512-V7oIbbAONovCQWX2tKG14YmX03p6tquLP753NJEjj7QXjiWmJhOI0JsTD+fvaXr7DzkDnjnls4OwFBmiHZIkOw==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@antora/cli/-/cli-3.1.9.tgz", + "integrity": "sha512-kCUqWX3G/9Pvf8SWZ45ioHwWdOc9uamy2E5/FFwyGiTeu4ubNbadOauLVvMzSZHUxVDnGxXwCsmmQ2HwM919ew==", "requires": { - "@antora/logger": "3.1.8", - "@antora/playbook-builder": "3.1.8", + "@antora/logger": "3.1.9", + "@antora/playbook-builder": "3.1.9", "@antora/user-require-helper": "~2.0", "commander": "~11.1" } }, "@antora/content-aggregator": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/content-aggregator/-/content-aggregator-3.1.8.tgz", - "integrity": "sha512-xBWbw2fiQ6UMEIGzknvpDLUW0gTpyiQVaRXjAOYe0JDAAvifjt0uJuBsu7WrRe1FmRkfkrYj8BJ6Yv34NWZJuA==", + "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==", "requires": { "@antora/expand-path-helper": "~2.0", - "@antora/logger": "3.1.8", + "@antora/logger": "3.1.9", "@antora/user-require-helper": "~2.0", "braces": "~3.0", "cache-directory": "~2.0", @@ -2592,22 +2592,22 @@ } }, "@antora/content-classifier": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/content-classifier/-/content-classifier-3.1.8.tgz", - "integrity": "sha512-0EzsZl7oBR5/MzLGIo3WwFeub2YtyDqExrELDmyDcJ4opZMREWfgUFu5Kls1MFAQPSbzEmQyIdyGacOrwTQHrg==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@antora/content-classifier/-/content-classifier-3.1.9.tgz", + "integrity": "sha512-PVJqwp5uvZE1PlpeJtb0p6al75fN+fmXGIC6DHcKysRnr0xo+sgz8X2r4mnNWdTWRqum2yVigMmmuXYTg3cJlQ==", "requires": { - "@antora/asciidoc-loader": "3.1.8", - "@antora/logger": "3.1.8", + "@antora/asciidoc-loader": "3.1.9", + "@antora/logger": "3.1.9", "mime-types": "~2.1", "vinyl": "~3.0" } }, "@antora/document-converter": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/document-converter/-/document-converter-3.1.8.tgz", - "integrity": "sha512-dUGqgSdWnJYigbPZ9mDcoxITnufOEF5Vb5DKUxEstXe6MMn0yTZ03jJUbLs5YFgjqjhyULDMMIPo6no55zvx+w==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@antora/document-converter/-/document-converter-3.1.9.tgz", + "integrity": "sha512-pH7tQaIjcPsFdYkaBEAvA/5ki04IQwQGHoR+2jadKdMl6P+J5KA1VzNnMgyIL6gHn7auJIkoOKadfItRB9lHGQ==", "requires": { - "@antora/asciidoc-loader": "3.1.8" + "@antora/asciidoc-loader": "3.1.9" } }, "@antora/expand-path-helper": { @@ -2616,9 +2616,9 @@ "integrity": "sha512-CSMBGC+tI21VS2kGW3PV7T2kQTM5eT3f2GTPVLttwaNYbNxDve08en/huzszHJfxo11CcEs26Ostr0F2c1QqeA==" }, "@antora/file-publisher": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/file-publisher/-/file-publisher-3.1.8.tgz", - "integrity": "sha512-crVP9EF5NZJDzeYPSpy74x35GRJIa4PfjfYBUxhzoNfqgX3JZcNuP8IwsWrSNyBDGO9a7ZCQ7+p4kpnVpF2x8Q==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@antora/file-publisher/-/file-publisher-3.1.9.tgz", + "integrity": "sha512-C0VwVjuFbE1CVpZDgwYR1gZCNr1tMw5vueyF9wHZH0KCqAsp9iwo7bwj8wKWMPogxcxdYhnAvtDJnYmYFCuDWQ==", "requires": { "@antora/expand-path-helper": "~2.0", "@antora/user-require-helper": "~2.0", @@ -2627,9 +2627,9 @@ } }, "@antora/logger": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/logger/-/logger-3.1.8.tgz", - "integrity": "sha512-zbfjB1oMDDuuHjiRnBIbVTUBW1l1hCHbK4Q1oIRujnSz2LLjyY/aZfvgwODpREBGmvjkFb6Dlc9VUkKObQKi7g==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@antora/logger/-/logger-3.1.9.tgz", + "integrity": "sha512-MKuANodcX0lfRyiB+Rxl/Kv7UOxc2glzTYFoIoBB7uzxF0A+AhvUJDmpGQFRFN2ihxy99N3nLJmZpDebwXyE+A==", "requires": { "@antora/expand-path-helper": "~2.0", "pino": "~9.2", @@ -2638,27 +2638,27 @@ } }, "@antora/navigation-builder": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/navigation-builder/-/navigation-builder-3.1.8.tgz", - "integrity": "sha512-u/USiJ1HhKSUxfUtLv7aQBFCJfBz6RtdzapKIy4z2Wol0FrwQwdaUhv7Amzabi2nrPEzkaNAM6ZX7iNPjGOw6Q==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@antora/navigation-builder/-/navigation-builder-3.1.9.tgz", + "integrity": "sha512-zyl2yNjK31Dl6TRJgnoFb4Czwt9ar3wLTycAdMeZ+U/8YcAUHD8z7NCssPFFvZ0BbUr00NP+gbqDmCr6yz32NQ==", "requires": { - "@antora/asciidoc-loader": "3.1.8" + "@antora/asciidoc-loader": "3.1.9" } }, "@antora/page-composer": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/page-composer/-/page-composer-3.1.8.tgz", - "integrity": "sha512-dw1ECMLYdf9GC9Zj8sHPd9Fgcg6BjU5BDbP+HI4omtOhLUiBVwWL1lZwFRVwgGMDgKSVgnxd9yotk+WTy2iLEg==", + "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==", "requires": { - "@antora/logger": "3.1.8", + "@antora/logger": "3.1.9", "handlebars": "~4.7", "require-from-string": "~2.0" } }, "@antora/playbook-builder": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/playbook-builder/-/playbook-builder-3.1.8.tgz", - "integrity": "sha512-VDIP8cVnmyRcbg4orP2mE8HkqHTh7MRE+QyJ8XyHvFZsZjcS0Qw5UqPcrlmqXrzQKmJcBj2plqSv+wKXAYbNcQ==", + "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==", "requires": { "@iarna/toml": "~2.2", "convict": "~6.2", @@ -2667,63 +2667,63 @@ } }, "@antora/redirect-producer": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/redirect-producer/-/redirect-producer-3.1.8.tgz", - "integrity": "sha512-ZSRnK/rXZ715baFheXMWEsyz0BpR+6RxFAem8A7rZPt2HMMKCOiuaFNdf9C97dxU5FxSELBIkRpqQ7eTRk+PPA==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@antora/redirect-producer/-/redirect-producer-3.1.9.tgz", + "integrity": "sha512-9OLwoMhqifsBxTebInh/5W16GdDsdj+YkKG3TiCASlAOYsDbuhbeRPFUlyKKSRkMrtKKnFgHR0Z3DNPXYlH2NQ==", "requires": { "vinyl": "~3.0" } }, "@antora/site-generator": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/site-generator/-/site-generator-3.1.8.tgz", - "integrity": "sha512-xy1aUxTsCiC/KPlKQIoj2VWK956Mal8YyeokqXQTlTfRkuT5LPTJdmTA1ZHMEY9INy0z01Jx56Uyns62q98UtQ==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@antora/site-generator/-/site-generator-3.1.9.tgz", + "integrity": "sha512-YYESPG22tGX1CxRPSAr6acKILCO8JfGkM1OYc7Sw3D7ZvCy1YgZMAaTYK0T5yl9LXg+l/UZi1xq/Ej0qHnYQiw==", "requires": { - "@antora/asciidoc-loader": "3.1.8", - "@antora/content-aggregator": "3.1.8", - "@antora/content-classifier": "3.1.8", - "@antora/document-converter": "3.1.8", - "@antora/file-publisher": "3.1.8", - "@antora/logger": "3.1.8", - "@antora/navigation-builder": "3.1.8", - "@antora/page-composer": "3.1.8", - "@antora/playbook-builder": "3.1.8", - "@antora/redirect-producer": "3.1.8", - "@antora/site-mapper": "3.1.8", - "@antora/site-publisher": "3.1.8", - "@antora/ui-loader": "3.1.8", + "@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/site-generator-default": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/site-generator-default/-/site-generator-default-3.1.8.tgz", - "integrity": "sha512-6cjgxatANsp4iTbX6gbadfWwYngH4EXG3AyFWOmf6jMRih2MQSGc9zYL+QfHP6uqUiBfhIPCFwLbh3IiQ1v8JQ==", + "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==", "requires": { - "@antora/site-generator": "3.1.8" + "@antora/site-generator": "3.1.9" } }, "@antora/site-mapper": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/site-mapper/-/site-mapper-3.1.8.tgz", - "integrity": "sha512-RV6SRiNFDd/dQRXvsckTsFQIiEpH7rHIoKlsOFB261rRY4JhXSu21TjR0dpk2vJ6iPMyudIuTkwoTWsdDi389Q==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@antora/site-mapper/-/site-mapper-3.1.9.tgz", + "integrity": "sha512-9FCObL+JIjBoby8z+beu2uuvAtCjm5EsEQt+16gCIMX1ktVP3W3gVsdRSvVcGcVEpizILFhMawkcQknZPUp5mg==", "requires": { - "@antora/content-classifier": "3.1.8", + "@antora/content-classifier": "3.1.9", "vinyl": "~3.0" } }, "@antora/site-publisher": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/site-publisher/-/site-publisher-3.1.8.tgz", - "integrity": "sha512-DdC+IDdzeYlmTu+LwMZ24hFJJRU+f8WG2MjM7kvKQ8fkPdk0TdzNoq3TkH78sYd+2WYXKuQU6DFU/OPxY44ulA==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@antora/site-publisher/-/site-publisher-3.1.9.tgz", + "integrity": "sha512-L5To8f4QswZliXu6yB6O7O8CuBbLctjNbxZqP3m0FP7VaOONp85ftzEq1BFEm4BXXSwH1n4ujZx1qGBHP9ooOQ==", "requires": { - "@antora/file-publisher": "3.1.8" + "@antora/file-publisher": "3.1.9" } }, "@antora/ui-loader": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@antora/ui-loader/-/ui-loader-3.1.8.tgz", - "integrity": "sha512-wiStSKnt+QGTeVRpnM9fxOUf1xxyB4Y3cgRgdi5hb291pG/izz8imh3csjgMwN2jB3zZD4qYSJ29xnGr4+pK8Q==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@antora/ui-loader/-/ui-loader-3.1.9.tgz", + "integrity": "sha512-g0/9dRE5JVMYukIU3x+Rvr41bPdK3sUD2xQIAniRjE6usIZs1mEsTGshVKVEoOqqnSekXE85HVhybjNHsC+qbQ==", "requires": { "@antora/expand-path-helper": "~2.0", "braces": "~3.0", @@ -4240,9 +4240,9 @@ } }, "text-decoder": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.0.tgz", - "integrity": "sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==", + "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==", "requires": { "b4a": "^1.6.4" } @@ -4289,9 +4289,9 @@ } }, "uglify-js": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.18.0.tgz", - "integrity": "sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==", + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.1.tgz", + "integrity": "sha512-y/2wiW+ceTYR2TSSptAhfnEtpLaQ4Ups5zrjB2d3kuVxHj16j/QJwPl5PvuGy9uARb39J0+iKxcRPvtpsx4A4A==", "optional": true }, "undefsafe": { diff --git a/package.json b/package.json index 9bcea5a76..624ebb8c1 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,8 @@ "author": "Neo4j", "license": "ISC", "dependencies": { - "@antora/cli": "^3.1.8", - "@antora/site-generator-default": "^3.1.8", + "@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", "@neo4j-antora/antora-page-roles": "^0.3.1", From 5af21500e41ecc25ea178d41fc004998b255dd0d Mon Sep 17 00:00:00 2001 From: Gem Lamont <106068376+gem-neo4j@users.noreply.github.com> Date: Mon, 5 Aug 2024 13:24:57 +0200 Subject: [PATCH 3/9] Add TIME ZONE alias (#1010) GQL additionally allows for TIME ZONE (Not TIMEZONE like we currently have) --- .../pages/appendix/gql-conformance/index.adoc | 2 +- ...ions-additions-removals-compatibility.adoc | 23 +++++++++++++++++++ .../property-structural-constructed.adoc | 8 +++---- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/modules/ROOT/pages/appendix/gql-conformance/index.adoc b/modules/ROOT/pages/appendix/gql-conformance/index.adoc index 4c4da7984..2bc52908d 100644 --- a/modules/ROOT/pages/appendix/gql-conformance/index.adoc +++ b/modules/ROOT/pages/appendix/gql-conformance/index.adoc @@ -42,5 +42,5 @@ Neo4j 5.14 added support for JavaSE 21 and version 15 of the Unicode Standard. For more information, see xref:syntax/parsing.adoc##_using_unicodes_in_cypher[Parsing -> Using Unicode in Cypher]. * Cypher supports the following mandatory GQL property types: `BOOLEAN` (`BOOL`), `FLOAT` footnote:[The `FLOAT` type in Cypher always represents a 64-bit double-precision floating point number.], `INTEGER` (`SIGNED INTEGER`, or `INT`)footnote:[The `INTEGER` type in Cypher always represents a 64-bit `INTEGER`.], and `STRING` (`VARCHAR`). + -Cypher also supports the following optional GQL property types: `DATE`, `DURATION`, `LIST` (`ARRAY`, `INNER_TYPE LIST`, or `INNER_TYPE ARRAY`)footnote:[The `INNER_TYPE` cannot be a `LIST` type.], `LOCAL DATETIME` (`TIMESTAMP WITHOUT TIMEZONE`), `LOCAL TIME` (`TIME WITHOUT TIME ZONE`), `POINT`, `ZONED DATETIME` (`TIME WITH TIMEZONE`), and `ZONED TIME` (`TIMESTAMP WITH TIMEZONE`). +Cypher also supports the following optional GQL property types: `DATE`, `DURATION`, `LIST` (`ARRAY`, `INNER_TYPE LIST`, or `INNER_TYPE ARRAY`)footnote:[The `INNER_TYPE` cannot be a `LIST` type.], `LOCAL DATETIME` (`TIMESTAMP WITHOUT TIME ZONE`), `LOCAL TIME` (`TIME WITHOUT TIME ZONE`), `POINT`, `ZONED DATETIME` (`TIME WITH TIME ZONE`), and `ZONED TIME` (`TIMESTAMP WITH TIME ZONE`). For more information, see xref:values-and-types/property-structural-constructed.adoc#_property_types[Values and types -> property types]. diff --git a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc index a815e56db..62109c01f 100644 --- a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc +++ b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc @@ -16,6 +16,29 @@ New features are added to the language continuously, and occasionally, some feat This section lists all of the features that have been removed, deprecated, added, or extended in different Cypher versions. Replacement syntax for deprecated and removed features are also indicated. +[[cypher-deprecations-additions-removals-5.23]] +== Neo4j 5.23 + +=== Updated features + +[cols="2", options="header"] +|=== +| Feature +| Details + +a| +label:functionality[] +label:updated[] +[source, cypher, role="noheader"] +---- +RETURN datetime.statement() IS :: TIMESTAMP WITH TIME ZONE +---- +a| +Introduced new GQL conformant aliases to duration types: `TIMESTAMP WITHOUT TIME ZONE` (alias to `LOCAL DATETIME`), `TIME WITHOUT TIME ZONE` (alias to `LOCAL TIME`), `TIMESTAMP WITH TIME ZONE` (alias to `ZONED DATETIME`), and `TIME WITH TIME ZONE` (alias to `ZONED TIME`). + +See xref::values-and-types/property-structural-constructed.adoc#types-synonyms[types and their synonyms] for more. +|=== + [[cypher-deprecations-additions-removals-5.21]] == Neo4j 5.21 diff --git a/modules/ROOT/pages/values-and-types/property-structural-constructed.adoc b/modules/ROOT/pages/values-and-types/property-structural-constructed.adoc index 1f3841496..618ade925 100644 --- a/modules/ROOT/pages/values-and-types/property-structural-constructed.adoc +++ b/modules/ROOT/pages/values-and-types/property-structural-constructed.adoc @@ -89,8 +89,8 @@ However, not all types can be used in all places. | `FLOAT` | | `INTEGER` | `INT`, `SIGNED INTEGER` | `LIST` | `ARRAY`, `INNER_TYPE LIST`, `INNER_TYPE ARRAY` -| `LOCAL DATETIME` | `TIMESTAMP WITHOUT TIMEZONE` -| `LOCAL TIME` | `TIME WITHOUT TIMEZONE` +| `LOCAL DATETIME` | `TIMESTAMP WITHOUT TIME ZONE`, `TIMESTAMP WITHOUT TIMEZONE` +| `LOCAL TIME` | `TIME WITHOUT TIME ZONE`, `TIME WITHOUT TIMEZONE` | `MAP` | | `NODE` | `ANY NODE`, `VERTEX`, `ANY VERTEX` | `NOTHING` | @@ -100,8 +100,8 @@ However, not all types can be used in all places. | `PROPERTY VALUE` | `ANY PROPERTY VALUE` | `RELATIONSHIP` | `ANY RELATIONSHIP`, `EDGE`, `ANY EDGE` | `STRING` | `VARCHAR` -| `ZONED DATETIME` | `TIMESTAMP WITH TIMEZONE` -| `ZONED TIME` | `TIME WITH TIMEZONE` +| `ZONED DATETIME` | `TIMESTAMP WITH TIME ZONE`, `TIMESTAMP WITH TIMEZONE` +| `ZONED TIME` | `TIME WITH TIME ZONE`, `TIME WITH TIMEZONE` | `INNER_TYPE_1 \| INNER_TYPE_2...` | `ANY` |=== From 1044a9da74fb91f9a9a2ce5498f622b9b5da287c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Mon, 5 Aug 2024 15:58:30 +0200 Subject: [PATCH 4/9] Fix result format of relationships function (#1011) --- modules/ROOT/pages/functions/list.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/functions/list.adoc b/modules/ROOT/pages/functions/list.adoc index c7ae65b69..b118c9d60 100644 --- a/modules/ROOT/pages/functions/list.adoc +++ b/modules/ROOT/pages/functions/list.adoc @@ -424,8 +424,8 @@ A `LIST` containing all the `RELATIONSHIP` values in the `PATH` `p [role="queryresult",options="header,footer",cols="1* Date: Thu, 8 Aug 2024 14:17:36 +0200 Subject: [PATCH 5/9] Document Variable Scope Clause (#990) --- modules/ROOT/images/call_subquery_graph.svg | 10 +- .../pages/appendix/gql-conformance/index.adoc | 4 +- .../gql-conformance/supported-mandatory.adoc | 2 +- .../gql-conformance/supported-optional.adoc | 8 + modules/ROOT/pages/clauses/load-csv.adoc | 7 +- ...ions-additions-removals-compatibility.adoc | 48 ++ modules/ROOT/pages/genai-integrations.adoc | 7 +- .../ROOT/pages/patterns/shortest-paths.adoc | 7 +- .../operators/operators-detail.adoc | 28 +- .../ROOT/pages/subqueries/call-subquery.adoc | 655 +++++++++++++----- .../subqueries-in-transactions.adoc | 123 +--- 11 files changed, 623 insertions(+), 276 deletions(-) diff --git a/modules/ROOT/images/call_subquery_graph.svg b/modules/ROOT/images/call_subquery_graph.svg index 10e7f2ae6..932cf79da 100644 --- a/modules/ROOT/images/call_subquery_graph.svg +++ b/modules/ROOT/images/call_subquery_graph.svg @@ -1,9 +1,9 @@ - - + + - - + + - + diff --git a/modules/ROOT/pages/appendix/gql-conformance/index.adoc b/modules/ROOT/pages/appendix/gql-conformance/index.adoc index 2bc52908d..9448c41c4 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*: 5 July 2024 + -*Neo4j version*: 5.21 +*Last updated*: 8 August 2024 + +*Neo4j version*: 5.23 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 42cd41056..4d4ee103d 100644 --- a/modules/ROOT/pages/appendix/gql-conformance/supported-mandatory.adoc +++ b/modules/ROOT/pages/appendix/gql-conformance/supported-mandatory.adoc @@ -81,7 +81,7 @@ This is not available in Cypher. | | xref:subqueries/call-subquery.adoc[`CALL` subqueries]. | GQL either imports variables implicitly, or explicitly using a variable scope clause. -In Cypher, `CALL` subqueries require an explicit importing `WITH` clause. +In Cypher, it is currently not possible to implicitly import variables. | 15.3 | diff --git a/modules/ROOT/pages/appendix/gql-conformance/supported-optional.adoc b/modules/ROOT/pages/appendix/gql-conformance/supported-optional.adoc index 47ba67e7f..c8c76ab6c 100644 --- a/modules/ROOT/pages/appendix/gql-conformance/supported-optional.adoc +++ b/modules/ROOT/pages/appendix/gql-conformance/supported-optional.adoc @@ -129,6 +129,14 @@ In Cypher, `trim()` removes any whitespace character. | | +| GP01 +| xref:subqueries/call-subquery.adoc[Inline procedure] +| + +| GP03 +| xref:subqueries/call-subquery.adoc#variable-scope-clause[Inline procedure with explicit nested variable scope] +| + | GQ01 | `USE` graph clause | xref:clauses/use.adoc[`USE`] diff --git a/modules/ROOT/pages/clauses/load-csv.adoc b/modules/ROOT/pages/clauses/load-csv.adoc index ea1998c5e..a67c11b2a 100644 --- a/modules/ROOT/pages/clauses/load-csv.adoc +++ b/modules/ROOT/pages/clauses/load-csv.adoc @@ -599,12 +599,15 @@ person_tmdbId,bio,born,bornIn,died,person_imdbId,name,person_poster,person_url ... ---- +[NOTE] +The below query uses a xref:subqueries/call-subquery.adoc#variable-scope-clause[variable scope clause] (introduced in Neo4j 5.23) to import variables into the `CALL` subquery. +If you are using an older version of Neo4j, use an xref:subqueries/call-subquery.adoc#importing-with[importing `WITH` clause] instead. + .Query [source, cypher] ---- LOAD CSV WITH HEADERS FROM 'https://data.neo4j.com/importing-cypher/persons.csv' AS row -CALL { - WITH row +CALL (row) { MERGE (p:Person {tmdbId: row.person_tmdbId}) SET p.name = row.name, p.born = row.born } IN TRANSACTIONS OF 200 ROWS diff --git a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc index 62109c01f..83437bedb 100644 --- a/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc +++ b/modules/ROOT/pages/deprecations-additions-removals-compatibility.adoc @@ -19,8 +19,33 @@ Replacement syntax for deprecated and removed features are also indicated. [[cypher-deprecations-additions-removals-5.23]] == Neo4j 5.23 +=== Deprecated features + +[cols="2", options="header"] +|=== +| Feature +| Details + +a| +label:functionality[] +label:deprecated[] +[source, cypher, role="noheader"] +---- +UNWIND [0, 1, 2] AS x +CALL { + WITH x + RETURN x * 10 AS y +} +RETURN x, y +---- + +| Using the xref:subqueries/call-subquery.adoc#importing-with[`WITH` clause to import variables] to `CALL` subqueries is deprecated, and replaced with a xref:subqueries/call-subquery.adoc#variable-scope-clause[variable scope clause]. +It is also deprecated to use naked subqueries without a variable scope clause. +|=== + === Updated features + [cols="2", options="header"] |=== | Feature @@ -39,6 +64,29 @@ Introduced new GQL conformant aliases to duration types: `TIMESTAMP WITHOUT TIME See xref::values-and-types/property-structural-constructed.adoc#types-synonyms[types and their synonyms] for more. |=== +=== New features + +[cols="2", options="header"] +|=== +| Feature +| Details + +a| +label:functionality[] +label:new[] +[source, cypher, role="noheader"] +---- +UNWIND [0, 1, 2] AS x +CALL (x) { + RETURN x * 10 AS y +} +RETURN x, y +---- + +| Introduced a new xref:subqueries/call-subquery.adoc#variable-scope-clause[variable scope clause] to import variables in `CALL` subqueries. + +|=== + [[cypher-deprecations-additions-removals-5.21]] == Neo4j 5.21 diff --git a/modules/ROOT/pages/genai-integrations.adoc b/modules/ROOT/pages/genai-integrations.adoc index eba7d181b..0ffed1b6d 100644 --- a/modules/ROOT/pages/genai-integrations.adoc +++ b/modules/ROOT/pages/genai-integrations.adoc @@ -180,9 +180,8 @@ WITH collect(m) AS moviesList // <1> count(*) AS total, 100 AS batchSize // <2> UNWIND range(0, total, batchSize) AS batchStart // <3> -CALL { // <4> - WITH moviesList, batchStart, batchSize - WITH moviesList, batchStart, [movie IN moviesList[batchStart .. batchStart + batchSize] | movie.title || ': ' || movie.plot] AS resources // <5> +CALL (moviesList, batchStart, batchSize) { // <4> + WITH [movie IN moviesList[batchStart .. batchStart + batchSize] | movie.title || ': ' || movie.plot] AS resources // <5> CALL genai.vector.encodeBatch(batch, 'OpenAI', { token: $token }) YIELD index, vector CALL db.create.setNodeVectorProperty(moviesList[batchStart + index], 'embedding', vector) // <6> } IN TRANSACTIONS OF 1 ROW <7> @@ -194,6 +193,8 @@ Because vector embeddings can be very large, a larger batch size may require sig Too large a batch size may also exceed the provider's threshold. <3> Process `Movie` nodes in increments of `batchSize`. <4> A xref:subqueries/subqueries-in-transactions.adoc[`CALL` subquery] executes a separate transaction for each batch. +Note that this `CALL` subquery uses a xref:subqueries/call-subquery.adoc#variable-scope-clause[variable scope clause] (introduced in Neo4j 5.23) to import variables. +If you are using an older version of Neo4j, use an xref:subqueries/call-subquery.adoc#importing-with[importing `WITH` clause] instead. <5> `resources` is a list of strings, each being the concatenation of `title` and `plot` of one movie. <6> The procedure sets `vector` as value for the property named `embedding` for the node at position `batchStart + index` in the `moviesList`. <7> Set to `1` the amount of batches to be processed at once. diff --git a/modules/ROOT/pages/patterns/shortest-paths.adoc b/modules/ROOT/pages/patterns/shortest-paths.adoc index 2e9779c75..01e61f3ba 100644 --- a/modules/ROOT/pages/patterns/shortest-paths.adoc +++ b/modules/ROOT/pages/patterns/shortest-paths.adoc @@ -552,6 +552,10 @@ To have the planner choose the `StatefulShortestPath(Into)` instead, rewrite the 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. +[NOTE] +The below query uses a xref:subqueries/call-subquery.adoc#variable-scope-clause[variable scope clause] (introduced in Neo4j 5.23) to import variables into the `CALL` subquery. +If you are using an older version of Neo4j, use an xref:subqueries/call-subquery.adoc#importing-with[importing `WITH` clause] instead. + .Query rewritten to use `StatefulShortestPath(Into)` [source,cypher] ---- @@ -559,8 +563,7 @@ PROFILE MATCH (a:Station {name: "Worcestershire Parkway"}), (b:Station) -CALL { - WITH a, b +CALL (a, b) { MATCH p = SHORTEST 1 (a)(()-[]-()-[]-()){1,}(b) RETURN p 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 38759c6f5..d6c0f97d8 100644 --- a/modules/ROOT/pages/planning-and-tuning/operators/operators-detail.adoc +++ b/modules/ROOT/pages/planning-and-tuning/operators/operators-detail.adoc @@ -2811,13 +2811,16 @@ Total database accesses: 166, total allocated memory: 976 .TransactionApply ====== +[NOTE] +The below query uses a xref:subqueries/call-subquery.adoc#variable-scope-clause[variable scope clause] (introduced in Neo4j 5.23) to import variables into the `CALL` subquery. +If you are using an older version of Neo4j, use an xref:subqueries/call-subquery.adoc#importing-with[importing `WITH` clause] instead. + .Query [source, cypher] ---- PROFILE LOAD CSV FROM 'https://neo4j.com/docs/cypher-refcard/3.3/csv/artists.csv' AS line -CALL { - WITH line +CALL (line) { CREATE (a: Artist {name: line[0]}) RETURN a } IN TRANSACTIONS OF 100 ROWS @@ -3512,13 +3515,16 @@ This restricts the xref:planning-and-tuning/runtimes/index.adoc[Cypher runtime] .ArgumentTracker ====== +[NOTE] +The below query uses a xref:subqueries/call-subquery.adoc#variable-scope-clause[variable scope clause] (introduced in Neo4j 5.23) to import variables into the `CALL` subquery. +If you are using an older version of Neo4j, use an xref:subqueries/call-subquery.adoc#importing-with[importing `WITH` clause] instead. + .Query [source, cypher] ---- PROFILE MATCH (s:Person {name: 'me'}) -CALL { - WITH s +CALL (s) { SET s.seen = coalesce(s.seen + 1,1) RETURN s.seen AS result } @@ -4787,13 +4793,16 @@ Total database accesses: 9, total allocated memory: 64 .TransactionForeach ====== +[NOTE] +The below query uses a xref:subqueries/call-subquery.adoc#variable-scope-clause[variable scope clause] (introduced in Neo4j 5.23) to import variables into the `CALL` subquery. +If you are using an older version of Neo4j, use an xref:subqueries/call-subquery.adoc#importing-with[importing `WITH` clause] instead. + .Query [source, cypher] ---- PROFILE LOAD CSV FROM 'https://neo4j.com/docs/cypher-refcard/3.3/csv/artists.csv' AS line -CALL { - WITH line +CALL (line) { CREATE (a: Artist {name: line[0]}) } IN TRANSACTIONS OF 100 ROWS ---- @@ -4839,13 +4848,16 @@ Batch size 128 .SubqueryForeach ====== +[NOTE] +The below query uses a xref:subqueries/call-subquery.adoc#variable-scope-clause[variable scope clause] (introduced in Neo4j 5.23) to import variables into the `CALL` subquery. +If you are using an older version of Neo4j, use an xref:subqueries/call-subquery.adoc#importing-with[importing `WITH` clause] instead. + .Query [source, cypher] ---- PROFILE LOAD CSV FROM 'https://neo4j.com/docs/cypher-refcard/3.3/csv/artists.csv' AS line -CALL { - WITH line +CALL (line) { CREATE (a: Artist {name: line[0]}) } ---- diff --git a/modules/ROOT/pages/subqueries/call-subquery.adoc b/modules/ROOT/pages/subqueries/call-subquery.adoc index 636d47eea..84624ee19 100644 --- a/modules/ROOT/pages/subqueries/call-subquery.adoc +++ b/modules/ROOT/pages/subqueries/call-subquery.adoc @@ -1,19 +1,17 @@ = CALL subqueries -:description: This page describes how to use the CALL subquery with Cypher. +:description: This page describes how to use Cypher's `CALL` subquery. -The `CALL` clause can be used to invoke a subquery. -Unlike other subqueries in Cypher, it can be used to perform changes to the database (e.g. xref:clauses/create.adoc[] new nodes), and it requires an importing xref:clauses/with.adoc[] clause. +The `CALL` clause can be used to invoke subqueries that execute operations within a defined scope, thereby optimizing data handling and query efficiency. +Unlike other subqueries in Cypher, `CALL` subqueries can be used to perform changes to the database (e.g. xref:clauses/create.adoc[] new nodes). [NOTE] -==== The `CALL` clause is also used for calling procedures. -For descriptions of the `CALL` clause in this context, refer to xref::clauses/call.adoc[`CALL` procedure]. -==== +For descriptions of the `CALL` clause in this context, refer to the xref::clauses/call.adoc[`CALL` procedure]. [[call-example-graph]] == Example graph -The following graph is used for the examples below: +A graph with the following schema is used for the examples below: image::call_subquery_graph.svg[] @@ -21,33 +19,45 @@ To recreate the graph, run the following query in an empty Neo4j database: [source, cypher, role=test-setup] ---- -CREATE - (a:Person:Child {name: 'Alice', age: 20}), - (b:Person {name: 'Bob', age: 27}), - (c:Person:Parent {name: 'Charlie', age: 65}), - (d:Person {name: 'Dora', age: 30}) - CREATE (a)-[:FRIEND_OF]->(b) - CREATE (a)-[:CHILD_OF]->(c) - CREATE (a)-[:OWES {dollars: 20}]->(c) - CREATE (a)-[:OWES {dollars: 25}]->(b) - CREATE (b)-[:OWES {dollars: 35}]->(d) - CREATE (d)-[:OWES {dollars: 15}]->(b) - CREATE (d)-[:OWES {dollars: 30}]->(b) -CREATE (:Counter {count: 0}) +CREATE (teamA:Team {name: 'Team A'}), + (teamB:Team {name: 'Team B'}), + (teamC:Team {name: 'Team C'}), + (playerA:Player {name: 'Player A', age: 21}), + (playerB:Player {name: 'Player B', age: 23}), + (playerC:Player {name: 'Player C', age: 19}), + (playerD:Player {name: 'Player D', age: 30}), + (playerE:Player {name: 'Player E', age: 25}), + (playerF:Player {name: 'Player F', age: 35}), + (playerA)-[:PLAYS_FOR]->(teamA), + (playerB)-[:PLAYS_FOR]->(teamA), + (playerC)-[:PLAYS_FOR]->(teamA), + (playerD)-[:PLAYS_FOR]->(teamB), + (playerE)-[:PLAYS_FOR]->(teamC), + (playerF)-[:PLAYS_FOR]->(teamC), + (playerA)-[:FRIEND_OF]->(playerB), + (playerA)-[:FRIEND_OF]->(playerC), + (playerB)-[:FRIEND_OF]->(playerF), + (playerC)-[:FRIEND_OF]->(playerD), + (teamA)-[:OWES {dollars: 1500}]->(teamB), + (teamA)-[:OWES {dollars: 3000}]->(teamB), + (teamB)-[:OWES {dollars: 1700}]->(teamC), + (teamC)-[:OWES {dollars: 5000}]->(teamB) ---- -[[call-semantics]] -== Semantics +== Semantics and performance A `CALL` subquery is executed once for each incoming row. +The variables returned in a subquery are available to the outer scope of the enclosing query. -In the below example, the `CALL` subquery executes three times, one for each row that the `UNWIND` clause outputs. +.Basic example +==== +In this example, the `CALL` subquery executes three times, one for each row that the xref:clauses/unwind.adoc[`UNWIND`] clause outputs. .Query [source, cypher] ---- UNWIND [0, 1, 2] AS x -CALL { +CALL () { RETURN 'hello' AS innerReturn } RETURN innerReturn @@ -57,84 +67,360 @@ RETURN innerReturn [role="queryresult",options="header,footer",cols="m"] |=== | innerReturn + | 'hello' | 'hello' | 'hello' -d|Rows:3 + +d|Rows: 3 |=== +==== Each execution of a `CALL` subquery can observe changes from previous executions. +This allows for the accumulation of results and the progressive transformation of data within a single Cypher query. -.Query +.Incremental updates +==== +In this example, each iteration of the `CALL` subquery adds 1 to the `age` of `Player A` and the returned `newAge` reflects the `age` after each increment. + +.Incrementally update the age property of a Player [source, cypher] ---- -UNWIND [0, 1, 2] AS x -CALL { - MATCH (n:Counter) - SET n.count = n.count + 1 - RETURN n.count AS innerCount +UNWIND [1, 2, 3] AS x +CALL () { + MATCH (p:Player {name: 'Player A'}) + SET p.age = p.age + 1 + RETURN p.age AS newAge } -WITH innerCount -MATCH (n:Counter) -RETURN - innerCount, - n.count AS totalCount +WITH x, newAge +MATCH (p:Player {name: 'Player A'}) +RETURN x AS iteration, newAge, p.age AS totalAge ---- .Result -[role="queryresult",options="header,footer",cols=""2*(t) + RETURN collect(p) as players +} +RETURN t AS team, players +---- -[NOTE] +.Result +[source, role="queryresult",options="header,footer",cols="m,2m"] +|=== +| team +| players + +| (:Team {name: "Team A"}) +| [(:Player {name: "Player C", age: 19}), (:Player {name: "Player B", age: 23}), (:Player {name: "Player A", age: 24})] + +| (:Team {name: "Team B"}) +| [(:Player {name: "Player D", age: 30})] + +| (:Team {name: "Team C"}) +| [(:Player {name: "Player F", age: 35}), (:Player {name: "Player E", age: 25})] + +2+d|Rows: 3 +|=== + +The `CALL` subquery ensures that each `Team` is processed separately (one row per `Team` node), rather than having to hold every `Team` and `Player` node in heap memory simultaneously before collecting them into lists. +Using a `CALL` subquery can therefore reduce the amount of heap memory required for an operation. ==== -References to a variable in the outer scope that were not imported will introduce a new variable. + +[[import-variables]] +== Importing variables + +Variables from the outer scope must be explicitly imported into the inner scope of the `CALL` subquery, either by using a xref:subqueries/call-subquery.adoc#variable-scope-clause[variable scope clause] or an xref:subqueries/call-subquery.adoc#importing-with[importing `WITH` clause] (deprecated). +As the subquery is evaluated for each incoming input row, the imported variables are assigned the corresponding values from that row. + +[role=label--new-5.23] +[[variable-scope-clause]] +=== The variable scope clause + +Variables can be imported into a `CALL` subquery using a scope clause: `CALL ()`. +Using the scope clause disables the deprecated xref:subqueries/call-subquery.adoc#importing-with[importing `WITH`] clause. + +A scope clause can be used to import all, specific, or none of the variables from the outer scope. + +.Import specific variables from the outer scope ==== -As the subquery is evaluated for each incoming input row, the imported variables get bound to the corresponding values from the input row in each evaluation. +This example only imports the `p` variable from the outer scope and uses it to create a new, randomly generated, `rating` property for each `Player` node. +It then returns the `Player` node with the highest `rating`. -.Query +.Import one variable from the outer scope +[source, cypher, role=test-result-skip] +---- +MATCH (p:Player), (t:Team) +CALL (p) { + WITH rand() AS random + SET p.rating = random + RETURN p.name AS playerName, p.rating AS rating +} +RETURN playerName, rating, t AS team +ORDER BY rating +LIMIT 1 +---- + +.Result +[source, role="queryresult",options="header,footer",cols="3*m"] +|=== +| playerName +| rating +| team + +| "Player C" +| 0.9307432039870395 +| "Team A" + +3+d|Rows: 1 + +|=== + +To import additional variables, include them within the parentheses after `CALL`, separated by commas. +For example, to import both variables from the `MATCH` clause in the above query, modify the scope clause accordingly: `CALL (p, t)`. +==== + +.Import all variables +==== +To import all variables from the outer scope, use `CALL (*)`. +This example imports both the `p` and `t` variables and sets a new `lastUpdated` property on both. + +.Import all variables from the outer scope +[source, cypher, role=test-result-skip] +---- +MATCH (p:Player), (t:Team) +CALL (*) { + SET p.lastUpdated = timestamp() + SET t.lastUpdated = timestamp() +} +RETURN p.name AS playerName, + p.lastUpdated AS playerUpdated, + t.name AS teamName, + t.lastUpdated AS teamUpdated +LIMIT 1 +---- + +.Result +[source, role="queryresult",options="header,footer",cols="4*m"] +|=== + +| playerName +| playerUpdated +| teamName +| teamUpdated + +| "Player A" +| 1719304206653 +| "Team A" +| 1719304206653 + +4+d|Rows: 1 +|=== +==== + +.Import no variables +==== +To import no variables from the outer scope, use `CALL ()`. + +.Import no variables from the outer scope [source, cypher] ---- -UNWIND [0, 1, 2] AS x -CALL { - WITH x - RETURN x * 10 AS y +MATCH (t:Team) +CALL () { + MATCH (p:Player) + RETURN count(p) AS totalPlayers } -RETURN x, y +RETURN count(t) AS totalTeams, totalPlayers ---- .Result -[role="queryresult",options="header,footer",cols="2*(teams) + RETURN collect(p) as players +} +RETURN t AS teams, players +---- +* The scope clause’s variables cannot be re-declared in the subquery. + +.Not allowed +[source,cypher,role=test-fail] +---- +MATCH (t:Team) +CALL (t) { + WITH 'New team' AS t + MATCH (p:Player)-[:PLAYS_FOR]->(t) + RETURN collect(p) as players +} +RETURN t AS team, players +---- + +* The subquery cannot return a variable name which already exists in the outer scope. +To return imported variables they must be renamed. + +.Not allowed +[source,cypher,role=test-fail] +---- +MATCH (t:Team) +CALL (t) { + RETURN t +} +RETURN t +---- + +[role=label--deprecated] +[[importing-with]] +=== Importing `WITH` clause + +Variables can also be imported into a `CALL` subquery using an importing `WITH` clause. +Note that this syntax is not xref:appendix/gql-conformance/index.adoc[GQL conformant]. + +.Variables imported by `WITH` clause +[source, cypher] +---- +MATCH (t:Team) +CALL { + WITH t + MATCH (p:Player)-[:PLAYS_FOR]->(t) + RETURN collect(p) as players +} +RETURN t AS teams, players +---- + +.Click to read more about importing variables using the `WITH` clause +[%collapsible] +==== + +* Just as when using a variable scope clause, a subquery using an importing `WITH` clause cannot return a variable name which already exists in the outer scope. +To return imported variables they must be renamed. + +* The importing `WITH` clause must the first clause of a subquery (or the second clause, if directly following a `USE` clause). +* It is not possible to follow an importing `WITH` clause with any of the following clauses: `DISTINCT`, `ORDER BY`, `WHERE`, `SKIP`, and `LIMIT`. + +Attempting any of the above, will throw an error. +For example, the following query using a `WHERE` clause after an importing `WITH` clause will throw an error: + +.Not Allowed +[source, cypher, role=test-fail] +---- +UNWIND [[1,2],[1,2,3,4],[1,2,3,4,5]] AS l +CALL { + WITH l + WHERE size(l) > 2 + RETURN l AS largeLists +} +RETURN largeLists +---- + +.Error message +[source, error] +---- +Importing WITH should consist only of simple references to outside variables. +WHERE is not allowed. +---- + +A solution to this restriction, necessary for any filtering or ordering of an importing `WITH` clause, is to declare a second `WITH` clause after the importing `WITH` clause. +This second `WITH` clause will act as a regular `WITH` clause. +For example, the following query will not throw an error: + +.Allowed +[source, cypher] +---- +UNWIND [[1,2],[1,2,3,4],[1,2,3,4,5]] AS l +CALL { + WITH l + WITH l + WHERE size(l) > 2 + RETURN l AS largeLists +} +RETURN largeLists +---- + +.Result +[role="queryresult",options="header,footer",cols="1*(nextPerson) - RETURN current AS from, nextPerson AS to + SET nextPlayer:ListHead + CREATE(current)-[:IS_YOUNGER_THAN]->(nextPlayer) + RETURN current AS from, nextPlayer AS to } RETURN from.name AS name, @@ -171,81 +460,108 @@ RETURN ---- .Result -[role="queryresult",options="header,footer",cols="4*(other:Person) - RETURN o.dollars * -1 AS moneyOwed -UNION ALL - WITH p - OPTIONAL MATCH (other:Person)-[o:OWES]->(p) - RETURN o.dollars AS moneyOwed +MATCH (t:Team) +CALL (t) { + OPTIONAL MATCH (t)-[o:OWES]->(other:Team) + RETURN o.dollars * -1 AS moneyOwed + UNION ALL + OPTIONAL MATCH (other)-[o:OWES]->(t) + RETURN o.dollars AS moneyOwed } -RETURN p.name, sum(moneyOwed) AS amountOwing +RETURN t.name AS team, sum(moneyOwed) AS amountOwed +ORDER BY amountOwed DESC ---- .Result [role="queryresult",options="header,footer",cols="2*(p2:Player) + RETURN p2.name AS friend } -RETURN p.name, friend +RETURN p.name AS player, friend ---- .Result [role="queryresult",options="header,footer",cols="2*(c) - RETURN sum(o.dollars) AS owedAmount, c.name AS owedName +MATCH (t:Team) +CALL (t) { + MATCH (t)-[o:OWES]->(t2:Team) + RETURN sum(o.dollars) AS owedAmount, t2.name AS owedTeam } -RETURN p.name, owedAmount, owedName +RETURN t.name AS owingTeam, owedAmount, owedTeam ---- .Result [role="queryresult",options="header,footer",cols="3* 100 -CALL { - WITH n +CALL (n) { DETACH DELETE n } IN TRANSACTIONS ---- @@ -158,8 +158,7 @@ This example loads a CSV file with one transaction for every `2` input rows: [source, cypher] ---- LOAD CSV FROM 'file:///friends.csv' AS line -CALL { - WITH line +CALL (line) { CREATE (:Person {name: line[1], age: toInteger(line[2])}) } IN TRANSACTIONS OF 2 ROWS ---- @@ -191,8 +190,7 @@ For example: [source, cypher] ---- MATCH (n) -CALL { - WITH n +CALL (n) { DETACH DELETE n } IN TRANSACTIONS OF 2 ROWS ---- @@ -243,9 +241,8 @@ The following examples show how you can use `CALL { ... } IN TRANSACTIONS` on a ---- UNWIND graph.names() AS graphName LOAD CSV FROM 'file:///friends.csv' AS line -CALL { +CALL (*) { USE graph.byName( graphName ) - WITH line CREATE (:Person {name: line[1], age: toInteger(line[2])}) } IN TRANSACTIONS ---- @@ -306,7 +303,7 @@ While the declared batch size is 3, only the first 2 rows act on `composite.remo WITH ['composite.remoteGraph1', 'composite.remoteGraph2'] AS graphs UNWIND [0, 0, 1, 1, 1, 1, 0, 0] AS i WITH graphs[i] AS g -CALL { +CALL (g) { USE graph.byName( g ) CREATE () } IN TRANSACTIONS OF 3 ROWS @@ -339,8 +336,7 @@ due to division by zero. [source, cypher, role=test-fail] ---- UNWIND [4, 2, 1, 0] AS i -CALL { - WITH i +CALL (i) { CREATE (:Person {num: 100/i}) } IN TRANSACTIONS OF 2 ROWS RETURN i @@ -376,8 +372,7 @@ In the following example, `ON ERROR CONTINUE` is used after a failed inner trans [source, cypher] ---- UNWIND [1, 0, 2, 4] AS i -CALL { - WITH i +CALL (i) { CREATE (n:Person {num: 100/i}) // Note, fails when i = 0 RETURN n } IN TRANSACTIONS @@ -403,8 +398,7 @@ Note the difference in results when batching in transactions of 2 rows: [source, cypher, indent=0] ---- UNWIND [1, 0, 2, 4] AS i -CALL { - WITH i +CALL (i) { CREATE (n:Person {num: 100/i}) // Note, fails when i = 0 RETURN n } IN TRANSACTIONS @@ -435,8 +429,7 @@ In the following example, `ON ERROR BREAK` is used after a failed inner transact [source, cypher, indent=0] ---- UNWIND [1, 0, 2, 4] AS i -CALL { - WITH i +CALL (i) { CREATE (n:Person {num: 100/i}) // Note, fails when i = 0 RETURN n } IN TRANSACTIONS @@ -462,8 +455,7 @@ Note the difference in results when batching in transactions of 2 rows: [source, cypher, indent=0] ---- UNWIND [1, 0, 2, 4] AS i -CALL { - WITH i +CALL (i) { CREATE (n:Person {num: 100/i}) // Note, fails when i = 0 RETURN n } IN TRANSACTIONS @@ -489,8 +481,7 @@ In the following example, `ON ERROR FAIL` is used after the failed inner transac [source, cypher, indent=0, role=test-fail] ---- UNWIND [1, 0, 2, 4] AS i -CALL { - WITH i +CALL (i) { CREATE (n:Person {num: 100/i}) // Note, fails when i = 0 RETURN n } IN TRANSACTIONS @@ -529,8 +520,7 @@ Example of reporting status with `ON ERROR CONTINUE`: [source, cypher, indent=0, role=test-result-skip] ---- UNWIND [1, 0, 2, 4] AS i -CALL { - WITH i +CALL (i) { CREATE (n:Person {num: 100/i}) // Note, fails when i = 0 RETURN n } IN TRANSACTIONS @@ -557,8 +547,7 @@ Example of reporting status with `ON ERROR BREAK`: [source, cypher, indent=0] ---- UNWIND [1, 0, 2, 4] AS i -CALL { - WITH i +CALL (i) { CREATE (n:Person {num: 100/i}) // Note, fails when i = 0 RETURN n } IN TRANSACTIONS @@ -585,8 +574,7 @@ Reporting status with `ON ERROR FAIL` is disallowed: [source, cypher, role=test-fail] ---- UNWIND [1, 0, 2, 4] AS i -CALL { - WITH i +CALL (i) { CREATE (n:Person {num: 100/i}) // Note, fails when i = 0 RETURN n } IN TRANSACTIONS @@ -625,8 +613,7 @@ This example creates `Person` nodes from a unique `tmdbId` value assigned to eac [source, cypher] ---- LOAD CSV WITH HEADERS FROM 'https://data.neo4j.com/importing-cypher/persons.csv' AS row -CALL { - WITH row +CALL (row) { CREATE (p:Person {tmdbId: row.person_tmdbId}) SET p.name = row.name, p.born = row.born } IN 3 CONCURRENT TRANSACTIONS OF 10 ROWS @@ -684,8 +671,7 @@ Note that there are only three different years in the CSV file, meaning hat only [source, cypher, role=test-fail] ---- LOAD CSV WITH HEADERS FROM 'https://data.neo4j.com/importing-cypher/movies.csv' AS row -CALL { - WITH row +CALL (row) { MERGE (m:Movie {movieId: row.movieId}) MERGE (y:Year {year: row.year}) MERGE (m)-[r:RELEASED_IN]->(y) @@ -709,8 +695,7 @@ It returns the `transactionID`, `commitStatus` and `errorMessage` of the failed [source, cypher] ---- LOAD CSV WITH HEADERS FROM 'https://data.neo4j.com/importing-cypher/movies.csv' AS row -CALL { - WITH row +CALL (row) { MERGE (m:Movie {movieId: row.movieId}) MERGE (y:Year {year: row.year}) MERGE (m)-[r:RELEASED_IN]->(y) @@ -724,7 +709,7 @@ RETURN status.transactionId AS transaction, status.committed AS commitStatus, st [source, "queryresult"] ---- +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| transaction | commitStatus | errorMessage | +| transaction | commitStatus | errorMessage | +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | "neo4j-transaction-169" | FALSE | "ForsetiClient[transactionId=169, clientId=11] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=168, clientId=9]} on NODE_RELATIONSHIP_GROUP_DELETE(46) because holders of that lock are waiting for ForsetiClient[transactionId=169, clientId=11]. | | | \ Wait list:ExclusiveLock[ | @@ -768,16 +753,14 @@ While failed transactions may be more efficiently retried using a link:{neo4j-do [source, cypher] ---- LOAD CSV WITH HEADERS FROM 'https://data.neo4j.com/importing-cypher/movies.csv' AS row -CALL { - WITH row +CALL (row) { MERGE (m:Movie {movieId: row.movieId}) MERGE (y:Year {year: row.year}) MERGE (m)-[r:RELEASED_IN]->(y) } IN 2 CONCURRENT TRANSACTIONS OF 10 ROWS ON ERROR CONTINUE REPORT STATUS as status WITH * WHERE status.committed = false -CALL { - WITH row +CALL (row) { MERGE (m:Movie {movieId: row.movieId}) MERGE (y:Year {year: row.year}) MERGE (m)-[r:RELEASED_IN]->(y) @@ -795,59 +778,3 @@ These are the restrictions on queries that use `CALL { ... } IN TRANSACTIONS`: * A `CALL { ... } IN TRANSACTIONS` in a `UNION` is not supported. * A `CALL { ... } IN TRANSACTIONS` after a write clause is not supported, unless that write clause is inside a `CALL { ... } IN TRANSACTIONS`. -Additionally, there are some restrictions that apply when using an importing `WITH` clause in a `CALL` subquery: - -* Only variables imported with the importing `WITH` clause can be used. -* No expressions or aliasing are allowed within the importing `WITH` clause. -* It is not possible to follow an importing `WITH` clause with any of the following clauses: `DISTINCT`, `ORDER BY`, `WHERE`, `SKIP`, and `LIMIT`. - -Attempting any of the above, will throw an error. -For example, the following query using a `WHERE` clause after an importing `WITH` clause will throw an error: - -.Query -[source, cypher, role=test-fail] ----- -UNWIND [[1,2],[1,2,3,4],[1,2,3,4,5]] AS l -CALL { - WITH l - WHERE size(l) > 2 - RETURN l AS largeLists -} -RETURN largeLists ----- - -.Error message -[source, error] ----- -Importing WITH should consist only of simple references to outside variables. -WHERE is not allowed. ----- - -A solution to this restriction, necessary for any filtering or ordering of an importing `WITH` clause, is to declare a second `WITH` clause after the importing `WITH` clause. -This second `WITH` clause will act as a regular `WITH` clause. -For example, the following query will not throw an error: - -.Query -[source, cypher] ----- -UNWIND [[1,2],[1,2,3,4],[1,2,3,4,5]] AS l -CALL { - WITH l - WITH size(l) AS size, l AS l - WHERE size > 2 - RETURN l AS largeLists -} -RETURN largeLists ----- - -.Result -[role="queryresult",options="header,footer",cols="1* Date: Thu, 8 Aug 2024 16:21:22 +0200 Subject: [PATCH 6/9] Fix typos on parsing page (#1014) --- modules/ROOT/pages/syntax/parsing.adoc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/ROOT/pages/syntax/parsing.adoc b/modules/ROOT/pages/syntax/parsing.adoc index 0a64ed215..54db83bde 100644 --- a/modules/ROOT/pages/syntax/parsing.adoc +++ b/modules/ROOT/pages/syntax/parsing.adoc @@ -15,7 +15,7 @@ Additional documentation on escaping rules for `STRING` literals, names and regu * xref::queries/expressions.adoc#expressions-string-literals[String literal escape sequences] * xref::syntax/naming.adoc#symbolic-names-escaping-rules[Using special characters in names] -* xref::clauses/where.adoc#escaping-in-regular-expressions[Regular epxressions] +* xref::clauses/where.adoc#escaping-in-regular-expressions[Regular expressions] The following example escapes the unicode character `A` (`\u0041`) in the keyword `MATCH`: @@ -44,9 +44,9 @@ The following unicode characters are considered as whitespace: [options="header", cols="1,2"] |=== | Description | List of included Unicode characters -| Unicode general gategory Zp | `\u2029` -| Unicode general gategory Zs | `\u0020` (space), `\u1680`, `\u2000-200A`, `\u202F`, `\u205F`, `\u3000` -| Unicode general gategory class Zl | `\u2028` +| Unicode general category Zp | `\u2029` +| Unicode general category Zs | `\u0020` (space), `\u1680`, `\u2000-200A`, `\u202F`, `\u205F`, `\u3000` +| Unicode general category class Zl | `\u2028` | Horizontal tabulation | `\t`, `\u0009` | Line feed | `\n`, `\u000A` | Vertical tabulation | `\u000B` From 2014d2a04257253f6a398e809a2e2a7613dad205 Mon Sep 17 00:00:00 2001 From: Gem Lamont <106068376+gem-neo4j@users.noreply.github.com> Date: Fri, 9 Aug 2024 09:22:17 +0200 Subject: [PATCH 7/9] Add further considerations for CASE expressions (#1013) 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> --- modules/ROOT/pages/queries/case.adoc | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/modules/ROOT/pages/queries/case.adoc b/modules/ROOT/pages/queries/case.adoc index 04ac4f195..1dae13b99 100644 --- a/modules/ROOT/pages/queries/case.adoc +++ b/modules/ROOT/pages/queries/case.adoc @@ -323,3 +323,29 @@ RETURN n.name, n.colorCode |=== For more information about using the `SET` clause, see xref::clauses/set.adoc[SET]. + +== Further considerations + +`CASE` result branches are statically checked prior to execution. +This means that if a branch is not semantically correct, it will still throw an exception, even if that branch may never be executed during runtime. + +In the following example, `date` is statically known to be a `STRING` value, and therefore would fail if treated as a `DATE` value. + +.Not allowed +[source, cypher, role=test-fail] +---- +WITH "2024-08-05" AS date, "string" AS type +RETURN CASE type + WHEN "string" THEN datetime(date) + WHEN "date" THEN datetime({year: date.year, month: date.month, day: date.day}) + ELSE datetime(date) +END AS dateTime +---- + +.Error message +[source, error] +---- +Type mismatch: expected Map, Node, Relationship, Point, Duration, Date, Time, LocalTime, LocalDateTime or DateTime but was String (line 4, column 38 (offset: 136)) +" WHEN 'date' THEN datetime({year: date.year, month: date.month, day: date.day})" + ^ +---- \ No newline at end of file From 20b83d771468bddc504690a94f880464d333968c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Fri, 9 Aug 2024 13:41:00 +0200 Subject: [PATCH 8/9] Remove link to Cartesian CRSs (#1016) --- modules/ROOT/pages/values-and-types/spatial.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ROOT/pages/values-and-types/spatial.adoc b/modules/ROOT/pages/values-and-types/spatial.adoc index a7daf8684..dce319fb1 100644 --- a/modules/ROOT/pages/values-and-types/spatial.adoc +++ b/modules/ROOT/pages/values-and-types/spatial.adoc @@ -95,10 +95,10 @@ RETURN toInteger(point.distance(p1, p2)/1000) AS km Two Cartesian Coordinate Reference Systems (CRS) are supported, modeling points in euclidean space: -* link:https://spatialreference.org/ref/sr-org/7203/[Cartesian 2D] +* *Cartesian 2D* ** A 2D point in the _Cartesian_ CRS is specified with a map containing `x` and `y` coordinate values ** Specifying this CRS can be done using either the name 'cartesian' or the SRID 7203 as described in xref::functions/spatial.adoc#functions-point-cartesian-2d[point() - Cartesian 2D] -* link:https://spatialreference.org/ref/sr-org/9157/[Cartesian 3D] +* *Cartesian 3D* ** A 3D point in the _Cartesian_ CRS is specified with a map containing `x`, `y` and `z` coordinate values ** Specifying this CRS can be done using either the name 'cartesian-3d' or the SRID 9157 as described in xref::functions/spatial.adoc#functions-point-cartesian-3d[point() - Cartesian 3D)] From 21d63cc9641ecd8b361cdac32870ae5f0588e7a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20Pryce-=C3=85klundh?= <112686610+JPryce-Aklundh@users.noreply.github.com> Date: Fri, 9 Aug 2024 13:53:55 +0200 Subject: [PATCH 9/9] Fix typo in Patterns reference (#1017) --- modules/ROOT/pages/patterns/reference.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/patterns/reference.adoc b/modules/ROOT/pages/patterns/reference.adoc index f145e88bb..d9da89346 100644 --- a/modules/ROOT/pages/patterns/reference.adoc +++ b/modules/ROOT/pages/patterns/reference.adoc @@ -779,7 +779,7 @@ Matches one or more relationships with type `R` and of any direction, and any no ()-[:R]-+() ---- -Matches paths consisting of two inbound subpaths, one with relationships of type `A` and one with relationships of type `B`, meeting at a node with label `A`: +Matches paths consisting of two inbound subpaths, one with relationships of type `R` and one with relationships of type `S`, meeting at a node with label `A`: [source, role=noheader] ---- ()-[:R]->+(:A)<-[:S]-+()