[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Neo4j 4.0 changelog

Neo Technology Build Agent edited this page Jul 5, 2021 · 37 revisions

4.0.12

Kernel

  • Fix issue with "standard-folding" fulltext index analyzer would not work with wildcard queries. Github issue: neo4j/neo4j#12662
  • Fix some corner cases where unhelpful exceptions were thrown when a transaction would read a deleted entity lazily. The entity could have been deleted by this or some other concurrent transaction. We now throw ReadAndDeleteTransactionConflictException from the embedded API, and TransientException (which tells clients to retry their transactions) from the driver (Bolt) API.
  • Fix bug where neo4j-admin copy would fail when upgrading from 3.5 store if fulltext indexes where present.
  • Admin commands stop using the 'Xms' heap setting
  • Fixes an issue where the experimental consistency checker would incorrectly report "The first relationship group record has another node set as owner." inconsistencies.
  • Update jersey to 2.34 to address CVE-2021-28168
  • Better handling of inconsistent property chains so that in the very unlikely event that a property record chain cannot be read properly a better failure will propagate to the user. It is also possible to delete entities with inconsistent property chains, at which point the entity's data will be logged to debug.log (only if user explicitly sets setting dbms.log_inconsistent_data_deletion=true.
  • Fixes a bug in the experimental consistency checker that prevented all node indexes from using the index checking variant designed for larger indexes.
  • Fixes an issue where enterprise fabric.graph.<name>.* settings would log warnings and be ignored
  • Fix issue with relationship belonging to dense nodes in the high-limit format that could cause corruptions. This affects relationship types with ids larger than 65535.

Cypher

  • Fixed a bug where an index scan would be used to solve an OPTIONAL MATCH incorrectly.

  • Fix bug where using aggregation in a reduce expression could lead to the wrong result.

  • Fixes a bug where the order of results in a query with an ORDER BY could be wrong, if the query plan included a NodeLeftOuterHashJoin.

  • Fix bug with exists on nullable node or relationship property

  • Fixed a bug where count store lookup would be incorrectly planned for a pattern with a multi-labeled node.

  • Fix error Index cursor cannot have transaction state with values and without values simultaneously happening for some queries that used the index when there are updates in the transaction state.

  • Fixes various bugs where the Eager operator was not being correctly planned.

    • Eager after an OR of label predicates was missing, e.g. in ... MATCH (b:B) WHERE b:B2 OR b:B3 SET a:B2 ...
    • Eager after an OPTIONAL MATCH was missing, e.g. in ...OPTIONAL MATCH (b:B) MATCH (c) SET c:B ...
    • Eager after any MATCH clause with a single starting point that does not solve the conflicting predicate was missing, e.g. in ... MATCH (n:N:M), (x) SET x:M ... when starting with a NodeByLabelScan on n:N.
    • Eager after shortestPath was missing, e.g. in ... MATCH p = shortestPath((a:A)-[:T*]-(b:B)), (c) CREATE (a)-[:T]->(c) ...
  • Don't overflow on --9223372036854775808. Github issue: neo4j/neo4j#12726

  • Fixed a bug where running an aggregating query through Fabric would fail with namespacing error.

Security

  • Upgrade to Apache Shiro 1.7.1
  • Fix a bug where the security context on a transaction was being overridden to allow administration commands to be run, but was not properly being reset to the previous state.

Causal Clustering

  • Update Netty to 4.1.60

Browser

  • Fix for fullscreen not growing to full size
  • Add color to relationships in sidebar
  • Update connection form to better reflect aura usage
  • Disable test for feature not in aura
  • Fix issue where users couldn't be added when on a cluster
  • Update "create index" examples to use new syntax
  • Update cypher editor with new keywords
  • Removed information about creating a new db in :play movies
  • Allow zoom buttons on small frames (with settings config)
  • Introducing new editor powered by Monaco
  • Update documentation drawer look & feel
  • Add :server disconnect link to the sidebar
  • Bump Neo4j driver to 4.2.2
  • Update how browser detects and behaves in different environments (Aura)
  • Make commands editable and re-usable
  • Fix bug on Bolt URL scheme changing on refresh
  • Improve performance when receiving large query results
  • Favorites ux refresh
  • Frame button interaction changes
  • Fix bug when closing a frame with a running query
  • Canny Support
  • Updated :play intro with new screenshots and text.
  • Fix dragging favorites outside of folders
  • Fix text view font issues
  • Auto-close single quotes in cypher editor
  • Fix favorites sidebar bug
  • Fix issue where Monaco command palette would be partially hidden
  • Improve cypher editor warnings positions
  • Fix regressions in editor font weight
  • Fix an issue with query history not being reset in some cases
  • Restore previous behavior for clicking to edit favorite content
  • Add guides to sidebar
  • Remove "Are you sure you want to close this" modal
  • Give monaco search widget proper focus
  • Use last db instead of default db where possible
  • Add aura promotion in community
  • Neo4j Logo updates
  • Re-add populating main editor with cmd+click
  • Improve styling of new sidebar guides
  • Add support for home database
  • Add 4.3 cypher keywords
  • Upgrade to driver 4.3.0
  • Fix issue where sandbox showed "Connecting.." banner even when connected
  • Add support for browser.retain_editor_history setting
  • Frame UI updates including new frame button positions
  • Fix graph visualization performance issues for nodes with long captions
  • Bump driver to 4.3.1
  • Focus reusable editor on edit

Docker

  • add --expand-commands flag to neo4j-admin commands

Misc

  • Fixes an issue with the length and size functions returning 1 instead of throwing an error for unsupported input values
  • Fix bug when counting multiple nodes with the same label.

4.0.11

Kernel

  • Fixes an upgrade issue to high_limit format where some secondary unit record IDs may have ended up on the freelist
  • Fixes further array-index-out-of-bounds issues iterating over all index entries in a lucene index during consistency check.
  • Fixes an issue with over-assigning threads during import which could lead to scheduling problems and sub-optimal performance
  • Fixes an issue in consistency checker where the checker would throw exception and fail if discovering a uniqueness index w/o any reference to the constraint

Cypher

  • Fix issue with compiled expressions where an error saying got NO_VALUE instead of expected input.
  • Fix possible multiple default database creation

Causal Clustering

  • FIxes a bug where neo4j-admin report on standalone would fail due to missing cluster data

Misc

  • Update jetty to address security vulnerability CVE-2020-27218

4.0.10

Kernel

  • Fixes issue specifying more complex regex patterns as CSV Input files to the importer.
  • Allow cross-version copy in neo4j-admin copy
  • Fixes an issue scanning records in high_limit format, where trying to read a record which happened to be a secondary unit would throw exception or read invalid data instead of observing it as unused
  • Restore ability to have KeyStores with multiple certificates
  • neo4j-admin copy will now ignore configured record format

Security

  • Upgrade to Apache Shiro 1.7.0

4.0.9

Kernel

  • Importer provides correct estimates for compressed csv files

  • Fixes a log pruning comparison issue in volumetric check point threshold

  • Prevent crash in dbms.killTransaction when log level is set to debug

  • Fixes an issue decrementing node degrees where deleting a relationship from a node could sometimes, if the node had self-relationships, decrement the degree twice

  • Special handling of unrelated SSL policies in the backup command

  • Fixes an issue where an unexpected concurrent closing of a page cursor which was in the middle of doing page faulting might leave a latch unreleased, trapping all future cursors that wanted to look at that page.

  • Update dependencies due to security issues

    Jetty 9.4.17 -> 9.4.34 - https://nvd.nist.gov/vuln/detail/CVE-2020-27216 Jersey 2.29 -> 2.32 - SRCCLR-SID-3606 Jackson 2.10.0 -> 2.10.5 - For version compatibility

Cypher

  • Upgrade the dependencies of SLF4j and Shiro to latest stable versions in order to mitigate security vulnerabilities.

  • Fix issue where queries like WITH *, count(a) AS c ORDER BY c RETURN a were failing with no variable a in scope.

  • Fixed a bug where aggregation followed by a map projection would cause a query to hang or fail with There was a cycle in names error.

  • Fixes a scoping issue where nested pattern comprehensions were evaluated in the wrong scope leading to wrong results. An example of such a query:

    MATCH (f:F)<-[:A]-(p)
    WHERE
      ALL(condition IN [
        (p)-[:B]->(d:D)
        d.name CONTAINS 'foo'
      ] WHERE condition)
    RETURN p { .name }
    
  • Fix bug where predicate in WHERE clause was ignored for queries combining

    variable lenght pattern and DISTINCT.

  • Fix error where we could get an error Missing kernel to cypher mapping for index behavior: EVENTUALLY_CONSISTENT in Cypher.

  • Fixed an issue where dbms.listTransactions and dbms.listQueries could fail if the server starts up with a database in the stopped state.

Causal Clustering

  • Fixed bug where clusters could get stuck bootstrapping in the event of network issues or instance restarts.

    Description

    • Prevoiusly there was a small window for a race where a member would mistakenly believe it had failed to publish a raft Id. It would then observe the raft id it published and, assuming someone else had bootstrapped, wait forever.
    • Now, when we observe a raftId while trying to bind we check whether someone else actually published it before we wait.
    • In the even that we published it but believe we failed, we simply retry publishing. It is an idempotent operation.

    Notes

    • Added RaftBinderTest which tests whether a server will eventually try to bootstrap if it succeeds in publishing a raftId but believes that it has failed.
    • Add didBootstrapDatabase check
    • Added RaftId->MemberId map to BootstrappedRaftsMessage
    • Added bootstrappers to bootstrap state and tested
    • Exposed didBootstrap lookup through CoreTopologyService

Browser

  • Update change password form to avoid overlap with password manager icons
  • Fix comment issue in multi statement commands
  • Update UX on :style usage
  • Fix text position in GraphComponent for rtl languages
  • Improve editor view sizes (single-line, card view and fullscreen)
  • Add multi statement query warning when multi statement is disabled
  • Make editor a frame that has control buttons
  • Add new keyboard shortcut to toggle editor full-screen
  • Fix fullscreen issue in safari
  • Recognize new Neo4j Aura editions
  • Re-add esc as shortcut
  • Clear resets favorite
  • Update :server connect form to pick database
  • Add useragent when to neo4j-driver config
  • Add support for browser.remote_content_hostname_allowlist
  • Info about lack of some data in sysinfo for non-legacy community version
  • Add support for storing scripts as project files when in a desktop environment (for desktop versions that support it)
  • Add favorites and saved scripts from result frame
  • Initial Monaco Editor implementation
  • Do not store connection passwords in local storage before receiving neo4j config

Misc

  • The neo4j-admin push-to-cloud command has been re-enabled for Neo4j 4.x and now also does an early check for whether the database will fit the Aura instance before making the dump
  • changelog: Cypher-shell version 4.0.6

4.0.8

Kernel

  • Make failed indexes restartable again

  • Fix bug where indexes and constraint might be incorrectly migrated when upgrading from standard to high_limit format.

  • Fixes an ID allocation issue when importing a large amount of relationships so that double-record-unit allocation got enabled. This could result in some relationships getting one of their record units overwritten

  • Don't fail SslPolicy creation if there are dotfiles present in the certificate directories

  • Fix bug with potential wrong order for queries with "ORDER BY"

    that use an index in the presence of concurrent inserts into that index.

  • Improve error message when index key size limit is violated during index population, include entity id index description.

Cypher

  • Fix a bug in the code generation for pipelined runtime, that under certain rare plans could cause that not all the necessary variables in a row were copied between pipelines, leading to null pointer exceptions or unexpected results.

  • Fix bugs in planning (NOT) EXISTS subqueries within different horizons

  • Fix issue where an error was thrown during planning for some complex COLLECT/UNWIND queries.

  • Fix bug when combining * and a map projection in the same projection, e.g. WITH , s {.}...

  • Update Apache Shiro to 1.5.3

  • 4.0 planner cardinality fix for OPTIONAL MATCH under APPLY

  • Fix bug which could end up in Can't coerce NO_VALUE to Path errors being thrown

    when using user-defined functions.

  • Fixed a bug where using node:Label check on a node returned from a procedure would result in a planner error.

  • When running Cypher queries with PROFILE, the amount of rows for operator would be wrong in certain cases if the pipelined runtime is used to execute a query. This has been fixed.

  • Retain solved hints from the right-hand side of a union.

  • Prevent excess memory usage in OrLeafPlanner with many ORs

  • Accept dots in database names

Misc

  • expose and document the causal_clustering.cluster_binding_timeout setting

4.0.7

Kernel

  • Fix a bug where deleting a relationship would not remove its entry from any relevant full-text index on relationships such relationships.
  • Fixes issue populating ID files during migration

Cypher

  • Fix extremely slow query compilation for large queries using runtime=pipelined. This would manifest as some large queries taking extremely long to run even using EXPLAIN, while running the same query using runtime=slotted would execute normally.
  • Fix a bug where pattern comprehension and predicates evaluating to null could lead to the wrong result.
  • Fixed a bug where map projection inside a list or pattern comprehension would fail with Unknown variable error.
  • Cypher-shell version 4.0.5

Browser

  • Mdx guide support

  • Fix reading server configuration with the PUBLIC user role

  • Update the UI color schemes (dark, light, contrast)

    Example:

    Screenshot 2020-06-23 14 37 52
  • Vertical align result table cell values at row top

  • Upgrade neo4j-driver to 4.1.0

  • Fix integer rendering in table recursively + JSON export

Docker

  • explicitly set neo4j uid and gid to 7474 in Docker

4.0.6

Kernel

  • Fixes issue where created indexes would stop being resampled after restart
  • Allow JMX exporter to export metrics on its own.

Cypher

  • Fixed a NullPointerException that could occur if the setting cypher.query_max_allocations was not 0.
  • Fixed a ArrayIndexOutOfBoundsException that could occur if the setting cypher.query_max_allocations was not 0.
  • Fixes a bug where, in embedded, getting the PROFILE of a query before it was executed completely was mistakenly allowed.
  • Fix issue with index reads not releasing resources until the end of query execution, which could lead to OutOfMemory problems under heavy load. This could for example happen in queries performing a MERGE clause over thousands of rows.
  • Fix a bug where queries with Aggregations and RETURN * could hang forever during planning.

Browser

  • Add a more performant result table
  • Support new bolt schemes
  • Add sidebar links to browser release, changelog, and developer pages
  • Fix reading username from connectURL param
  • Fix auth scheme error from driver when auth is disabled + reflect auth status on :server connect frame
  • Add re-run button to all frame types
  • Fix sending tx metadata with each query
  • Fix only executing relevant background queries (auth, cluster)
  • Add memory allocation to plan output if provided by Neo4j
  • Fix displaying large integers in new table correctly

4.0.5

Kernel

  • Includes store file name in version/ids debug.log printout
  • Includes NodeRecord in dynamic label record load error
  • Ensures counts store is properly built on import into empty db
  • Fixes issue shrinking high_limit double-unit record back to single-unit
  • Fix some cases where the server could not be shutdown while it was blocking on startup
  • Fix error with negative ids when using CALL dbms.killQuery
  • Fixes a rare issue where index statistics data could temporarily be observed as being zeros
  • Add page cache bytes read/written metrics

Cypher

  • Make joinSolverStep generate joins when goal is compacted (#5620)

  • Fix regression due to resource tracking of resource managers

  • Fixes a bug with the error message Did not find any type information for expression .... An example query that would trigger this bug is

    MATCH (user:User)
    WHERE ($range[0] > user.id OR user.id > $range[1])
    RETURN user
    LIMIT 1
    
  • Fixes a bug with the error message Tried to invalidate a cached property ... but no slot was found for the entity name ... that could appear in queries that set or remove properties.

  • Fix bug in cardinality calculation where the presence of unrelated arguments could cause the planner to pick a LabelScan instead of an Argument operator.

  • Fix a bug where users were seing Expected a string value for ``toLower``, but got: NO_VALUE; consider converting it to a string with toString(). unexpectedly.

  • Fix show current users privileges for external user

Causal Clustering

  • Log ClusterId and MemberId in neo4j.log on cluster bootstrap
  • Fix the handling of transactions exceeding the 1GiB limit in clusters. This could previously lead to a situation where such a transaction was partially accepted into the system, but could not be replicated. The underlying change might also benefit performance in some situations.

Browser

  • Enable multi statement mode in editor by default
  • Use new plan field ‘Details’ to plan visualization (for Neo4j versions where it exists)
  • Fix so browser doesn't execute meta query on system db
  • More reliable connection status check

Misc

  • Fix transaction handling of Neo4jJsonCodec in HTTP endpoint.

4.0.4

Kernel

  • Move store copy command to community edition.
  • Fixes a bug that in rare cases can lead to a JVM crash with a sysmalloc: Assertion or SIGSEGV error message.
  • Improve disabled metrics log messages
  • Fix validation for external path (from/to) in administrative commands
  • The neo4j-admin copy command is now capable of copying data out of databases with token stores that have duplicate entries. Furthermore, data that refers to non-existing tokens will now have new tokens invented for them. This means that data that involves broken or missing tokens will now be salvaged rather than ignored.

Cypher

  • Fix bug where existential subqueries inside OR predicates were not properly supported.

  • Fixes $12433, when combining OPTIONAL MATCH, aggregation and map-projection, in some scenarios we

    failed with: Can't coerce NO_VALUE to Map.

  • Adds a procedure db.ping() :: (success :: BOOLEAN?).

    This procedure can be used by client side tooling to test whether they are correctly connected to a database. The procedure is available in all databases and always returns true. A faulty connection can be detected by not being able to call this procedure.

  • Fix bug with exists and dynamic map lookup

  • Fixes incorrect ordering for queries with "ORDER BY" that got plans with NodeHashJoin right of Apply. The bug only existed in the pipelined runtime.

  • Fix bug with PatternComprehension and "ORDER BY".

    Combination of PatternComprehension, MapProjection and "ORDER BY" could sometimes lead to SteackOverflow exceptions.

  • Fix bug with VarExpand(Pruning) failing to compile with Tried overwriting already taken variable name in slotted and pipelined runtimes. Solve issue $12441.

  • Fixed a bug that would result in org.neo4j.driver.exceptions.DatabaseException: org.neo4j.cypher.internal.physicalplanning.ast.NullCheckReference.

  • Fixed a bug with namespacing of existential subqueries using an ambiguous outer variable.

  • Update shiro to 1.5.2 to fix BlackDuck warning

  • Cypher-shell version 4.0.3

  • Fixes a bug where the security graph wasn't initialized unless native was used in either dbms.security.authentication_providers or dbms.security.authorization_providers when running in a clustered environment

  • Cypher-shell version 4.0.4

Causal Clustering

  • Introducing a new global metric (same level as Bolt Server, JVM and Netty Server metrics) about the number of database operations in the instance. Six counters are exposed:

    • Number of database creations: neo4j.db.operation.count.create.
    • Number of database starts: neo4j.db.operation.count.start.
    • Number of database stops: neo4j.db.operation.count.stop.
    • Number of database drops: neo4j.db.operation.count.drop.
    • Number of failed operations: neo4j.db.operation.count.failed. For each database it counts only once. So if more operation (same or different) fail on the same database this counter will increase only once.
    • Number of recovered operations: neo4j.db.operation.count.recovered. This counter increases once the database leaves the failed state.

    From the numbers above it is possible to calculate, how many databases are started, stopped or in a failed state on a DBMS instance.

  • The database could previously leave the "temp-bootstrap" directory around as part of cluster formation and especially as part of a series of failed formation attempts this lead to them getting stacked further and further on top of each other (i.e. temp-bootstrap/temp-bootstrap/temp-bootstrap/...). This should only have affected the bootstrapping of the system database. For installations which are functional but have this directory laying around unnecessarily it will simply be removed now for any database.

Browser

  • Auto-run :play commands when sent with URL params (deep-link)
  • Reuse :help and :play frames by building frame stacks from internal link clicks
  • Style start frame to look better in different resolutions
  • Fix initial load behavior when opened in Neo4j Desktop without an active db.

Docker

  • removed docker specific configuration overrides incompatible with windows networking

4.0.3

Kernel

  • Add options to 'neo4j-admin copy' for configuring the size of the page cache used
  • Fix a bug in DETACH DELETE on dense nodes that could lead to inconsistencies.
  • Change scope of slf4j nop dependency to runtime in harnesses
  • Fix a bug where DETACH DELETE would not lock the relationships being deleted, allowing overlapping transactions to make changes, such as property updates and chain linkage changes, to those records, which could lead to inconsistencies.
  • Remove deprecation of lucene+native-3.0 index provider
  • Fixes a bug that can cause "non unique token" exceptions after upgrading a 3.5 store to 4.0.

Cypher

  • Parsing or compilation related errors are now also logged in the query log.

  • Fixes a bug where you could not revoke a sub-privilege that was denied when having the compound privilege granted.

    E.g. DENY NAME MANAGEMENT ON DATABASE * TO admin followed by REVOKE DENY NAME MANAGEMENT ON DATABASE * FROM admin

  • Revert the deprecation of the config settings dbms.security.ldap.authorization.group_to_role_mapping, dbms.security.procedures.default_allowed and dbms.security.procedures.roles, since replacements are not in place yet.

  • Database and graph names are now case-insensitive for all security administration commands.

Causal Clustering

  • During store copy leader will be determined not only form Raft but as backup also from Discovery
  • 4.0 Netty bump

4.0.2

Kernel

  • Fixed bug where getDegree would leak blocked relationships

    This call was used in Cypher to answer queries like RETURN size((a)-->()). If the relationships or the end node labels were not visible, either due to blacklisting (DENY) or lack of whitelisting (GRANT), the correct answer would only be returned for non-supernodes. With supernodes, the optimization would not consider security and give too high counts.

    The fix applies to both the Cypher surface and the Core API (NodeEntity).

  • The neo4j-admin copy command now correctly ignores indexes and constraints that cannot be correctly read from the schema store.

  • The neo4j-admin load command now has an --info option that will make the command print information about the archive, instead of loading it.

  • Pass through exception message in transaction event handlers

  • Fix a problem where the combination of parallel apoc.periodic.iterate, and dbms.logs.query.parameter_logging_enabled=true, could lead to a JVM crash.

  • Last line in the configuration file is no longer ignored if there is a missing new line

  • Fix dbms.logs.gc.rotation.size validation error

  • Fix bug where store upgrade could see IndexOutOfBoundsException when upgrading store that was much larger than available memory.

  • Add jvm argument, -Dorg.neo4j.kernel.impl.storemigration.RecordStorageMigrator.migration_threads=, to set number of threads used to read and write when upgrading store. By setting a lower value the contention on disk can be reduced. Default value is the number of processors available to the process.

  • db.info and dbms.info functions to retrieve database and dbms identity information.

Cypher

  • Fix a bug that could cause a class cast exception when accessing a cached property on a node value that was null.

  • Fix issue that could lead to errors when using map projections with projections that evaluates to null.

    $fixes: 12398

  • Fixed a bug where outer hash join would be incorrectly planned to solve OPTIONAL MATCH with non-join dependencies.

  • Track memory used by Expand(Into)

  • The currently logged-in user, even if not an admin, can use SHOW USER username PRIVILEGES to lookup its own privileges

  • Track memory in pruning-var-expand

  • Fix bug where the wrong results could be returned in pipelined

    runtime whenever a filter came after a distinct.

  • Fixed bug in compiled expressions where a null path from an OPTIONAL MATCH inserted into nested functions lead to an unexpected error.

  • Fixed a bug where shadowed variable from outer scope would be accessible inside list comprehension when combined with aggregating function.

  • Fix so that SHOW DATABASES only show databases that the current user has access privilege on.

Causal Clustering

  • Fix initialisation race in reconciliation tracker.
  • Ensure binding to raft does not retry on timeout to avoid the case where it might incorrectly think someone else have published.
  • Introduce Raft applied index metric ('neo4j..causal_clustering.core.applied_index')
  • The cluster formation process changes the system database on the bootstrapper node and needs to remove the system database from the other nodes for consistency, but if the formation fails at the wrong time and is attempted again with another node being selected as the bootstrapper then that node will have saved the system database to a temporary location and restore it from there.
  • If the system database fails to bootstrap the DBMS will now perform an orderly shutdown, rather than hanging.

Browser

  • Fix re-run for Cypher queries to target original DB
  • Fix reacting to deep links when in Neo4j Desktop environment
  • Fix scroll to top bug when a frame was deleted

4.0.1

Kernel

  • Fix race between index drop and checkpoint
  • Bump dependencies to address security issue
  • The Neo4j Community Edition now includes the slf4j-nop jar, and no longer prints an SLF4J warning to the neo4j.log.

Cypher

  • Less wrapping of errors caused by system commands against followers
  • Switching between CYPHER 3.5 and CYPHER 4.0 now works correctly.
  • Fixed the case where an existential subquery would fail after a WITH clause that introduces new variables, renames a variable or uses DISTINCT.
  • The role name "PUBLIC" is reserved for the system thus cannot be used. If the system detects that this role exists (at startup or migration), you will be asked to remove it before the system can be started.
  • Disallow un-named return items in subqueries, such as CALL { MATCH (m) RETURN m.title } .... This syntax would lead to confusing errors when the implicitly named variable m.title would have to be escaped to be used later in the query, which was easy to forget, and would lead to confusing error messages.
  • Fix null predicates in compiled all/any/none/single
  • Removed deprecated legacy separator syntax
  • Fix bug which could lead to Can't coerce ([nodeId]) to Map in some situations. Fixes $12399.

Security

  • Fixed bug where you got access when it was both granted and denied.

Causal Clustering

  • Remove ClusterSystemGraphDbmsModel NPE

Browser

  • Add URL param support for populating editor with Cypher and parameters
  • Use GraphQL version of Relate-API when available (in Neo4j Desktop)
  • Format node/relationship counts in sidebar, inspector and legend
  • Suggest strong passwords in change-password frame
  • Prefer bolt_routing URL from discovery if it exists
  • Update SchemaFrame styling
  • User feedback running system commands
  • Fix versioned links to external docs
  • Query plans view expanded by default
  • Update neo4j-driver to 4.0.1
  • Fix bug where NaN was displayed as null in result view
  • Add new Cypher syntax to :help cypher
  • Fixes viz bug when expand -> dismiss -> expand nodes.
  • Fix :param when returning an implicit object with newlines
  • Fix indexes not showing on 4.0 with the :schema command
  • Allow database names to be escaped with back ticks with the :use command
  • Use best practices driver transaction functions by default
  • Fix HTML rendering issues on query results
  • Correct tab order in change password form
  • Add :help auto + link to it from relevant errors and docs
  • Make node 12 the default (using .nvmrc file) build env

Docker

  • Add NEO4JLABS_PLUGINS support for neosemantics (n10s)

4.0.0

Kernel

  • Bump store format versions to SF4.0.0 for standard and HL4.0.0 for high limit.

Docker

  • Replaced curl with wget in the entrypoint

4.0.0-rc01

Kernel

  • Fix a bug that would sometimes cause a NullPointerException to be thrown when generating index update commands for transaction changes that partially matched a full-text index.
  • The consistency-checker now no longer report NullPointerExceptions when a node or relationship does not have all properties declared in a full-text index. Mismatches between the properties and what is indexed are also properly reported.
  • The listAvailableAnalyzers() procedure now includes the stop-word list used by each analyzer.
  • Backport of query logging at start of query
  • Transaction id is now available for transaction event handles, even for "zero-change write transactions."
  • Fix a bug in internal relationship traversal that could lead to a dense node that does not have any relationships of a sought after relationship type, would appear to have a relationship of that type if the iteration occurred immediately after another non-empty relationship iteration.

Cypher

  • Fixed an IDP planner edge case where complex joins fail to find a solution due to the presence of ignored argument variables

  • Fixes regressions with PatternComprehensions inside of head or single element accesses/list slices . Expamples head([ (a)-->(b) | b.prop ]), [ (a)-->(b) | b.prop ][1], [ (a)-->(b) | b.prop ][..5]

  • Improve error message for procedure calls

  • Added a nicer error message if the planner fails to find a plan

  • Add support for sub-type values in procedure parameter default values

    Fix bug where Number-typed procedure parameters did not support default values

Causal Clustering

  • Fix handling of IPv6 addresses in the backup command.

Tools

  • neo4j-admin set-initial-password now takes an optional flag --require-password-change

Browser

  • Enable database switching with :use xx in multi-statement command
  • Fix errors in community edition
  • Make neo4j-browser compatible with future versions of Neo4j
  • Only show each database once in :dbs output
  • Check if db exists before switching to it, throw if not
  • Update neo4j-driver to 4.0.0

4.0.0-beta03mr03

Kernel

  • Signature change for procedures: db.awaitIndex and db.resampleIndex take index name instead of pattern. Procedures db.createIndex, db.createUniquePropertyConstraint and db.createNodeKey take list of labels and properties instead of combined pattern, ':Label(property)' -> ['Label'], ['property'].
  • The settings for the automatmic page cache warmer are now supported.
  • Upgrade commons-compress to 1.19

Cypher

  • Add ability to disable role management
  • Decrease the chance of getting Found no solution for block with size 0 by reducing the number of solutions considered
  • When calling procedures with parameters of the wrong type, the error message has been improved to make this clear.

4.0.0-beta02

Cypher

  • Create index and create constraint are no longer idempotent

  • Fix a planning problem where the planner wasn't using the index after nodes have been deleted.

  • Combining index read, DISTINCT, and MERGE could in some

    situations end up with an error saying Uh oh... There was no slot for...

  • Solved a bug in compiled runtime where complex NodeHashJoins sometimes led to wrong result.

4.0.0-beta01

Kernel

  • Fix a problem where exceptions can occur in the metrics component during HA mode switch.
  • Fulltext procedure can not create index with duplicate entity tokens
  • Switch transaction state to be allocated off heap by default.

Cypher

  • WGS-84 points will now properly validate their input coordinates. Values for latitude should always lie in the interval [-90, 90], any other value outside this range will throw an exception. Values for longitude should always lie in the interval [-180, 180], any other value outside this range will now be wrapped around to fit in this range.
  • Support database access/start/stop privilege
  • Removal of the REST API UserService endpoint
  • Support index, constraint and token management privileges

Packaging

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

Causal Clustering

  • Optionally use jdk.serialFilter to avoid java serialization exploits
  • No longer try to connect to members which are long gone.
  • Use pooled buffers in store copy
  • Make chunk size configurable in store copy and increase default from 8K to 32K

Misc

  • Startup script has been fixed to run on java11 in all bash variants.

4.0.0-alpha10

Kernel

  • Refactoring of db.indexes() procedure
  • Expose heap usage metrics as part of neo4j provided metrics
  • Expose nodes and relationships counters as part of neo4j provided metrics
  • Remove connectors as group settings
  • Move and rename bolt/https ssl_policy settings
  • Rework to make Config.Builder accept typed Objects instead of Strings
  • The consistency checker no longer logs DEBUG messages about the full text indexes failing to register transaction state providers or procedures. These were harmless to begin with, so now they are gone.
  • Starting a database that needs recovery will no longer wait for a uniqueness index to be rebuilt if the uniqueness index has no uniqueness constraint associated with it
  • Improve error message for returning relationships that are deleted in the same transaction.
  • Fix bug that broke settings that used relative paths when using neo4j-admin backup.
  • Monotonic time tracking for transaction termination monitor
  • Added verbose logging option to query logging to allow log on both start and end of queries
  • Consistency check now verify structural consistency of indexes
  • Added possibility to prefetch files into page cache
  • Added metrics for total store size (per database)
  • Fixed a bug where Distinct combined with MapProjection could cause some results to be removed because they were incorrectly seen as not distinct.
  • Upgrade commons-compress due to security fix

Cypher

  • Fixes bug in slotted runtime, when a property is read from index and then a node property of the same name is updated later in the query.

    E.g. MATCH (n:Label) WHERE n.prop > 0 WITH collect(n.prop) AS ns MATCH (n:Label) SET n.prop = 0

  • Enhance split function to take multiple delimiters

  • Adding ProcedureCallContext to Context that can be used by procedures. This will give procedures information about the context in which they were called, specifically which return items were requested via yield. Based on this, the procedure can safely decide to skip calculating values that are not yielded anyway. The procedures db.labels and db.relationshipTypes have taken advantage of this for performance optimizations.

  • Solved a bug in slotted runtime where complex NodeHashJoins sometimes led to wrong result.

  • Bound calculated selectivity of range seek to exact match selectivity...

  • Allow queries like OPTIONAL MATCH (a) MATCH (a)-->(b) without a WITH

    between the clauses.

  • Adding ProcedureCallContext to Context that can be used by procedures. This will give procedures information about the context in which they were called, specifically which return items were requested via yield. Based on this, the procedure can safely decide to skip calculating values that are not yielded anyway. The procedures db.labels and db.relationshipTypes have taken advantage of this for performance optimizations.

  • Cypher now supports executing sub-queries. This enables, among other things, processing results of a union query, which was not possible before. The syntax for this looks like that:

    CALL {
      MATCH (x:X)
      RETURN x
      UNION
      MATCH(x:Y)
      RETURN x
    }
    RETURN x ORDER BY x.foo
    
  • Upgrade Apache Shiro to 1.4.1 to mitigate DoS vulnerability

  • Post-planning property read pushdown

  • Queries with variables defined before optional matches that contain OR predicates and can be planned as UNION queries were failing to retain the incoming variables.

  • Allows queries like MATCH (n) WHERE id(n)=20.0 RETURN n to return the node with the id 20.

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

High Availability

  • Resets HA slave state on InvalidEpochException

Causal Clustering

  • Additional netty exception logging
  • Added info level logging of raft (pre)voting decisions
  • Load external config file for akka.
  • Fix leak in akka distributed metadata
  • 3.6 - Add cluster cleanup in the event of missing database

Misc

  • Remove self signed certificate.

4.0.0-alpha09mr02

Kernel

  • Settings/Configuration rework
  • The db.labels and db.indexes procedures now no longer take shared schema locks, which means that they no longer conflict with, nor wait for the completion of, schema mutating transactions.
  • Neo4j will always be able to reuse deleted records briefly after being deleted, regardless of crash or running in a clustered environment. All settings regarding id allocation and reuse have been removed.
  • LabelScanStore is always store copied under StoreCopyCheckpointMutex
  • GenericKey only keep entityId if strictly needed to differentiate keys in minimalSplitter
  • The default full text index analyzer is now "standard-no-stop-words", which is the same as the "standard" analyzer, except it does not filter out any stop words.
  • 4.0 setting rework

Cypher

  • Less logging of Discarded stale query...
  • Fix a rewriter issue which caused too many predicates to be rewritten away for certain queries with optional match and distinct.
  • Fix wrong results with PatternComprehensions for VarExpand (4.0)

4.0.0-alpha08

Kernel

  • Spatial index configuration now propagate properly in cluster such that index will have the same configuration on all members. Index configuration is bound to index at the time of creation and not lazily loaded when data is added like before.
  • Fix bug where an eventually consistent fulltext index after db restart not be not be eventually consistent anymore.

Cypher

  • Spatial distance queries will now be solved by a NodeUniqueIndexSeekByRange instead of a NodeByLabelScan when an uniqueness constraint exists.

  • Cache property reads in the row, if the same property is accessed more than once in the query. For example the query MATCH (n:N) WHERE n.prop > 10 RETURN n.prop would only have cached n.prop previously, if it could get the value from an index. Now, it will be cached in any case. This adds caching of relationship properties as well.

    The plan description is changed such that both cache reads and writes appear as cache[n.prop] in the Other column.

  • Fix planning bug with pattern-predicates on var-length-expand patterns, which would get overly expensive plans including RollUpApplies. This bug is only present in 3.5.6.

  • Rarely the planner was not able to find a join between two perfectly joinable plans which would then result in a "Found no solution for block with size 0" error. This is fixed now.

Security

  • dbms.security.auth_provider is replaced by two settings, dbms.security.authentication_providers and dbms.security.authorization_providers. This will allow different providers for authentication and authorization in a much cleaner fashion.

4.0.0-alpha07mr01

Kernel

  • Fixes a problem where the recovery that happened after an incremental catchup in a Causal Cluster, would put the write the wrong starting transaction to the debug.log. The starting transaction was cached from the first recovery, and wasn't cleared for subsequent recoveries. This only influenced the logging output -- the recovery process itself always picked the correct starting transaction to recovery from.
  • Full-text schema index queries can now start with a leading "*" wildcard, such that, for instance, the token "abcdef" in a property value, can be matched by the query "*def".
  • Introduce setting to limit number of databases can be managed by neo4j.
  • Remove commons module helpers from public API.
  • Print process priority as part of neo4j admin report instead of start time.
  • Better handling of OutOfMemoryErrors during log flushing
  • Full-text index configurations, such as analyzer and eventually_consistent, are now properly replicated in a cluster. This makes it safe to customise these settings in a Causal Cluster deployment.
  • Remove metrics.neo4j.enabled in favor of metrics.enabled.

Cypher

  • New physical Operator "Ordered Aggregation" that performs an aggregation operation when some or all of the grouping columns are sorted.
  • Solve bug with the error message This expression should not be added to a logical plan that would only occur in test environments. Remove obsolete runtime pattern matching code.
  • Fix memory hogging query collector
  • Fixes bug with the message "Tried to map bad logical plan. LHS and RHS must never be the same".
  • Fixes bug with the message "Expressions need to be registered with it's owning Pipe, so the profiling knows where to report db-hits". This should now never happen when assertions are disabled.

Misc

  • Backup no longer logs in running server debug.log

4.0.0-alpha06

Kernel

  • A new dbms.checkpoint procedure has been added. This is useful for when you change the log pruning configuration, and you want the changes to take effect quickly. Note that calling this procedure can have a negative effect on transaction throughput because it temporarily disables the dbms.checkpoint.iops.limit setting.
  • number of currently open and maximum number of file descriptors are added to metrics ( file.descriptors.count / file.descriptors.maximum, controlled by setting metrics.jvm.file.descriptors.enabled), as provided by the jvm. currently only available on unix-based operating systems

Cypher

  • Fix bug in slot allocation of aliased variable names
  • Fix bug with node reference leaking to bolt server
  • UNWIND of a singular value will now always be equivalent to UNWIND of a list containing only that value, i.e. UNWIND 7 AS x RETURN x do behave the same as UNWIND [7] AS x RETURN x. This was not consistent in earlier versions of Neo4j.
  • Fix bug where adding nodes to the graph would not cause a query replan
  • Fix rounding error in DurationValue approximate

Causal Clustering

  • Reset last message timer monitor on leader stepping down.
  • Updated dbms.cluster.overview and dbms.cluster.role procedures to support multi-database. Procedure dbms.cluster.overview now outputs a map of databases and their corresponding roles in a column called "databases". This new column replaces "role" and "database" columns. Procedure dbms.cluster.role now accepts a mandatory database name parameter. It still outputs a single role.

Misc

  • Failure message is not flushed when no free work thread is available

4.0.0-alpha05

Kernel

  • Performance of making changes to nodes and relationships are no longer affected by the presence of indexes and/or constraints that are not related to the actual changes. Before these changes a large number of indexes and/or constraints could affect performance of write transactions negatively, even if the actual changes were unrelated to the changes made.
  • Fix a number of cases where unhelpful exceptions were thrown, when a committed write transaction that perform deletes or removals cause conflicts in an overlapping read transaction. We now throw IllegalStateException from the embedded API, and TransientException (which tells clients to retry their transactions) from the driver (Bolt) API.
  • Increase native key size limit to ~8k using Offload store in GBPTree
  • Failed index sampling doesn't prevent index drop. Previously if index sampling failed for some reason, this could prevent index from being dropped because sampler didn't clean up after itself.
  • The neo4j-admin dump now uses a new archive format. This makes the dump and load commands significantly faster, while also making the archives slightly smaller. Additionally, the dump and load commands now also prints their progress to the console.
  • Fix delay calculation in IO limiter
  • Always close reader from RecordingConflictDetector

Cypher

  • fix runtime=slotted any() on rhs of NodeHashJoin
  • Fix bug in planner where queries with many OR:ed exact predicates would plan slowly or never complete, if they where solvable with a uniqueness constraint (or Node Key) index.
  • Added support for range seek on composite indexes
  • Fix missing register-owning-pipe on expression in some pipes

Causal Clustering

  • Partially order routers in accordance with filtering policies
  • Change causal_clustering.middleware_logging.level setting to accept log levels and not integers. Allowed values are DEBUG, INFO, WARN, ERROR and NONE. Remove causal_clustering.disable_middleware_logging setting. Middleware logging can still be disabled by configuring causal_clustering.middleware_logging.level=NONE, which is also the default.

4.0.0-alpha04

Kernel

  • Three improvements around uniqueness constraint creation: (1) Indexes of type UNIQUE without a constraint can be dropped using DROP INDEX ON :Label(key). (2) Uniqueness constraint creation will not be subject to the dbms.transaction.timeout timeout. (3) Uniqueness constraint creation transaction will notice termination, e.g. termination using killQuery/killTransaction procedures will actually terminate it.
  • Move PageCache profiles to common directory
  • Removal of active database concept. Introduce default database.
  • Deprecate for removal dbms.active_database and unsupported.dbms.directories.database.
  • The Causal Cluster Raft Replicator will no longer print (potentially enormous) textual transaction log segments to the debug.log.
  • Index population backed by "block based index populator" could report false negatives for duplicate property values. This happened if, while scanning the store to provide updates for the populating index, property values changed such that the scan would see the same value twice even though no duplication existed in any point in time. This is mitigated by verifying suspected duplicates after population is finished.

Cypher

  • Update from Scala 2.11 to Scala 2.12

  • New physical Operator "Ordered Distinct" that performs a distinct operation when the input is sorted.

  • Adding existential subqueries to Cypher, on the form:

    MATCH (n)
    WHERE EXISTS {
      MATCH (n)-[r]->(p)
      WHERE p.prop > 2
    }
    RETURN n
    
  • Fixes problem in procedure dbms.setTXMetaData() where null value in the given map could lead to a null pointer exception

  • Fixed distance queries that used < and ranged over the dateline and would miss points exactly on the dateline

  • fix scala.MatchError crash on DELETE last(col)

Security

  • Support for pkcs12 and jks keystores

Causal Clustering

  • Routing procedures now run with mode DBMS
  • ClusterBinding Shutdown
  • Enable Raft pre-voting by default
  • Do not start databases when stopped during store copy
  • Status endpoint command rate
  • Improve logging of result of causal cluster handshakes
  • Raft membership manager can no longer consider itself superfluous

Misc

  • Updated OnlineBackup API. Removed deprecated methods for performing full/incremental backup. Added fluent interface methods for configuring backup dependencies and settings. Changed the class to contain a single method for performing a backup that returns a result object.
  • Remove a mandatory --name argument from neo4j-admin backup command.
  • Make CommandIndexTracker monotonically increasing

4.0.0-alpha03

Kernel

  • Index population is now faster for large indexes.
  • Internal annotation processors are now in a separate module so they can run from a cleaner annotation path, rather than the classpath. This makes it easier to convince build tools to not complain about them, when building applications that embed Neo4j.
  • neo4j-admin memrec now makes better suggestions for systems that have memory capacities in the 512 MiB to 1 GiB range.

Cypher

  • dbms.functions() will now also list all available cypher functions as well as information about which function will result in aggregation
  • Fix rare bug in slotted runtime which would manifest as an exception with the message Tried to copy more data into less in Cypher queries with execution plans containing an Apply with a Optional and a Distinct on its right hand side.

Misc

  • Updated Jetty version to 9.2.26.v20180806
  • Remove deprecated procedures, db.schema, dbms.security.showCurrentUser and dbms.changePassword

4.0.0-alpha02

Kernel

  • Adds IndexReader#distinctValues() able to access all distinct values in an index with number of indexed entries for each value. Values are materialized if user requests it and the index supports materialization of actual values.
  • Makes consistency checker relationship cache algo actually work
  • Backport: Removes accidental limitation of number of reltypes to 64K for high_limit format

Cypher

  • New physical operators: PartialSort and PartialTop. They perform a Sort or Sort+Limit operation, if the input is already sorted on a subset of the columns. For example, we would plan a PartialSort for ORDER BY a, b, if the input is already sorted by a.
  • Add the current temporal instant as a default value to the temporal truncate function. E.g. datetime.truncate('day') is now a valid shorthand version of datetime.truncate('day', datetime()).
  • Performance: Don't use refleciton to invoke procedures and user-defined functions.
  • Fix bug in slotted NodeRightOuterHashJoin, which would lead to wrong results.

4.0.0-alpha01

Kernel

  • Adds IndexReader#distinctValues
  • Introduce procedures that able to kill transactions.
  • Throttle StoreSizeMBean calls to prevent excessive resources consumption
  • Neo4j will now log warnings if there are duplicate settings in the neo4j.conf file.
  • Update reported metrics types to correctly represent nature of reported event.
  • Removes explicit neo4j-admin import db existence check
  • Improves the error message when a kernel extension cannot be loaded for various reasons, such as version mismatches between extensions like APOC, and Neo4j itself.
  • Remove explicit/legacy/manual indexes.
  • Fix public api: revive legacy iterators
  • Fix VM pause monitor logging
  • A new db.index.fulltext.awaitIndex procedure has been added, which can await indexes specified by name, instead of the label/property pattern it supported so far by the db.awaitIndex procedure. Specifically, this means that you can now wait for specific named fulltext indexes to come online. Previously it was only possible to wait for fulltext indexes to come online, by calling the db.awaitIndexes procedure, which waits for all schema indexes. The behaviour of the existing db.awaitIndex procedure has not been changed, in order to preserve compatibility.
  • When a native memory allocation fails, Neo4j will now include helpful debugging information in all such cases, instead of just some of them.
  • Fix node set property to not lock unrelated constraints
  • Fix a problem where if a fulltext schema index and a normal schema has the same schema (e.g. the same label and property combination) then the fulltext schema index could not be dropped. It is now possible to drop fulltext schema indexes, even when the schema of the fulltext index matches that of a normal schema index.
  • Fixes a race updating the label index, where e.g. a node CREATE followed by DELETE could be reordered into DELETE followed by CREATE, and vice versa.
  • The result of the db.index.fulltext.listAvailableAnalyzers procedure now includes a description of each analyzer. The simple, classic, and stop analyzers from the standard Lucene analyzer suite have also been added.
  • Fixes an issue where a large amount of bad data items encountered during an import could use an excessive amount of heap and slow down the import as a whole. The report queue is now bounded and applies back-pressure.
  • Properly prints FAILED on import failure
  • Close all index readers opened during lockingNodeUniqueIndexSeek
  • Settings controlling log levels of debug.log can now be changed at runtime, those settings are: dbms.logs.debug.level - the default log level of the internal log, and unsupported.dbms.logs.debug.debug_loggers - specific log level per package/logger
  • Restore possibility to use BranchedStoreBean.
  • Improvements to total mapped size calculations
  • Prevent fulltext indexes from being created via db.createIndex procedure.
  • Programatic invocations of online backup now respects the page cache tuning parameters that they are given.
  • Programatic invocations of online backup now respects the page cache tuning parameters that they are given.

Cypher

  • The Cypher planner now can use index provided properties (instead of going to the property store) in the following case: MATCH (n:Label) RETURN n.prop given an index and an existence or node key constraint on :Label(prop).

  • Add procedure for replanning

  • Show file name and line number for LOAD CSV errors

  • The Cypher planner now can use index backed order by for the min and max functions with a range predicate and thus avoid sorting/aggregation for queries like: MATCH (n:Label) WHERE n.prop > 0 RETURN min(n.prop) given an index on :Label(prop).

  • Fix issue where queries with many disjunctive index seeks (... n.age = 3 OR n.name = 'George' ...) would plan forever.

  • Fix issue with compiled runtime and count(), where transient entity inconsistencies would make some aggregating queries (e.g. MATCH (n:Artist) WHERE n.name = 'Madonna' RETURN count(n)) return fewer rows than expected.

  • Fixes an issue with having a DISTINCT (that is on the node instead of the property) between an index read and the usage of the property.

    E.g MATCH (n:Label) WHERE n.prop = 42 WITH DISTINCT n RETURN n.prop

  • Fix an error that made the timestamp function case sensitive, https://github.com/neo4j/neo4j/issues/12097

  • The Cypher planner now can use index backed property values for aggregation functions. That implies that queries like: MATCH (n:Label) WITH n.prop AS property RETURN sum(property) can be solved with a NodeIndexScan rather than a NodeByLabelScan (given an index on :Label(prop)).

  • Make system-graph the built-in default auth provider

  • Obsfucate LDAP system password in debug log

  • When ordering both by aliased (var01) and unaliased (p.name)

    columns, we would possibly swap them. This is now fixed.

  • Updating after undirected match with predicate

  • Fix issue with PROFILE and EXPLAIN of queries with unusual variable names

Packaging

  • Pass command line arguments to powershell scripts using proper parameter passing rather than injection into a script block.

Causal Clustering

  • Netty 4.1.32.Final
  • Remove ID-files if instance was unbound
  • Delete spammy log line.

Misc

  • "Connection reset by peer" errors will be logged on warning level without stack traces to avoid log pollution.
  • Upgrade Jersey server from 1.19.3 to 2.27
  • Fixed an issue where discovery document construction did not consider request URI for bolt entries and always pointed to localhost when no advertised_address is not configured for the connector.
  • Deprecate JMX beans in favour of metrics that can be exposed over multiple providers (including JMX) or procedures.
Clone this wiki locally