-
Notifications
You must be signed in to change notification settings - Fork 204
4.4 Changelog
Robsdedude edited this page Jul 29, 2025
·
35 revisions
Please read our Driver Migration Guide for guidance and breaking changes when migrating from 1.7 drivers to 4.X drivers.
🔧️ Fixes
- Fix driver stuck on
RecursionErroronCOMMITSUCCESS(#1192). - Fix bugs in
neo4j.time.DateTimehandling (#1101).- Fix
DateTime+/-Durationcomputation being wildly off by considering the days of theDateTimesince UNIX epoch twice. - Fix
DateTime.__ne__(inequality operator) incorrectly comparing against non-DateTime-like types.
- Fix
📚️ Docs
- Add note on
Driver.closenot being concurrency-safe (#1148).
🔧 Fixes
- Fix race condition in routing information of the connection pool (#953).
- Fix internal use of deprecated API causing a deprecation warning (#1033).
- Fix handling of sub-ms transaction timeouts (#1034).
- Transaction timeouts of under
0.5 ms(< 0.0005) were rounded down to0, which is a special value indicating "no timeout" to the server. They are now rounded up to1 ms. - Values of
0documented not to be used. They were not sent to the server causing the default timeout to be used. They are now properly transmitted and represent "no timeout" (for those server versions that support it).
- Transaction timeouts of under
- Fix the logging helper
neo4j.debug.watch()to properly handle being configured with different levels (#1032). - Fix race condition in handling muting of warning in internal API calls (#1040).
This could have led to not surfacing deprecation warnings properly when users interacted with deprecated APIs. - Fix Duration export in
Result.dataandRecord.data(#1041). - Harden the driver against unexpected server responses following
RESET(#1042).
Under certain circumstances, can the server respond withFAILUREand evenIGNOREDwhen the driver attempts toRESETa failed connection. It's arguable whether it should, but the driver needs to handle to it, let alone to be compatible with older server versions. The driver did not handle this situation gracefully and could even get stuck in an infinite loop. Instead, it will now close such connections and raise the original error the connection failed with. - Fix driver dropping write servers from the routing table too aggressively (#1039).
- Fix pool closing connections too aggressively. In autonomous clustering scenarios where a given database might not be present on all cluster members, the driver could've closed all connections to such members even if they were still useful for other databases (#1038).
- Fix not using the cached port number for logging (#1045).
In the best-case, this only caused some unnecessary syscalls. In the worst, this cause someOSErrorthat obscured the actual error that should've been raised to the user code.
👏 Improvements
- Improve performance of
from_ordinalof temporal types (#1047).
Speeds up the function by about a factor of 100.
🔧 Fixes
- Fix application protocol (bolt) handshake not having a timeout (#905).
👏 Improvements
- Add Support for Python 3.11 (#862).
🧹Clean-up
- Removed testing code (
testkitbackend) from distributed package (#863).
🔧 Fixes
- Fix
BufferError: Existing exports of data: object cannot be re-sizederror on failure of sending handshake to the server (#843). - Fix missing rewrite of driver internal error
neo4j._exceptions.SocketDeadlineExceeded: timed out(#843).
👏 Improvements
- Keyword parameters of
Session.runandTransaction.runare no longer restricted by parameters used in driver internal functions further down the stack (#836). - Add Support for Python 3.10 (#832).
📚 Docs
- Editorial changes (#824, #840).
- Clarification of the
timeoutparameter tounit_of_work(#828). - Clarify precedence of
parametersand keyword parameters ofSession.runandTransaction.run(#836).
🔧 Fixes
- Fix connection pool clogging up when checking if new connections can be created while the pool is full (#803; fixes #796).
The bug was introduced in 4.4.5 with #746. - Fix string representation of
neo4j.exceptions.ClientErrorandneo4j.exceptions.Neo4jErrorwhen raised from the driver code (#805).
🔧 Fixes
- Fix
DeprecationWarningforupdate_routing_table_timeoutconfig option being emitted if the option was not used (#789). - Fix relying on garbage collector to close sockets under certain failure conditions (#794).
🔧 Fixes
- Fix method accidentally marked
async(#774).
👏 Improvements
- Speed up
DateTime.to_clock_timeby 2 orders of magnitude and with it the serialization ofDateTimeobjects (#781).
🧹Clean-up
⚠️ Deprecate timeout config options introduced in 4.4.5 (#768).
update_routing_table_timeoutandsession_connection_timeouthave been deprecated and will be removed in 5.0.
Server-side keep-alives communicated through configuration hints together withconnection_acquisition_timeoutare sufficient to avoid the driver getting stuck.
🔧 Fixes
- Implement patched protocol that removes ambiguity in datetimes with named zone. For this to take effect, the server needs to be at least on patch version 4.3.18 or 4.4.11 respectively.
👏 Improvements
- Clarify the documentation around
session.read_transaction: it does not enforce access control (#753). - Multiple improvements around timeouts (#746):
- The configuration option
connection_acquisition_timeoutdoes only limit the amount of time the driver waits for a connection from the pool. It does not cater for potential routing table updates. Therefore, two new configuration optionsupdate_routing_table_timeoutandsession_connection_timeoutare being introduced. Read more about them in the API docs . - A slow response from the server while opening a new connection does no longer block the whole connection pool.
- The configuration option
🔧 Fixes
- Fix pool closing connections that are in use when opening a new connection fails (#733). Especially, but not only, in concurrent contexts, this would lead to all sorts of unspecific errors.
- Fix pool trying to close the same connection multiple times if closing fails. (#733). This would lead to
ValueError: deque.remove(x): x not in deque(Issue #739).
👏 Improvements
- Performance improvement around logging calls (even with disabled logging) (#726).
- Several small improvements to docstrings and API docs.
🔧 Fixes
- Fix wrong serialization of the
DateTimetype's timezone (#684). - Fix wrong comparison operators of several types in the
neo4j.timepackage (#684). - Improve compatibility of
neo4j.timewith different timezone implementations (#684).
🔧 Fixes
- Fix the driver sending partial data (causing connection closure and hence slightly worse performance) on errors during data serialization (#641).
⭐ New Features
- Backported (experimental) preview of pandas DataFrame export for results. (#678). Note: the change is self-contained and does not affect any other parts of the driver.
🔧 Fixes
- Fix pool closing stale connections that are in use (#631). Especially, but not only, in concurrent contexts, this would lead to all sorts of unspecific errors.
👏 Improvements
- Performance improvement when packing data (#622).
🔧 Fixes
- Fail fast and raise the original error during discovery (initial attempt to connect to the server) on certain errors that are expected to be experienced across all cluster-members ,e.g.,
Neo.ClientError.Database.DatabaseNotFoundandNeo.ClientError.Transaction.InvalidBookmark(#611). - Fix wrong serialization of the
Timetype's timezone (#616).
🔧 Fixes
- Use
selectors.DefaultSelectorinstead ofselect.selectwhich resolves the number of simultaneously open files (including sockets) being limited to 1024 on all operating systems that support it (#604). - Fixed
AttributeErroron connection clean-up (#603).
👏 Improvements
- Log the reason when a secure connection could not be established (#608).
⭐ New Features
- Introduce impersonation support (#599).
- Add bearer authentication support (single sign-on) (#579).
- Add Bolt 4.4 support (#560).
🔧 Fixes
- Time types use Decimals and integers instead of floats for sub-seconds (#551).
This fixes rounding issues and allows for an exact representation of nanoseconds, but comes at the cost of a slightly altered API. Please refer to the documentation.
👏 Improvements
- Fail fast on transaction begin (#586).
- Only send
qidparameter over the wire when necessary (#585). - Reduce the number of
RESETmessages send over the wire to the bare minimum (#572). - Fail fast on re-using a broken transaction (#566).
🧹Clean-up
- Drop support for Python 3.5 (end of life 2020-11-13) (#560).