hanamizuki/solopreneur/neo4j-migration

Claude Code and agent skill by hanamizuki/solopreneur

Trust tier 2
  • community
LLM review pending
Source check pending

Checking that the SKILL.md file is still in the repository.

Migrates Neo4j driver code and Cypher queries from older versions (4.x, 5.x)

Install

npx vskill@latest install hanamizuki/solopreneur/neo4j-migration

SKILL.md

When to Use

  • Upgrading driver dependency from 4.x or 5.x to 6.x
  • Migrating Cypher queries to Cypher 25 syntax
  • Fixing deprecated API warnings after a driver or Neo4j version bump
  • Auditing a codebase for removed/deprecated Neo4j APIs before upgrading

When NOT to Use

  • Writing new Cypher queries → neo4j-cypher-skill
  • DB admin (backup, restore, import, cypher-shell) → neo4j-cli-tools-skill
  • Starting fresh → neo4j-getting-started-skill
  • GDS algorithm migration — not covered here; consult GDS release notes

Entry Criteria

Before starting, ask:

  1. Target Neo4j version — needed to select Cypher dialect and driver version
  2. Languages in use — scan package.json, requirements.txt, pom.xml, *.csproj, go.mod
  3. Current driver versions — read from dependency files; do NOT guess

If target is >= 2025.06: ask whether Cypher 5 or Cypher 25 dialect will be used (both supported; Cypher 25 is the new default).


Step 1 — Scan Codebase

bash
# Find Cypher strings (queries embedded in source)
grep -rn "MATCH\|MERGE\|CREATE\|CALL\|RETURN" --include="*.py" --include="*.js" \
--include="*.ts" --include="*.java" --include="*.cs" --include="*.go" \
--include="*.cypher" --include="*.cql" . | grep -v ".git"
# Find dependency files
find . -name "requirements*.txt" -o -name "package.json" -o -name "pom.xml" \
-o -name "*.csproj" -o -name "go.mod" | grep -v ".git" | grep -v node_modules

Collect findings before modifying anything. List all deprecated patterns found.


Step 2 — Cypher Migration (4.x / 5.x → Cypher 25)

Apply to every Cypher string, .cypher file, OGM/SDN @Query annotation, and template literal.

Complete Substitution Table
Old syntaxCypher 25 replacementNotes
[:REL*1..5](()-[:REL]->()){1,5}QPE quantifier group
[:REL*](()-[:REL]->()){1,}Unbounded QPE
[:REL*0..5](()-[:REL]->()){0,5}Zero-hop allowed
shortestPath((a)-[*]->(b))SHORTEST 1 (a)(()-[]->()){1,}(b)QPE shortest path
allShortestPaths((a)-[*]->(b))ALL SHORTEST (a)(()-[]->()){1,}(b)QPE all-shortest
id(n)elementId(n)Returns string, not int
CALL { WITH x ... }CALL (x) { ... }Explicit import syntax
PERIODIC COMMITCALL (...) { ... } IN TRANSACTIONS OF 1000 ROWSBatched writes
-- comment// commentSQL comment invalid
SET n = r (structural val)SET n = properties(r)Extract map first
MERGE (a {x:1})-[:T]->(b {x:a.x})Rewrite — cross-entity MERGE refs disallowedSplit into MATCH+MERGE
CREATE INDEX ... OPTIONS { indexProvider: ... }Remove indexProvider from OPTIONSProvider selection removed
db.create.setVectorProperty(...)Use native VECTOR property typeProcedure removed
dbms.upgrade() / dbms.upgradeStatus()Use cypher-shell :sysinfoProcedures removed
USE composite.'1'` USE composite.1 `Backtick entire qualified name
RETURN 1 as my$Identifier` RETURN 1 as my$Identifier `$ removed from unescaped ids
Vector Index Queries (version-branched)
VersionSyntax
Neo4j < 2026.01CALL db.index.vector.queryNodes(idx, k, $emb) YIELD node, score
Neo4j >= 2026.01SEARCH n IN (VECTOR INDEX idx FOR $emb LIMIT k) SCORE AS score
Cypher Dialect Prefix Rule
  • Target >= 2025.06, dialect = Cypher 25: prepend CYPHER 25 to every top-level query
  • Target >= 2025.06, dialect = Cypher 5: prepend CYPHER 5 (keeps deprecated forms working)
  • Target 4.x or 5.x: no prefix needed; fetch changelog per references/cypher-queries.md
id(n) → elementId(n) Caveats

elementId() returns a string (e.g., "4:abc123:0"), not an integer. Fix downstream code that stores or compares it as int. Do NOT use elementId() values for numeric operations.

diff
- WHERE id(n) = $nodeId # $nodeId was integer
+ WHERE elementId(n) = $nodeId # $nodeId must now be string

Step 3 — Driver Migration

Pick the section(s) matching languages found in Step 1.


Python Driver (5.x → 6.x)

Min requirements: Python >= 3.10, neo4j package (6.0+, released Jan 12 2026)

Package Rename — do this first
diff
# requirements.txt
- neo4j-driver>=5.0.0
+ neo4j>=6.0.0

neo4j-driver package is deprecated since 6.0 and receives no further updates.

Removed APIs
OldNewNotes
session.read_transaction(fn)session.execute_read(fn)
session.write_transaction(fn)session.execute_write(fn)
session.last_bookmark()session.last_bookmarks()Returns Bookmarks (plural)
Bookmark classBookmarks class
TRUST_ALL_CERTIFICATEStrusted_certificates=TrustAll()
TRUST_SYSTEM_CA_SIGNED_CERTIFICATEStrusted_certificates=TrustSystemCAs()
neo4j.conf, neo4j.data modulesRemoved — use top-level neo4j.*
Resource Management Change

Drivers and sessions no longer auto-close on GC. Add explicit cleanup:

diff
- driver = GraphDatabase.driver(URI, auth=(USER, PASS))
- # used without explicit close
+ with GraphDatabase.driver(URI, auth=(USER, PASS)) as driver:
+ with driver.session(database="neo4j") as session:
+ ...

Or call .close() explicitly. Repeated .close() is a no-op.

Error Handling Changes
Old exceptionNew exceptionTrigger
ClientError (for timeout)ConnectionAcquisitionTimeoutErrorAcquisition timeout
AuthError (invalid config)ConfigurationErrorInvalid auth params
ValueError raised for Query objTypeErrorPassing Query to Transaction.run
Key APIs Unchanged

execute_query(), GraphDatabase.driver(), neo4j+s:// URI, auth=(user, pw), session run().

Full changelog: references/python-driver.md


JavaScript / Node.js Driver (5.x → 6.x)

Min requirements: Node.js >= 18 (check engines in driver's package.json); package neo4j-driver

Removed APIs
OldNewNotes
session.readTransaction(fn)session.executeRead(fn)
session.writeTransaction(fn)session.executeWrite(fn)
session.lastBookmark()session.lastBookmarks()Returns array
resultSummary.updateStatisticsresultSummary.counters
driver.verifyConnectivity() → ServerInfodriver.getServerInfo() → ServerInfoverifyConnectivity() now returns void
Deprecated in 6.0 (will be removed in 7.0)
OldNew
isRetriableError(err)isRetryable(err)
neo4jError.retriableneo4jError.retryable
notificationCategorynotificationClassification
Integer Handling

Neo4j integers map to neo4j.Integer (64-bit). Use .toNumber() or .toInt() for arithmetic. Large values (> 2^53) lose precision — store as string with .toString().

javascript
// Safe pattern
const count = record.get('count').toNumber()

Full changelog: references/javascript-driver.md


Java Driver (5.x → 6.x)

Min requirements: Java 21; Maven org.neo4j.driver:neo4j-java-driver:6.x

Maven Coordinates
diff
<dependency>
<groupId>org.neo4j.driver</groupId>
<artifactId>neo4j-java-driver</artifactId>
- <version>5.x.x</version>
+ <version>6.0.0</version>
</dependency>
Removed APIs
RemovedReplacementNotes
RxSession / RxTransactionUse async AsyncSession or sync SessionReactive API removed
Bookmark multi-value constructorBookmark.from(iterable)
session.readTransaction(fn)session.executeRead(fn)
session.writeTransaction(fn)session.executeWrite(fn)
TrustStrategy.certFile()TrustStrategy.trustCustomCertificateSignedBy(path)
Notification.severity()Notification.severityLevel()Returns typed enum
Dependency Note (BOM)

neo4j-java-driver-bom no longer imports netty-bom as of 6.0.1. If using Netty native transport, add explicit netty-bom import.

Logging

Legacy Logging API deprecated → configure System.Logger instead.

Full changelog: references/java-driver.md


.NET Driver (5.x → 6.x)

Min requirements: .NET 8, 9, or 10 (.NET Standard 2.1 dropped); NuGet Neo4j.Driver 6.x

NuGet Package
diff
- <PackageReference Include="Neo4j.Driver" Version="5.*" />
+ <PackageReference Include="Neo4j.Driver" Version="6.*" />

Neo4j.Driver.Signed no longer receives updates — switch to Neo4j.Driver (now signed).

Removed APIs
RemovedReplacementNotes
ILoggerINeo4jLoggerInterface renamed
ConfigBuilder.WithIpv6Enabled()Remove call — IPv6 always enabled
Config.Ipv6Enabled propertyRemove — always true
Simple driverUse standard IDriverRemoved entirely

Full changelog: references/dotnet-driver.md


Go Driver (5.x → 6.x)

Min requirements: Go 1.24; module github.com/neo4j/neo4j-go-driver/v6

go.mod Update
diff
- require github.com/neo4j/neo4j-go-driver/v5 v5.x.x
+ require github.com/neo4j/neo4j-go-driver/v6 v6.x.x

Update all imports from /v5/ to /v6/.

Removed APIs and Replacements
OldNewNotes
neo4j.NewDriver(...)neo4j.NewDriverWithContext(...)Context-aware; or just use neo4j.NewDriver (now has context)
neo4j.Config structconfig.ConfigImport github.com/neo4j/neo4j-go-driver/v6/neo4j/config
neo4j.ServerAddressResolverconfig.ServerAddressResolver
neo4j.LogLevel / neo4j.ERROR etc.log.Level / log.ERRORImport neo4j/log sub-package
log.Consolelog.ToConsole
log.Voidlog.ToVoid
neo4j.Single[T]neo4j.SingleT[T] (still present; context variant preferred)
neo4j.Driver interfaceneo4j.DriverWithContext*WithContext variants are now primary
neo4j.Session interfaceneo4j.SessionWithContext
Config.RootCAs fieldConfig.TlsConfigPass *tls.Config directly
Notification constants (old pkg)notifications.* equivalentsImport neo4j/notifications
Context API Consolidation

In v6, neo4j.NewDriverWithContext is the canonical constructor. The old *WithContext method names are deprecated (targeted for removal in v7) — base names now include context by default.

diff
- driver, err := neo4j.NewDriver(uri, neo4j.BasicAuth(user, pass, ""))
+ driver, err := neo4j.NewDriverWithContext(uri, neo4j.BasicAuth(user, pass, ""))

Full migration guide: references/go-driver.md


Step 4 — Version Compatibility Matrix

Neo4j versionCypher dialectDriver 6.x compatibleNotes
4.4 LTSCypher 4Yes (bolt compat)Support ended Nov 2025
5.26 LTSCypher 5YesSupported until Nov 2028
2025.01–2025.05Cypher 5YesCalVer era begins
2025.06+Cypher 5 or 25YesCypher 25 new default
2026.01+Cypher 25YesSEARCH clause available

Store format: no changes between 4.4 and 2026.x. block format default for new Enterprise dbs since 5.22. high_limit and standard deprecated in 5.23, removed after 2026 LTS.

No downgrades supported — take a backup before any server upgrade.


Step 5 — Test After Migration

bash
# Python: run with dev mode to surface all deprecation warnings
python -W error::DeprecationWarning -m pytest tests/
# JS: run tests
npm test
# Java
mvn test
# .NET
dotnet test
# Go
go test ./...

After test run: if any DeprecationWarning or deprecated-API log appears, treat as ERROR — fix before proceeding.

For Cypher: run each migrated query through EXPLAIN first:

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 100 of 100Pattern checks on the skill's files.
  • Model reviewNot runA model review is scheduled for the next rescan.

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
145
Repository forks
9
7-day trend score
25

Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/hanamizuki/solopreneur/neo4j-migration/badge)](https://verified-skill.com/skills/hanamizuki/solopreneur/neo4j-migration)

Something wrong with this skill or its page? Tell us.