mspa/neo4j-bundle
Symfony bundle for integrating the Neo4j graph database into your application. It provides configuration and service wiring so you can run Cypher queries, manage graph data, and use Neo4j alongside your existing Symfony stack with minimal setup.
Architecture fit — fundamental mismatch. Despite the framing of this evaluation, mspa/neo4j-bundle is not a Laravel package; it is a Symfony bundle. It ships a Bundle subclass, DI service definitions, and a Symfony Configuration tree that expects to be registered in config/bundles.php and compiled by Symfony's Kernel. Laravel has no bundle system — its service container, config repository, and bootstrapping lifecycle are structurally different. There is no neo4j-bundle service provider, facade, or config/neo4j.php publish path. Treating this as a drop-in Laravel dependency is not feasible; any use requires porting the wiring.
Integration feasibility — moderate, via extraction rather than installation. The bundle is thin glue. Its real value is whichever PHP driver it wraps (typically graphaware/neo4j-php-client for Bolt/HTTP). A Laravel integration would more sensibly depend on that driver directly and reimplement ~150 lines of container binding: a singleton client, config, and a facade. The bundle itself contributes little that cannot be rebuilt in an afternoon.
Technical risk — high, driven by adoption signals. 0 stars, 0 dependents, and a 0.03 composite score indicate effectively zero production usage and no ecosystem validation. Specific concerns:
| Risk | Assessment |
|---|---|
| Maintainer concentration | Single author; bus factor of one |
| Release hygiene | Unknown/absent tagged releases, changelog, CI |
| Version constraints | Likely pinned to Symfony 4/5-era components that conflict with Laravel 10/11 |
| Test coverage | No evidence of a test suite — the glue is unverified |
| Neo4j compatibility | Unknown Bolt protocol / Neo4j 4.x vs 5.x support |
| Documentation | README-level at best |
| Security posture | No disclosure process, no dependabot signal |
Key questions to resolve before any commitment:
composer.json PHP/Symfony constraints, and do they resolve against our Laravel version's Symfony component pins?Recommendation at evaluation stage: do not adopt the bundle. Adopt the underlying driver and own the integration layer.
Stack fit — poor as packaged, acceptable as a pattern. A Laravel application already carries Symfony components (via illuminate/*), so the bundle's transitive dependencies are not fatal — but installing a Symfony bundle into Laravel yields no functioning registration. The correct target is: graphaware/neo4j-php-client (or laudis/neo4j-php-client, its maintained successor) + a Laravel service provider.
Migration path:
app/Neo4j or a private Composer package. Use it as reference implementation, not a runtime dependency.Neo4jServiceProvider, Neo4j facade, config/neo4j.php (host, port, scheme, auth, database, pool size, timeout), and a Neo4jManager singleton resolving a driver instance.GraphRepository interfaces in the domain layer so the driver is swappable and testable with an in-memory fake.app()->terminating() to close the driver; explicit session cleanup for queue workers and Octane.Compatibility sequencing:
Constraint to note: every Symfony→Laravel port must replace Symfony\Component\Config\Definition validation with Laravel's config() + a validator, and replace EventDispatcher wiring with Laravel events. Budget for this — it is the actual work.
Maintenance — we own it. With zero dependents and a single maintainer, upstream is unlikely to respond to issues or merge PRs. Assume the fork becomes the source of truth within one quarter. Budget ~10–15% of one engineer's time for the first two quarters, tapering to reactive maintenance. Pin exact versions and vendor the code into our monorepo or private registry so an upstream deletion cannot break builds.
Support — none external. No community, no Stack Overflow corpus, no Slack. Internal runbooks and a documented upgrade procedure for Neo4j major versions are mandatory. Second-engineer onboarding is the real support cost.
Scaling — dominated by Neo4j, not by this code. The bundle is not the bottleneck; the cluster and query patterns are. Operational specifics:
neo4j:// scheme) and read-your-own-writes bookmarks. The bundle may not expose this.LIMIT, statement timeouts, and per-tenant query budgets at the application layer since the driver will not.Failure modes to instrument for:
| Failure | Symptom | Mitigation |
|---|---|---|
| Stale connection post-failover | Intermittent ConnectionException in workers |
Reconnect-on-error wrapper, health probe |
| Connection pool exhaustion | Latency spike, timeouts under concurrency | Bounded pool, metrics on active sessions |
| Unbounded traversal | Query timeout, DB CPU saturation | Server-side timeout, EXPLAIN in CI for hot queries |
| Partial writes across RDBMS + graph | Divergent state, no rollback | Outbox pattern + idempotent graph writes |
| Driver version drift | Breakage on Neo4j upgrade | Pin driver, contract tests against a container |
| Silent auth/config failure | Empty results, not errors | Fail-fast startup validation + /health/neo4j |
Ramp-up — asymmetric. API surface is small; a mid-level engineer wires the provider in a day. The hidden cost is graph data modeling, Cypher proficiency, and Neo4j operational knowledge — none of which this package provides. If the team lacks graph experience, add 3–4 weeks of enablement before Phase 2, and consider a Neo4j-certified contractor for the initial schema and index design.
Bottom line for a TPM: the package is a useful reference and a poor dependency. Its 0.03 score is an accurate signal. Fund a one-week spike to evaluate the underlying driver against a real Neo4j instance; approve production use only after Phase 1 lands with health checks, connection lifecycle handling, and an owned fork under our control.
How can I help you explore Laravel packages today?