Objective
Vulnerability scanners flag every transitive dependency with a published CVE. 80% of those flags
are false alarms because the vulnerable code path is never reached in your application. Walk the
dependency graph in Cypher, then ask LLM_SCORE "given this CVE description and how the
dependency is used, is this exploitable here?" The wow moment: a single query returns the
short list of CVEs that actually matter for your service, with the LLM's reasoning attached.
Step 1: Set up the dependency graph
MERGE (svc:Service {name: "Northwind API",
description: "Public REST API for Northwind Logistics, accepts JSON, parses XML invoices, decodes JWT auth"})
// Direct dependencies
MERGE (a1:Package {name: "axum", version: "0.7.5", lang: "rust"})
MERGE (a2:Package {name: "serde_json", version: "1.0.115", lang: "rust"})
MERGE (a3:Package {name: "quick-xml", version: "0.31.0", lang: "rust"})
MERGE (a4:Package {name: "jsonwebtoken", version: "9.3.0", lang: "rust"})
MERGE (a5:Package {name: "image", version: "0.24.7", lang: "rust"})
MERGE (a6:Package {name: "reqwest", version: "0.11.27", lang: "rust"})
// Transitive dependencies (one extra hop)
MERGE (t1:Package {name: "openssl", version: "0.10.62", lang: "rust"})
MERGE (t2:Package {name: "memchr", version: "2.7.1", lang: "rust"})
MERGE (t3:Package {name: "ring", version: "0.17.7", lang: "rust"})
// Direct edges
MERGE (svc)-[:DEPENDS_ON {scope: "direct"}]->(a1)
MERGE (svc)-[:DEPENDS_ON {scope: "direct"}]->(a2)
MERGE (svc)-[:DEPENDS_ON {scope: "direct"}]->(a3)
MERGE (svc)-[:DEPENDS_ON {scope: "direct"}]->(a4)
MERGE (svc)-[:DEPENDS_ON {scope: "direct"}]->(a5)
MERGE (svc)-[:DEPENDS_ON {scope: "direct"}]->(a6)
// Transitive edges
MERGE (a6)-[:DEPENDS_ON {scope: "transitive"}]->(t1)
MERGE (a3)-[:DEPENDS_ON {scope: "transitive"}]->(t2)
MERGE (a4)-[:DEPENDS_ON {scope: "transitive"}]->(t3)
// Published CVEs against these packages
MERGE (cve1:CVE {id: "CVE-2026-1001", severity: "high",
description: "image: remote denial of service via crafted GIF frame counts",
affected: "image"})
MERGE (cve2:CVE {id: "CVE-2026-1042", severity: "critical",
description: "openssl: timing oracle in CBC decryption when used with PKCS7 padding",
affected: "openssl"})
MERGE (cve3:CVE {id: "CVE-2026-1099", severity: "medium",
description: "quick-xml: stack overflow on deeply nested XML if recursion guard disabled",
affected: "quick-xml"})
MERGE (cve4:CVE {id: "CVE-2026-1188", severity: "low",
description: "memchr: SIMD path miscompile on AVX-512 disabled by default",
affected: "memchr"})
MERGE (cve5:CVE {id: "CVE-2026-1210", severity: "high",
description: "jsonwebtoken: alg confusion when verifying tokens with HS256 if RS256 keys are accepted",
affected: "jsonwebtoken"})
MERGE (cve1)-[:AFFECTS]->(a5)
MERGE (cve2)-[:AFFECTS]->(t1)
MERGE (cve3)-[:AFFECTS]->(a3)
MERGE (cve4)-[:AFFECTS]->(t2)
MERGE (cve5)-[:AFFECTS]->(a4);