Chapter 01 · Graph Database Foundations, Neo4j Editions, Deployment Choices, and Lab Setup
Install Neo4j Desktop/Server or Provision Aura, Connect with Browser and Cypher Shell, and Verify the DBMS
Turn “Neo4j is installed” into evidence: process readiness, Browser/Cypher Shell access, runtime version, Cypher default, authentication, and driver connectivity.
Learning outcomes
AtlasMart has selected Community Docker as the course baseline, but developers may arrive with Windows, Linux, macOS, Neo4j Desktop, a native server archive, or an Aura instance. This lesson separates installation choice from DBMS evidence. “The UI opened” is not enough: the learner must prove which server, edition, JVM, Cypher default, endpoint, database credential, and driver path are actually in use.
Choose among pinned Docker, native Server, Desktop, and Aura paths without mixing their filesystem and operational assumptions.
Connect through Neo4j Browser/Query and Cypher Shell, then verify DBMS version, edition, user, and Cypher default from the running service.
Distinguish HTTP/Browser access from Bolt/driver access and bind the local lab to loopback.
Use the official Python driver 6.3.0 to force a real Bolt handshake with verify_connectivity() rather than assuming driver construction opened a connection.
Diagnose startup, endpoint, authentication, and protocol failures independently and reset the disposable lab safely.
Mandatory path: Neo4j Community
2026.07.1 official Docker image, image-supplied
compatible JVM, Cypher 25 explicitly used in examples, and
optional Neo4j Python Driver 6.3.0 on Python
3.10+. The current server line supports Java 21/25;
5.26.30 remains the current 5.26 LTS patch for
organizations that intentionally stay on LTS.
Choose an installation path without pretending they are identical
Docker packages the server and its compatible runtime into a versioned image and makes cleanup reproducible. Native Server exposes host-level installation, JVM, service, paths, and upgrades directly. Neo4j Desktop is a developer environment that can create/manage local DBMS instances and remote connections, with a bundled/downloaded compatible JVM behavior described by Desktop documentation. Aura provisions a managed remote service; there is no local server process for you to inspect.
| Path | Good fit for this course | Evidence surface | Primary caveat |
|---|---|---|---|
| Pinned Docker Community | Mandatory reproducible baseline | Container state/logs, /data, /logs, /conf, cypher-shell, Browser, Bolt | Docker networking/volumes must be understood |
| Native Server | Learners who want host service/JVM experience | Process/service, NEO4J_HOME/CONF, host ports, local logs | OS/JVM/path details vary and upgrades need discipline |
| Neo4j Desktop | Interactive local development and optional Developer edition features | Desktop DBMS cards/logs/terminal plus normal Cypher/Bolt probes | Desktop license and local layout are developer-specific |
| AuraDB | Optional managed comparison | Aura console, secure URI, credentials, Cypher/driver evidence | No assumption of local filesystem or self-managed admin commands |
On current Windows server installation paths, Neo4j supports ZIP/service/PowerShell workflows with supported JDKs. The course still uses Docker for the mandatory lab because it pins the DBMS and runtime together and keeps cleanup isolated; this is a reproducibility choice, not a claim that native Windows is unsupported.
Start the pinned Community DBMS
If Lesson 1’s container is already healthy, do not create a
second one. Otherwise create the named volumes and start it.
Docker’s official Neo4j image uses port 7474 for HTTP/Browser
and 7687 for Bolt. We bind both to 127.0.0.1. HTTP
is unencrypted; loopback is appropriate for a local teaching
environment but not a substitute for TLS in remote production.
docker volume inspect atlasmart-neo4j-data >/dev/null 2>&1 || docker volume create atlasmart-neo4j-datadocker volume inspect atlasmart-neo4j-logs >/dev/null 2>&1 || docker volume create atlasmart-neo4j-logsdocker rm -f atlasmart-neo4j 2>/dev/null || truedocker run -d --name atlasmart-neo4j -p 127.0.0.1:7474:7474 -p 127.0.0.1:7687:7687 -e NEO4J_AUTH=neo4j/atlasmart-course-2026 -v atlasmart-neo4j-data:/data -v atlasmart-neo4j-logs:/logs neo4j:2026.07.1docker logs --tail 120 atlasmart-neo4j
The first two lines use POSIX shell redirection/conditional
syntax and are convenient on Git Bash/Linux/macOS. In Windows
PowerShell, simply run
docker volume create ... twice (Docker safely
returns an existing volume) and ignore “no such container”
when removing a container that does not exist. The core Docker
commands themselves are the same.
Do not race the startup sequence. A created/running container state proves only that Docker launched the process. Wait for readiness in the Neo4j logs and then perform a real client operation.
Connect with Browser/Query and Cypher Shell
Open http://localhost:7474/ in a browser. The web
application is a client; the database server is the separate
DBMS process. Connect using URI
neo4j://localhost:7687, user neo4j,
and the disposable password from the Docker environment. A web
UI loading successfully does not prove Bolt authentication until
you connect.
Cypher Shell is a command-line Bolt client. Running it inside the container avoids a separate host installation and gives a deterministic client version paired with the image:
docker exec atlasmart-neo4j cypher-shell -a neo4j://localhost:7687 -u neo4j -p atlasmart-course-2026 "RETURN 'bolt-ok' AS connection, 25 AS requestedCypherFamily;"docker exec atlasmart-neo4j cypher-shell -a neo4j://localhost:7687 -u neo4j -p atlasmart-course-2026 "CALL dbms.components() YIELD name, versions, edition RETURN name, versions, edition;"docker exec atlasmart-neo4j cypher-shell -a neo4j://localhost:7687 -u neo4j -p atlasmart-course-2026 "SHOW CURRENT USER;"
The first command proves the endpoint accepted a Bolt session and executed a query. The second proves server/edition identity. The third proves the authenticated user. None of them tells you whether a remote production connection uses TLS, whether authorization is least privilege, or whether the application’s connection pool is healthy.
Verify Cypher 25 rather than trusting the release number
Neo4j’s calendar version and Cypher language version are
separate. Cypher 25 was introduced in the 2025.06 line and
receives new language features; Cypher 5 is frozen for
compatibility. Starting with 2026.02, the distributed
neo4j.conf explicitly sets
CYPHER_25 for new deployments. Existing deployments
can retain a different setting, and individual queries can
prefix a language version.
SHOW SETTINGS 'db.query.default_language' YIELD name, value RETURN name, value;CYPHER 25 RETURN 25 AS languageFamily;CYPHER 5 RETURN 5 AS languageFamily;
The first result is configuration evidence. The next two demonstrate per-query selection. Do not turn the prefix into cargo cult: application queries should have an intentional compatibility strategy, especially during upgrades. Later chapters explicitly compare behavior when syntax or planner features differ.
Inspect the JVM and configuration provenance
The Docker image supplies a compatible JVM, but “Neo4j 2026” does not mean “Java version irrelevant.” Current 2026 Neo4j requires Java 21 or 25 on supported platforms. Native installations must provision a compatible JVM themselves. Record the actual runtime:
docker exec atlasmart-neo4j java -versiondocker exec atlasmart-neo4j sh -lc 'printf "NEO4J_HOME=%s\n" "$NEO4J_HOME"'docker exec atlasmart-neo4j sh -lc 'ls -ld "$NEO4J_HOME/conf" /data /logs /plugins 2>/dev/null || true'docker exec atlasmart-neo4j sh -lc 'grep -E "^[[:space:]]*(db.query.default_language|server.bolt|server.http)" "$NEO4J_HOME/conf/neo4j.conf" || true'docker inspect atlasmart-neo4j --format '{{json .Mounts}}'
The configuration file is an input to the process;
SHOW SETTINGS is runtime evidence. Comparing both
helps diagnose generated/container defaults, environment
overrides, and drift. The internal database files under
/data are implementation state, not an application
API.
Prove a real application driver handshake
Creating a Neo4j Python Driver object does not
immediately open a network connection. The official driver
deliberately defers connections until needed. Calling
verify_connectivity() forces the evidence we want.
Driver 6.3.0 is the current 6.3 release and
supports Python 3.10–3.14 and current 2026 servers.
python -m venv .venvpython -m pip install --upgrade pippython -m pip install "neo4j==6.3.0"
from neo4j import GraphDatabaseURI = "neo4j://localhost:7687"AUTH = ("neo4j", "atlasmart-course-2026") # disposable local lab onlywith GraphDatabase.driver(URI, auth=AUTH) as driver: driver.verify_connectivity() records, summary, keys = driver.execute_query( "CYPHER 25 RETURN $course AS course, $server AS pinnedServer", course="Big Data Academy / Neo4j", server="2026.07.1", database_="neo4j", ) print(records[0].data()) print("database:", summary.database.name)
A successful verify_connectivity() proves that the
driver can establish a compatible authenticated connection. It
does not warm every pooled connection, prove failover behavior,
or make a query retry safe. Those are separate driver concerns
later in the course.
Diagnose failures in layers
| Failure injection | Expected category | Useful evidence |
|---|---|---|
| Wrong password | Authentication | Server/client auth error; endpoint is still reachable |
| Port 9999 instead of 7687 | Connection/reachability | Connection refused/timeout; query was never parsed |
Use http://localhost:7474 as a Bolt driver
URI
|
Protocol/URI configuration | Driver rejects or fails to negotiate; Browser HTTP is not Bolt |
| Unsupported JVM on a native install | Process startup/runtime | Server startup logs/JVM checks before any Cypher client can connect |
| Enterprise-only command on Community | Edition/capability | Syntax/administration availability must be checked against edition docs |
docker exec atlasmart-neo4j cypher-shell -a neo4j://localhost:7687 -u neo4j -p wrong-password "RETURN 1;"docker exec atlasmart-neo4j cypher-shell -a neo4j://localhost:9999 -u neo4j -p atlasmart-course-2026 "RETURN 1;"
After each failure, re-run the known-good command. A diagnosis is not complete until the corrected state is verified.
Optional Desktop and Aura comparison
Neo4j Desktop can create a local DBMS, open its terminal/logs,
and provide Browser tooling. Record the exact DBMS version that
Desktop creates; Desktop itself is not the server version. Aura
instead gives you a generated secure connection URI and
credentials. Use those with Browser/Query or the same official
driver, but do not search for neo4j.conf or
/data because the service abstracts those
server-level resources.
If you use AuraDB Free for comparison, treat its current availability/tier rules as service state that can change. The course remains complete without an Aura account.
Production judgment
Installation convenience is not production architecture. For self-managed Neo4j, AtlasMart must decide supported OS/JVM, data/log separation, filesystem and storage performance, TLS, service identities, network exposure, backups, monitoring, patching, capacity, and upgrade/rollback. For Aura, it must decide tier/region, service security, credentials, connectivity, backup/export policy, observability, and application failure handling. For every deployment, pin and test driver compatibility and Cypher version behavior before rollout.
Check your understanding
- Why does a running Docker container not prove Neo4j is ready for queries?
- What is the difference between HTTP port 7474 and Bolt port 7687 in this lab?
-
Why inspect
db.query.default_languageif the server is already version 2026.07.1? -
Why call
verify_connectivity()after constructing a Python Driver? - Which part of this lesson changes most when moving from self-managed Docker to Aura?
Review the answers
1. Docker only proves process/container state. Neo4j may still be starting, failing, or not accepting authenticated Bolt sessions. Readiness requires server logs plus a real client operation.
2. 7474 serves HTTP used by Browser/HTTP API; 7687 is Bolt used by Cypher Shell and drivers. They are different protocols and security surfaces.
3. Cypher language version is separately configurable and existing deployments can preserve Cypher 5. Runtime configuration is stronger evidence than assuming from the calendar release.
4. Driver construction is lazy and may not open a socket. verify_connectivity() forces an authenticated compatible network exchange.
5. Server-level operational evidence: Aura abstracts the local process, filesystem, JVM, neo4j.conf, and many admin operations. Application Cypher/driver concepts remain broadly portable.
Summary and next step
You now have a pinned local DBMS, Browser/Cypher Shell path, explicit version/Cypher/JVM evidence, and an optional real driver handshake. More importantly, you can separate process startup, endpoint reachability, authentication, protocol negotiation, and query execution.
Next, map the DBMS boundary in detail: databases, processes, Bolt/HTTP, drivers, configuration, storage locations, and transaction logs.
Authoritative references
- Current Neo4j versions — Official current-release and LTS patch snapshot.
- Neo4j Operations Manual — Authoritative self-managed operational documentation for the current release.
- Neo4j system requirements — Supported operating systems and JVM requirements.
- Cypher Manual — Current Cypher 25 reference and language semantics.
- Configure the Cypher default version — Cypher 5 versus Cypher 25 default and override behavior.
- Neo4j in Docker — Official image tags, ports, editions, and Docker starting point.
- Neo4j Windows installation — Current native Windows/JDK installation path.
- Neo4j Desktop installation — Desktop platform and Developer-license setup.
- Neo4j network connectors — Bolt, HTTP and HTTPS configuration semantics.
- Neo4j Python Driver manual — Official Python application path.
- Python driver connection — Driver creation versus verify_connectivity() behavior.
- Python Driver 6.3 API — Current driver/Bolt/Python compatibility surface.