[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-neo4j-identity-validation":3,"mdc--4t6t91-key":32,"related-repo-neo4j-identity-validation":1447,"related-org-neo4j-identity-validation":1518},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":23,"topics":27,"repo":28,"sourceUrl":30,"mdContent":31},"identity-validation","resolve identities across systems using graph analysis","Resolve the same person, account, or device across systems and channels using shared and near-duplicate identifiers. Covers cross-channel identity resolution, golden-record\u002FMDM matching, synthetic identity fraud, household linking, and address geocoding with spatial functions.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"neo4j","Neo4j","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fneo4j.png",[12,16,19,20],{"name":13,"slug":14,"type":15},"Graph Analysis","graph-analysis","tag",{"name":17,"slug":18,"type":15},"Data Engineering","data-engineering",{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},"Identity","identity",0,"https:\u002F\u002Fgithub.com\u002Fneo4j\u002Fstudio-agent-use-cases","2026-08-18T03:49:46.446479",null,[],{"repoUrl":24,"stars":23,"forks":23,"topics":29,"description":26},[],"https:\u002F\u002Fgithub.com\u002Fneo4j\u002Fstudio-agent-use-cases\u002Ftree\u002FHEAD\u002Fidentity-validation","---\nname: identity-validation\ndescription: Resolve the same person, account, or device across systems and channels using shared and near-duplicate identifiers. Covers cross-channel identity resolution, golden-record\u002FMDM matching, synthetic identity fraud, household linking, and address geocoding with spatial functions.\nmetadata:\n  neo4j-card-title: Identity Validation\n  neo4j-card-category: General\n  neo4j-card-description: Resolve one person across systems and channels, and surface near-duplicate identifiers that signal synthetic identity fraud.\n  neo4j-icon-category: general\n---\n\n# Identity Graph\n\nUse this skill for graph-based identity resolution and operational query design: matching the same real-world person or account across source systems, and detecting near-duplicate identifiers that suggest synthetic identity fraud.\n\nSource references:\n\n- \u003Chttps:\u002F\u002Fneo4j.com\u002Fblog\u002Fgraph-database\u002Fwhat-is-entity-resolution\u002F>\n- \"A Graph Entity Resolution Playbook\" — Nathan Smith, NODES 2024: \u003Chttps:\u002F\u002Fwww.youtube.com\u002Fwatch?v=MfZR_ZrLSDw>\n\nThis package implements a lightweight starter subset of that talk's process (shared-identifier matching, placeholder detection, descriptor-based corroboration, weighted scoring). The talk's GDS techniques (WCC blocking, node similarity, FastRP+KNN, entity merging) are documented as a graduation path in `implementation-guidance.md`, not built into the demo.\n\nThis is graph modelling and query-pattern guidance, not legal, regulatory, or compliance advice. Treat every match as an investigative lead for human review, never an automatic merge.\n\n## Introducing this package\n\nWhen the user first opens this package, greet them with a short introduction in your own words — don't recite this file. Convey:\n\n- The core idea: the same customer arrives as different records across systems — a CRM row, a mobile signup, a call-centre note — with no single field matching cleanly. A graph turns that from a string-comparison problem into a traversal: each shared phone, email, or address is a node both records point at, so a genuine cluster looks visibly different from a weak, coincidental link — and from a synthetic identity.\n- The bundled sample data is 500 masked profiles, deliberately seeded so every query returns a meaningful result: six legitimate multi-channel clusters, three synthetic-identity fraud pairs, two address pairs that only match once geocoded, and a realistic non-matching background.\n- What you can help with: explaining the model and why each attribute is keyed as it is, walking through the query patterns from shared-identifier fan-out to weighted scoring, importing the sample data or mapping their own source systems, showing how synthetic identity fraud differs from a genuine match, and outlining the production-scale Graph Data Science path.\n\nEnd with a clear next step, such as asking whether they'd like to explore the model or start importing data.\n\n## Supporting files\n\n| File                         | Use it for                                                  |\n| ---------------------------- | ----------------------------------------------------------- |\n| `overview.md`                | Identity resolution concepts; identifiers vs descriptors    |\n| `graph-model.md`             | Labels, relationships, and why each node is keyed as it is  |\n| `resolution-workflow.md`     | The ordered workflow, broad to constrained                  |\n| `query-patterns.md`          | Which query to run when, and why each is shaped that way    |\n| `QUERIES.md`                 | Runnable Cypher, each with an expected-result comment       |\n| `SETUP.md`                   | Post-import setup: 3 statements (1 required, 2 recommended) |\n| `implementation-guidance.md` | Adapting to real data; GDS graduation path                  |\n| `caveats.md`                 | Limitations, false-positive modes, entropy traps            |\n\n## Key rules\n\n- Sample data is masked, not randomised (`XXX-XX-4821`, `555-201-8823`, `203.0.113.x`). Preserve that convention when editing it; see the Sample data section below. Never add real or fully unmasked identifiers.\n- Never run fuzzy or descriptor scoring as a population-wide scan. Always block on a real shared identifier first. Unblocked scans return thousands of coincidental hits against this dataset.\n- Placeholder flagging runs as `SETUP.md` steps 2–3 (or the equivalent templates in `QUERIES.md` — once, not both). Run the read-only `Implausible Address Detection` before any location query.\n- A user's own data needs their organisation's real PII policy, not this package's demo masking.\n\n## Sample data\n\n500 masked profiles under `sample-data\u002F`, deliberately seeded so every query template returns a meaningful result.\n\n| File               | Rows | Produces               |\n| ------------------ | ---- | ---------------------- |\n| `identities.csv`   | 500  | 500 `Identity` nodes   |\n| `names.csv`        | 500  | 484 `PersonName` nodes |\n| `phones.csv`       | 439  | 428 `Phone` nodes      |\n| `emails.csv`       | 390  | 386 `Email` nodes      |\n| `ssns.csv`         | 367  | 366 `SSN` nodes        |\n| `addresses.csv`    | 416  | 410 `Address` nodes    |\n| `dobs.csv`         | 416  | 408 `DOB` nodes        |\n| `ip_addresses.csv` | 487  | 482 `IPAddress` nodes  |\n| `locations.csv`    | 407  | 405 `Location` nodes   |\n\nEvery attribute file also carries `identityId`, which supplies the relationship from `Identity`. `locations.csv` is the exception: it carries `addressId` and supplies `GEOCODED_TO` from `Address` rather than from `Identity`.\n\nEvery node is keyed on a single property, as the Import flow requires. Seven labels have a natural one — `identityId`, `fullName`, `phoneNumber`, `email`, `ssn`, `dateHash`, `ip`. The two with composite identities carry a derived key instead: `addressId` (in `addresses.csv` and `locations.csv`, of the form `\"1210 Foxglove Dr, Austin, TX 78701\"`) and `locationId` (in `locations.csv`, of the form `\"30.2686,-97.7411\"`). Both are derived from exactly the values they stand in for, so dedup is unchanged: 416 address rows produce 410 `Address` nodes, and 407 geocoded addresses produce 405 `Location` nodes. Both contain commas and are therefore CSV-quoted throughout.\n\n### Masked, not randomised\n\nThe sample data uses realistic-format but masked identifiers — `XXX-XX-4821` for SSN, `555-201-8823` using the reserved fake area code, `203.0.113.x` reserved documentation IPs — rather than opaque random strings or full plaintext PII. This lets an audience visually confirm exact and near-duplicate matches themselves during a demo, without ever showing anything resembling a real, complete identifier. Preserve this convention if you add or edit sample data. Don't anonymise into random tokens, and don't add full unmasked identifiers.\n\nTwo fields are exceptions:\n\n- `Location.latitude` \u002F `longitude` — there's no PII-equivalent to mask in a coordinate pair, so the data uses real ZIP-centroid coordinates for the 12 cities in this dataset, jittered a few hundred metres per address. Distances stay directionally realistic and no external geocoding API is needed to load or demo the package. This is not the output of an actual geocoder run against these addresses; don't present it as one.\n- `DOB.dateHash` — the opposite of masking. `DOB` is keyed on a keyed hash of the full birthdate rather than the masked display value, so matching runs on real date precision without the real date ever being stored or shown. If you regenerate this field, keep using an HMAC with a secret key, not a plain hash: a birthdate has too little entropy for a plain hash to protect it. See `caveats.md`.\n\nA masked value carries less entropy than the value it replaces, and that has consequences the queries have to be designed around. `caveats.md` covers each one.\n\n### What's seeded\n\n- **9 hand-curated identities** from the original design, including the three-channel Robert Anderson cluster (CRM, MobileApp, CallCenter).\n- **10 more** across four additional multi-channel match clusters, varying which attributes each shares: phone+address+DOB+IP, phone+email, address+DOB, IP+phone.\n- **3 synthetic-identity fraud pairs**, each corroborated by a shared phone, a near-duplicate SSN, and a near-miss name spelling.\n- **5 identities** across two placeholder collisions (`none@none.com`, `test@test.com`), plus three sharing the placeholder phone `999-999-9999`.\n- **4 identities** across two location-only match pairs: same geocoded coordinates, different address text, no other shared identifier.\n- **3 identities** with addresses the geocoder couldn't resolve: two invalid zip formats, one zip\u002Fcity mismatch.\n- **~466 non-colliding noise profiles** with realistic capture gaps, roughly 10–30% missing per attribute.\n\n### Expected results\n\nRunning the templates in order against this data produces:\n\n| Query                                   | Result                                                      |\n| --------------------------------------- | ----------------------------------------------------------- |\n| Placeholder detection (email)           | 2 flagged values, 4 identities                              |\n| Placeholder detection (phone)           | 1 flagged value, 3 identities                               |\n| Shared Identifier Fan-out               | 39 rows across 17 distinct pairs                            |\n| Confidence-Scored Matches               | 17 pairs: 5 at confidence 1, 7 at 2, 1 at 3, 3 at 4, 1 at 5 |\n| Match Cluster as a Graph (`ID-1001`)    | 8 paths                                                     |\n| Implausible Address Detection           | 3 addresses                                                 |\n| Location Match                          | 2 pairs                                                     |\n| Descriptor Similarity                   | 3 pairs (0.948, 0.923, 0.861)                               |\n| Nearby Address                          | 1 pair, 241m apart                                          |\n| Weighted Composite                      | 15 rows, 0.375–0.883                                        |\n| Near-Duplicate SSN                      | 3 corroborated pairs                                        |\n| Cross-Channel Assembly (`555-201-8823`) | 3 rows \u002F 17 paths                                           |\n\nSix legitimate multi-channel clusters rank at the top of both scored queries (confidence 2–5, scores 0.533–0.883). The three synthetic-identity pairs sit distinctly below them (confidence 1, scores 0.375–0.401), flagged only because three corroboration signals agree — and a fourth for one of the three, since David and Daniel Kim also land 241m apart. Two location-only pairs are invisible to every attribute-based query and are found only by `Location Match`. 476 of the 500 identities have no genuine match at all.\n\nThe counts above are a property of this dataset's random seed, not a guarantee. If you regenerate or extend the sample data, re-run every template and update both this section and the expected-result comments in `QUERIES.md`.\n\n## Operational Constraints\n\n- Prefer the bundled sample-data Import flow, and confirm the target database and connection before executing anything.\n- Right after a sample-data import, offer the statements in `SETUP.md` — 3 statements, 1 required, 2 recommended, plus a clearly optional spatial section. Explain each statement's purpose when presenting it, before it runs. If the user declines one, state which queries it affects and that their accuracy can no longer be guaranteed, and repeat that caveat when an affected query is used later. Never recreate node-key constraints after Import — `GRAPH_MODEL.json` already created them.\n- Requires Neo4j 5.x \u002F Cypher 5. `Shared Identifier Fan-out` and `Confidence-Scored Identity Matches` use negated label expressions (`:!Placeholder`).\n- `Descriptor Similarity` and `Weighted Composite Match Score` require APOC (`apoc.text.jaroWinklerDistance`). No other template needs it.\n- `Near-Duplicate SSN` requires the `ssnFuzzyIndex` fulltext index with the `keyword` analyzer (the required statement of `SETUP.md`).\n- `Nearby Address` uses the built-in `point.distance()`; no plugin needed.\n\n## Response Shape\n\nWhen returning guidance, keep output structured:\n\n```text\nModel assumptions\nCypher (if requested)\nWhat this detects\nTuning options\nValidation approach\n```\n",{"data":33,"body":39},{"name":4,"description":6,"metadata":34},{"neo4j-card-title":35,"neo4j-card-category":36,"neo4j-card-description":37,"neo4j-icon-category":38},"Identity Validation","General","Resolve one person across systems and channels, and surface near-duplicate identifiers that signal synthetic identity fraud.","general",{"type":40,"children":41},"root",[42,51,57,62,89,103,108,115,120,138,143,149,312,318,386,392,405,690,747,865,872,898,903,949,961,967,1063,1069,1074,1265,1277,1288,1294,1424,1430,1435],{"type":43,"tag":44,"props":45,"children":47},"element","h1",{"id":46},"identity-graph",[48],{"type":49,"value":50},"text","Identity Graph",{"type":43,"tag":52,"props":53,"children":54},"p",{},[55],{"type":49,"value":56},"Use this skill for graph-based identity resolution and operational query design: matching the same real-world person or account across source systems, and detecting near-duplicate identifiers that suggest synthetic identity fraud.",{"type":43,"tag":52,"props":58,"children":59},{},[60],{"type":49,"value":61},"Source references:",{"type":43,"tag":63,"props":64,"children":65},"ul",{},[66,78],{"type":43,"tag":67,"props":68,"children":69},"li",{},[70],{"type":43,"tag":71,"props":72,"children":76},"a",{"href":73,"rel":74},"https:\u002F\u002Fneo4j.com\u002Fblog\u002Fgraph-database\u002Fwhat-is-entity-resolution\u002F",[75],"nofollow",[77],{"type":49,"value":73},{"type":43,"tag":67,"props":79,"children":80},{},[81,83],{"type":49,"value":82},"\"A Graph Entity Resolution Playbook\" — Nathan Smith, NODES 2024: ",{"type":43,"tag":71,"props":84,"children":87},{"href":85,"rel":86},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=MfZR_ZrLSDw",[75],[88],{"type":49,"value":85},{"type":43,"tag":52,"props":90,"children":91},{},[92,94,101],{"type":49,"value":93},"This package implements a lightweight starter subset of that talk's process (shared-identifier matching, placeholder detection, descriptor-based corroboration, weighted scoring). The talk's GDS techniques (WCC blocking, node similarity, FastRP+KNN, entity merging) are documented as a graduation path in ",{"type":43,"tag":95,"props":96,"children":98},"code",{"className":97},[],[99],{"type":49,"value":100},"implementation-guidance.md",{"type":49,"value":102},", not built into the demo.",{"type":43,"tag":52,"props":104,"children":105},{},[106],{"type":49,"value":107},"This is graph modelling and query-pattern guidance, not legal, regulatory, or compliance advice. Treat every match as an investigative lead for human review, never an automatic merge.",{"type":43,"tag":109,"props":110,"children":112},"h2",{"id":111},"introducing-this-package",[113],{"type":49,"value":114},"Introducing this package",{"type":43,"tag":52,"props":116,"children":117},{},[118],{"type":49,"value":119},"When the user first opens this package, greet them with a short introduction in your own words — don't recite this file. Convey:",{"type":43,"tag":63,"props":121,"children":122},{},[123,128,133],{"type":43,"tag":67,"props":124,"children":125},{},[126],{"type":49,"value":127},"The core idea: the same customer arrives as different records across systems — a CRM row, a mobile signup, a call-centre note — with no single field matching cleanly. A graph turns that from a string-comparison problem into a traversal: each shared phone, email, or address is a node both records point at, so a genuine cluster looks visibly different from a weak, coincidental link — and from a synthetic identity.",{"type":43,"tag":67,"props":129,"children":130},{},[131],{"type":49,"value":132},"The bundled sample data is 500 masked profiles, deliberately seeded so every query returns a meaningful result: six legitimate multi-channel clusters, three synthetic-identity fraud pairs, two address pairs that only match once geocoded, and a realistic non-matching background.",{"type":43,"tag":67,"props":134,"children":135},{},[136],{"type":49,"value":137},"What you can help with: explaining the model and why each attribute is keyed as it is, walking through the query patterns from shared-identifier fan-out to weighted scoring, importing the sample data or mapping their own source systems, showing how synthetic identity fraud differs from a genuine match, and outlining the production-scale Graph Data Science path.",{"type":43,"tag":52,"props":139,"children":140},{},[141],{"type":49,"value":142},"End with a clear next step, such as asking whether they'd like to explore the model or start importing data.",{"type":43,"tag":109,"props":144,"children":146},{"id":145},"supporting-files",[147],{"type":49,"value":148},"Supporting files",{"type":43,"tag":150,"props":151,"children":152},"table",{},[153,172],{"type":43,"tag":154,"props":155,"children":156},"thead",{},[157],{"type":43,"tag":158,"props":159,"children":160},"tr",{},[161,167],{"type":43,"tag":162,"props":163,"children":164},"th",{},[165],{"type":49,"value":166},"File",{"type":43,"tag":162,"props":168,"children":169},{},[170],{"type":49,"value":171},"Use it for",{"type":43,"tag":173,"props":174,"children":175},"tbody",{},[176,194,211,228,245,262,279,295],{"type":43,"tag":158,"props":177,"children":178},{},[179,189],{"type":43,"tag":180,"props":181,"children":182},"td",{},[183],{"type":43,"tag":95,"props":184,"children":186},{"className":185},[],[187],{"type":49,"value":188},"overview.md",{"type":43,"tag":180,"props":190,"children":191},{},[192],{"type":49,"value":193},"Identity resolution concepts; identifiers vs descriptors",{"type":43,"tag":158,"props":195,"children":196},{},[197,206],{"type":43,"tag":180,"props":198,"children":199},{},[200],{"type":43,"tag":95,"props":201,"children":203},{"className":202},[],[204],{"type":49,"value":205},"graph-model.md",{"type":43,"tag":180,"props":207,"children":208},{},[209],{"type":49,"value":210},"Labels, relationships, and why each node is keyed as it is",{"type":43,"tag":158,"props":212,"children":213},{},[214,223],{"type":43,"tag":180,"props":215,"children":216},{},[217],{"type":43,"tag":95,"props":218,"children":220},{"className":219},[],[221],{"type":49,"value":222},"resolution-workflow.md",{"type":43,"tag":180,"props":224,"children":225},{},[226],{"type":49,"value":227},"The ordered workflow, broad to constrained",{"type":43,"tag":158,"props":229,"children":230},{},[231,240],{"type":43,"tag":180,"props":232,"children":233},{},[234],{"type":43,"tag":95,"props":235,"children":237},{"className":236},[],[238],{"type":49,"value":239},"query-patterns.md",{"type":43,"tag":180,"props":241,"children":242},{},[243],{"type":49,"value":244},"Which query to run when, and why each is shaped that way",{"type":43,"tag":158,"props":246,"children":247},{},[248,257],{"type":43,"tag":180,"props":249,"children":250},{},[251],{"type":43,"tag":95,"props":252,"children":254},{"className":253},[],[255],{"type":49,"value":256},"QUERIES.md",{"type":43,"tag":180,"props":258,"children":259},{},[260],{"type":49,"value":261},"Runnable Cypher, each with an expected-result comment",{"type":43,"tag":158,"props":263,"children":264},{},[265,274],{"type":43,"tag":180,"props":266,"children":267},{},[268],{"type":43,"tag":95,"props":269,"children":271},{"className":270},[],[272],{"type":49,"value":273},"SETUP.md",{"type":43,"tag":180,"props":275,"children":276},{},[277],{"type":49,"value":278},"Post-import setup: 3 statements (1 required, 2 recommended)",{"type":43,"tag":158,"props":280,"children":281},{},[282,290],{"type":43,"tag":180,"props":283,"children":284},{},[285],{"type":43,"tag":95,"props":286,"children":288},{"className":287},[],[289],{"type":49,"value":100},{"type":43,"tag":180,"props":291,"children":292},{},[293],{"type":49,"value":294},"Adapting to real data; GDS graduation path",{"type":43,"tag":158,"props":296,"children":297},{},[298,307],{"type":43,"tag":180,"props":299,"children":300},{},[301],{"type":43,"tag":95,"props":302,"children":304},{"className":303},[],[305],{"type":49,"value":306},"caveats.md",{"type":43,"tag":180,"props":308,"children":309},{},[310],{"type":49,"value":311},"Limitations, false-positive modes, entropy traps",{"type":43,"tag":109,"props":313,"children":315},{"id":314},"key-rules",[316],{"type":49,"value":317},"Key rules",{"type":43,"tag":63,"props":319,"children":320},{},[321,349,354,381],{"type":43,"tag":67,"props":322,"children":323},{},[324,326,332,334,340,341,347],{"type":49,"value":325},"Sample data is masked, not randomised (",{"type":43,"tag":95,"props":327,"children":329},{"className":328},[],[330],{"type":49,"value":331},"XXX-XX-4821",{"type":49,"value":333},", ",{"type":43,"tag":95,"props":335,"children":337},{"className":336},[],[338],{"type":49,"value":339},"555-201-8823",{"type":49,"value":333},{"type":43,"tag":95,"props":342,"children":344},{"className":343},[],[345],{"type":49,"value":346},"203.0.113.x",{"type":49,"value":348},"). Preserve that convention when editing it; see the Sample data section below. Never add real or fully unmasked identifiers.",{"type":43,"tag":67,"props":350,"children":351},{},[352],{"type":49,"value":353},"Never run fuzzy or descriptor scoring as a population-wide scan. Always block on a real shared identifier first. Unblocked scans return thousands of coincidental hits against this dataset.",{"type":43,"tag":67,"props":355,"children":356},{},[357,359,364,366,371,373,379],{"type":49,"value":358},"Placeholder flagging runs as ",{"type":43,"tag":95,"props":360,"children":362},{"className":361},[],[363],{"type":49,"value":273},{"type":49,"value":365}," steps 2–3 (or the equivalent templates in ",{"type":43,"tag":95,"props":367,"children":369},{"className":368},[],[370],{"type":49,"value":256},{"type":49,"value":372}," — once, not both). Run the read-only ",{"type":43,"tag":95,"props":374,"children":376},{"className":375},[],[377],{"type":49,"value":378},"Implausible Address Detection",{"type":49,"value":380}," before any location query.",{"type":43,"tag":67,"props":382,"children":383},{},[384],{"type":49,"value":385},"A user's own data needs their organisation's real PII policy, not this package's demo masking.",{"type":43,"tag":109,"props":387,"children":389},{"id":388},"sample-data",[390],{"type":49,"value":391},"Sample data",{"type":43,"tag":52,"props":393,"children":394},{},[395,397,403],{"type":49,"value":396},"500 masked profiles under ",{"type":43,"tag":95,"props":398,"children":400},{"className":399},[],[401],{"type":49,"value":402},"sample-data\u002F",{"type":49,"value":404},", deliberately seeded so every query template returns a meaningful result.",{"type":43,"tag":150,"props":406,"children":407},{},[408,428],{"type":43,"tag":154,"props":409,"children":410},{},[411],{"type":43,"tag":158,"props":412,"children":413},{},[414,418,423],{"type":43,"tag":162,"props":415,"children":416},{},[417],{"type":49,"value":166},{"type":43,"tag":162,"props":419,"children":420},{},[421],{"type":49,"value":422},"Rows",{"type":43,"tag":162,"props":424,"children":425},{},[426],{"type":49,"value":427},"Produces",{"type":43,"tag":173,"props":429,"children":430},{},[431,460,488,517,546,575,604,632,661],{"type":43,"tag":158,"props":432,"children":433},{},[434,443,448],{"type":43,"tag":180,"props":435,"children":436},{},[437],{"type":43,"tag":95,"props":438,"children":440},{"className":439},[],[441],{"type":49,"value":442},"identities.csv",{"type":43,"tag":180,"props":444,"children":445},{},[446],{"type":49,"value":447},"500",{"type":43,"tag":180,"props":449,"children":450},{},[451,453,458],{"type":49,"value":452},"500 ",{"type":43,"tag":95,"props":454,"children":456},{"className":455},[],[457],{"type":49,"value":21},{"type":49,"value":459}," nodes",{"type":43,"tag":158,"props":461,"children":462},{},[463,472,476],{"type":43,"tag":180,"props":464,"children":465},{},[466],{"type":43,"tag":95,"props":467,"children":469},{"className":468},[],[470],{"type":49,"value":471},"names.csv",{"type":43,"tag":180,"props":473,"children":474},{},[475],{"type":49,"value":447},{"type":43,"tag":180,"props":477,"children":478},{},[479,481,487],{"type":49,"value":480},"484 ",{"type":43,"tag":95,"props":482,"children":484},{"className":483},[],[485],{"type":49,"value":486},"PersonName",{"type":49,"value":459},{"type":43,"tag":158,"props":489,"children":490},{},[491,500,505],{"type":43,"tag":180,"props":492,"children":493},{},[494],{"type":43,"tag":95,"props":495,"children":497},{"className":496},[],[498],{"type":49,"value":499},"phones.csv",{"type":43,"tag":180,"props":501,"children":502},{},[503],{"type":49,"value":504},"439",{"type":43,"tag":180,"props":506,"children":507},{},[508,510,516],{"type":49,"value":509},"428 ",{"type":43,"tag":95,"props":511,"children":513},{"className":512},[],[514],{"type":49,"value":515},"Phone",{"type":49,"value":459},{"type":43,"tag":158,"props":518,"children":519},{},[520,529,534],{"type":43,"tag":180,"props":521,"children":522},{},[523],{"type":43,"tag":95,"props":524,"children":526},{"className":525},[],[527],{"type":49,"value":528},"emails.csv",{"type":43,"tag":180,"props":530,"children":531},{},[532],{"type":49,"value":533},"390",{"type":43,"tag":180,"props":535,"children":536},{},[537,539,545],{"type":49,"value":538},"386 ",{"type":43,"tag":95,"props":540,"children":542},{"className":541},[],[543],{"type":49,"value":544},"Email",{"type":49,"value":459},{"type":43,"tag":158,"props":547,"children":548},{},[549,558,563],{"type":43,"tag":180,"props":550,"children":551},{},[552],{"type":43,"tag":95,"props":553,"children":555},{"className":554},[],[556],{"type":49,"value":557},"ssns.csv",{"type":43,"tag":180,"props":559,"children":560},{},[561],{"type":49,"value":562},"367",{"type":43,"tag":180,"props":564,"children":565},{},[566,568,574],{"type":49,"value":567},"366 ",{"type":43,"tag":95,"props":569,"children":571},{"className":570},[],[572],{"type":49,"value":573},"SSN",{"type":49,"value":459},{"type":43,"tag":158,"props":576,"children":577},{},[578,587,592],{"type":43,"tag":180,"props":579,"children":580},{},[581],{"type":43,"tag":95,"props":582,"children":584},{"className":583},[],[585],{"type":49,"value":586},"addresses.csv",{"type":43,"tag":180,"props":588,"children":589},{},[590],{"type":49,"value":591},"416",{"type":43,"tag":180,"props":593,"children":594},{},[595,597,603],{"type":49,"value":596},"410 ",{"type":43,"tag":95,"props":598,"children":600},{"className":599},[],[601],{"type":49,"value":602},"Address",{"type":49,"value":459},{"type":43,"tag":158,"props":605,"children":606},{},[607,616,620],{"type":43,"tag":180,"props":608,"children":609},{},[610],{"type":43,"tag":95,"props":611,"children":613},{"className":612},[],[614],{"type":49,"value":615},"dobs.csv",{"type":43,"tag":180,"props":617,"children":618},{},[619],{"type":49,"value":591},{"type":43,"tag":180,"props":621,"children":622},{},[623,625,631],{"type":49,"value":624},"408 ",{"type":43,"tag":95,"props":626,"children":628},{"className":627},[],[629],{"type":49,"value":630},"DOB",{"type":49,"value":459},{"type":43,"tag":158,"props":633,"children":634},{},[635,644,649],{"type":43,"tag":180,"props":636,"children":637},{},[638],{"type":43,"tag":95,"props":639,"children":641},{"className":640},[],[642],{"type":49,"value":643},"ip_addresses.csv",{"type":43,"tag":180,"props":645,"children":646},{},[647],{"type":49,"value":648},"487",{"type":43,"tag":180,"props":650,"children":651},{},[652,654,660],{"type":49,"value":653},"482 ",{"type":43,"tag":95,"props":655,"children":657},{"className":656},[],[658],{"type":49,"value":659},"IPAddress",{"type":49,"value":459},{"type":43,"tag":158,"props":662,"children":663},{},[664,673,678],{"type":43,"tag":180,"props":665,"children":666},{},[667],{"type":43,"tag":95,"props":668,"children":670},{"className":669},[],[671],{"type":49,"value":672},"locations.csv",{"type":43,"tag":180,"props":674,"children":675},{},[676],{"type":49,"value":677},"407",{"type":43,"tag":180,"props":679,"children":680},{},[681,683,689],{"type":49,"value":682},"405 ",{"type":43,"tag":95,"props":684,"children":686},{"className":685},[],[687],{"type":49,"value":688},"Location",{"type":49,"value":459},{"type":43,"tag":52,"props":691,"children":692},{},[693,695,701,703,708,710,715,717,723,725,731,733,738,740,745],{"type":49,"value":694},"Every attribute file also carries ",{"type":43,"tag":95,"props":696,"children":698},{"className":697},[],[699],{"type":49,"value":700},"identityId",{"type":49,"value":702},", which supplies the relationship from ",{"type":43,"tag":95,"props":704,"children":706},{"className":705},[],[707],{"type":49,"value":21},{"type":49,"value":709},". ",{"type":43,"tag":95,"props":711,"children":713},{"className":712},[],[714],{"type":49,"value":672},{"type":49,"value":716}," is the exception: it carries ",{"type":43,"tag":95,"props":718,"children":720},{"className":719},[],[721],{"type":49,"value":722},"addressId",{"type":49,"value":724}," and supplies ",{"type":43,"tag":95,"props":726,"children":728},{"className":727},[],[729],{"type":49,"value":730},"GEOCODED_TO",{"type":49,"value":732}," from ",{"type":43,"tag":95,"props":734,"children":736},{"className":735},[],[737],{"type":49,"value":602},{"type":49,"value":739}," rather than from ",{"type":43,"tag":95,"props":741,"children":743},{"className":742},[],[744],{"type":49,"value":21},{"type":49,"value":746},".",{"type":43,"tag":52,"props":748,"children":749},{},[750,752,757,758,764,765,771,772,778,779,785,786,792,793,799,801,806,808,813,815,820,822,828,830,836,837,842,843,849,851,856,858,863],{"type":49,"value":751},"Every node is keyed on a single property, as the Import flow requires. Seven labels have a natural one — ",{"type":43,"tag":95,"props":753,"children":755},{"className":754},[],[756],{"type":49,"value":700},{"type":49,"value":333},{"type":43,"tag":95,"props":759,"children":761},{"className":760},[],[762],{"type":49,"value":763},"fullName",{"type":49,"value":333},{"type":43,"tag":95,"props":766,"children":768},{"className":767},[],[769],{"type":49,"value":770},"phoneNumber",{"type":49,"value":333},{"type":43,"tag":95,"props":773,"children":775},{"className":774},[],[776],{"type":49,"value":777},"email",{"type":49,"value":333},{"type":43,"tag":95,"props":780,"children":782},{"className":781},[],[783],{"type":49,"value":784},"ssn",{"type":49,"value":333},{"type":43,"tag":95,"props":787,"children":789},{"className":788},[],[790],{"type":49,"value":791},"dateHash",{"type":49,"value":333},{"type":43,"tag":95,"props":794,"children":796},{"className":795},[],[797],{"type":49,"value":798},"ip",{"type":49,"value":800},". The two with composite identities carry a derived key instead: ",{"type":43,"tag":95,"props":802,"children":804},{"className":803},[],[805],{"type":49,"value":722},{"type":49,"value":807}," (in ",{"type":43,"tag":95,"props":809,"children":811},{"className":810},[],[812],{"type":49,"value":586},{"type":49,"value":814}," and ",{"type":43,"tag":95,"props":816,"children":818},{"className":817},[],[819],{"type":49,"value":672},{"type":49,"value":821},", of the form ",{"type":43,"tag":95,"props":823,"children":825},{"className":824},[],[826],{"type":49,"value":827},"\"1210 Foxglove Dr, Austin, TX 78701\"",{"type":49,"value":829},") and ",{"type":43,"tag":95,"props":831,"children":833},{"className":832},[],[834],{"type":49,"value":835},"locationId",{"type":49,"value":807},{"type":43,"tag":95,"props":838,"children":840},{"className":839},[],[841],{"type":49,"value":672},{"type":49,"value":821},{"type":43,"tag":95,"props":844,"children":846},{"className":845},[],[847],{"type":49,"value":848},"\"30.2686,-97.7411\"",{"type":49,"value":850},"). Both are derived from exactly the values they stand in for, so dedup is unchanged: 416 address rows produce 410 ",{"type":43,"tag":95,"props":852,"children":854},{"className":853},[],[855],{"type":49,"value":602},{"type":49,"value":857}," nodes, and 407 geocoded addresses produce 405 ",{"type":43,"tag":95,"props":859,"children":861},{"className":860},[],[862],{"type":49,"value":688},{"type":49,"value":864}," nodes. Both contain commas and are therefore CSV-quoted throughout.",{"type":43,"tag":866,"props":867,"children":869},"h3",{"id":868},"masked-not-randomised",[870],{"type":49,"value":871},"Masked, not randomised",{"type":43,"tag":52,"props":873,"children":874},{},[875,877,882,884,889,891,896],{"type":49,"value":876},"The sample data uses realistic-format but masked identifiers — ",{"type":43,"tag":95,"props":878,"children":880},{"className":879},[],[881],{"type":49,"value":331},{"type":49,"value":883}," for SSN, ",{"type":43,"tag":95,"props":885,"children":887},{"className":886},[],[888],{"type":49,"value":339},{"type":49,"value":890}," using the reserved fake area code, ",{"type":43,"tag":95,"props":892,"children":894},{"className":893},[],[895],{"type":49,"value":346},{"type":49,"value":897}," reserved documentation IPs — rather than opaque random strings or full plaintext PII. This lets an audience visually confirm exact and near-duplicate matches themselves during a demo, without ever showing anything resembling a real, complete identifier. Preserve this convention if you add or edit sample data. Don't anonymise into random tokens, and don't add full unmasked identifiers.",{"type":43,"tag":52,"props":899,"children":900},{},[901],{"type":49,"value":902},"Two fields are exceptions:",{"type":43,"tag":63,"props":904,"children":905},{},[906,925],{"type":43,"tag":67,"props":907,"children":908},{},[909,915,917,923],{"type":43,"tag":95,"props":910,"children":912},{"className":911},[],[913],{"type":49,"value":914},"Location.latitude",{"type":49,"value":916}," \u002F ",{"type":43,"tag":95,"props":918,"children":920},{"className":919},[],[921],{"type":49,"value":922},"longitude",{"type":49,"value":924}," — there's no PII-equivalent to mask in a coordinate pair, so the data uses real ZIP-centroid coordinates for the 12 cities in this dataset, jittered a few hundred metres per address. Distances stay directionally realistic and no external geocoding API is needed to load or demo the package. This is not the output of an actual geocoder run against these addresses; don't present it as one.",{"type":43,"tag":67,"props":926,"children":927},{},[928,934,936,941,943,948],{"type":43,"tag":95,"props":929,"children":931},{"className":930},[],[932],{"type":49,"value":933},"DOB.dateHash",{"type":49,"value":935}," — the opposite of masking. ",{"type":43,"tag":95,"props":937,"children":939},{"className":938},[],[940],{"type":49,"value":630},{"type":49,"value":942}," is keyed on a keyed hash of the full birthdate rather than the masked display value, so matching runs on real date precision without the real date ever being stored or shown. If you regenerate this field, keep using an HMAC with a secret key, not a plain hash: a birthdate has too little entropy for a plain hash to protect it. See ",{"type":43,"tag":95,"props":944,"children":946},{"className":945},[],[947],{"type":49,"value":306},{"type":49,"value":746},{"type":43,"tag":52,"props":950,"children":951},{},[952,954,959],{"type":49,"value":953},"A masked value carries less entropy than the value it replaces, and that has consequences the queries have to be designed around. ",{"type":43,"tag":95,"props":955,"children":957},{"className":956},[],[958],{"type":49,"value":306},{"type":49,"value":960}," covers each one.",{"type":43,"tag":866,"props":962,"children":964},{"id":963},"whats-seeded",[965],{"type":49,"value":966},"What's seeded",{"type":43,"tag":63,"props":968,"children":969},{},[970,981,991,1001,1033,1043,1053],{"type":43,"tag":67,"props":971,"children":972},{},[973,979],{"type":43,"tag":974,"props":975,"children":976},"strong",{},[977],{"type":49,"value":978},"9 hand-curated identities",{"type":49,"value":980}," from the original design, including the three-channel Robert Anderson cluster (CRM, MobileApp, CallCenter).",{"type":43,"tag":67,"props":982,"children":983},{},[984,989],{"type":43,"tag":974,"props":985,"children":986},{},[987],{"type":49,"value":988},"10 more",{"type":49,"value":990}," across four additional multi-channel match clusters, varying which attributes each shares: phone+address+DOB+IP, phone+email, address+DOB, IP+phone.",{"type":43,"tag":67,"props":992,"children":993},{},[994,999],{"type":43,"tag":974,"props":995,"children":996},{},[997],{"type":49,"value":998},"3 synthetic-identity fraud pairs",{"type":49,"value":1000},", each corroborated by a shared phone, a near-duplicate SSN, and a near-miss name spelling.",{"type":43,"tag":67,"props":1002,"children":1003},{},[1004,1009,1011,1017,1018,1024,1026,1032],{"type":43,"tag":974,"props":1005,"children":1006},{},[1007],{"type":49,"value":1008},"5 identities",{"type":49,"value":1010}," across two placeholder collisions (",{"type":43,"tag":95,"props":1012,"children":1014},{"className":1013},[],[1015],{"type":49,"value":1016},"none@none.com",{"type":49,"value":333},{"type":43,"tag":95,"props":1019,"children":1021},{"className":1020},[],[1022],{"type":49,"value":1023},"test@test.com",{"type":49,"value":1025},"), plus three sharing the placeholder phone ",{"type":43,"tag":95,"props":1027,"children":1029},{"className":1028},[],[1030],{"type":49,"value":1031},"999-999-9999",{"type":49,"value":746},{"type":43,"tag":67,"props":1034,"children":1035},{},[1036,1041],{"type":43,"tag":974,"props":1037,"children":1038},{},[1039],{"type":49,"value":1040},"4 identities",{"type":49,"value":1042}," across two location-only match pairs: same geocoded coordinates, different address text, no other shared identifier.",{"type":43,"tag":67,"props":1044,"children":1045},{},[1046,1051],{"type":43,"tag":974,"props":1047,"children":1048},{},[1049],{"type":49,"value":1050},"3 identities",{"type":49,"value":1052}," with addresses the geocoder couldn't resolve: two invalid zip formats, one zip\u002Fcity mismatch.",{"type":43,"tag":67,"props":1054,"children":1055},{},[1056,1061],{"type":43,"tag":974,"props":1057,"children":1058},{},[1059],{"type":49,"value":1060},"~466 non-colliding noise profiles",{"type":49,"value":1062}," with realistic capture gaps, roughly 10–30% missing per attribute.",{"type":43,"tag":866,"props":1064,"children":1066},{"id":1065},"expected-results",[1067],{"type":49,"value":1068},"Expected results",{"type":43,"tag":52,"props":1070,"children":1071},{},[1072],{"type":49,"value":1073},"Running the templates in order against this data produces:",{"type":43,"tag":150,"props":1075,"children":1076},{},[1077,1093],{"type":43,"tag":154,"props":1078,"children":1079},{},[1080],{"type":43,"tag":158,"props":1081,"children":1082},{},[1083,1088],{"type":43,"tag":162,"props":1084,"children":1085},{},[1086],{"type":49,"value":1087},"Query",{"type":43,"tag":162,"props":1089,"children":1090},{},[1091],{"type":49,"value":1092},"Result",{"type":43,"tag":173,"props":1094,"children":1095},{},[1096,1109,1122,1135,1148,1169,1181,1194,1207,1220,1233,1246],{"type":43,"tag":158,"props":1097,"children":1098},{},[1099,1104],{"type":43,"tag":180,"props":1100,"children":1101},{},[1102],{"type":49,"value":1103},"Placeholder detection (email)",{"type":43,"tag":180,"props":1105,"children":1106},{},[1107],{"type":49,"value":1108},"2 flagged values, 4 identities",{"type":43,"tag":158,"props":1110,"children":1111},{},[1112,1117],{"type":43,"tag":180,"props":1113,"children":1114},{},[1115],{"type":49,"value":1116},"Placeholder detection (phone)",{"type":43,"tag":180,"props":1118,"children":1119},{},[1120],{"type":49,"value":1121},"1 flagged value, 3 identities",{"type":43,"tag":158,"props":1123,"children":1124},{},[1125,1130],{"type":43,"tag":180,"props":1126,"children":1127},{},[1128],{"type":49,"value":1129},"Shared Identifier Fan-out",{"type":43,"tag":180,"props":1131,"children":1132},{},[1133],{"type":49,"value":1134},"39 rows across 17 distinct pairs",{"type":43,"tag":158,"props":1136,"children":1137},{},[1138,1143],{"type":43,"tag":180,"props":1139,"children":1140},{},[1141],{"type":49,"value":1142},"Confidence-Scored Matches",{"type":43,"tag":180,"props":1144,"children":1145},{},[1146],{"type":49,"value":1147},"17 pairs: 5 at confidence 1, 7 at 2, 1 at 3, 3 at 4, 1 at 5",{"type":43,"tag":158,"props":1149,"children":1150},{},[1151,1164],{"type":43,"tag":180,"props":1152,"children":1153},{},[1154,1156,1162],{"type":49,"value":1155},"Match Cluster as a Graph (",{"type":43,"tag":95,"props":1157,"children":1159},{"className":1158},[],[1160],{"type":49,"value":1161},"ID-1001",{"type":49,"value":1163},")",{"type":43,"tag":180,"props":1165,"children":1166},{},[1167],{"type":49,"value":1168},"8 paths",{"type":43,"tag":158,"props":1170,"children":1171},{},[1172,1176],{"type":43,"tag":180,"props":1173,"children":1174},{},[1175],{"type":49,"value":378},{"type":43,"tag":180,"props":1177,"children":1178},{},[1179],{"type":49,"value":1180},"3 addresses",{"type":43,"tag":158,"props":1182,"children":1183},{},[1184,1189],{"type":43,"tag":180,"props":1185,"children":1186},{},[1187],{"type":49,"value":1188},"Location Match",{"type":43,"tag":180,"props":1190,"children":1191},{},[1192],{"type":49,"value":1193},"2 pairs",{"type":43,"tag":158,"props":1195,"children":1196},{},[1197,1202],{"type":43,"tag":180,"props":1198,"children":1199},{},[1200],{"type":49,"value":1201},"Descriptor Similarity",{"type":43,"tag":180,"props":1203,"children":1204},{},[1205],{"type":49,"value":1206},"3 pairs (0.948, 0.923, 0.861)",{"type":43,"tag":158,"props":1208,"children":1209},{},[1210,1215],{"type":43,"tag":180,"props":1211,"children":1212},{},[1213],{"type":49,"value":1214},"Nearby Address",{"type":43,"tag":180,"props":1216,"children":1217},{},[1218],{"type":49,"value":1219},"1 pair, 241m apart",{"type":43,"tag":158,"props":1221,"children":1222},{},[1223,1228],{"type":43,"tag":180,"props":1224,"children":1225},{},[1226],{"type":49,"value":1227},"Weighted Composite",{"type":43,"tag":180,"props":1229,"children":1230},{},[1231],{"type":49,"value":1232},"15 rows, 0.375–0.883",{"type":43,"tag":158,"props":1234,"children":1235},{},[1236,1241],{"type":43,"tag":180,"props":1237,"children":1238},{},[1239],{"type":49,"value":1240},"Near-Duplicate SSN",{"type":43,"tag":180,"props":1242,"children":1243},{},[1244],{"type":49,"value":1245},"3 corroborated pairs",{"type":43,"tag":158,"props":1247,"children":1248},{},[1249,1260],{"type":43,"tag":180,"props":1250,"children":1251},{},[1252,1254,1259],{"type":49,"value":1253},"Cross-Channel Assembly (",{"type":43,"tag":95,"props":1255,"children":1257},{"className":1256},[],[1258],{"type":49,"value":339},{"type":49,"value":1163},{"type":43,"tag":180,"props":1261,"children":1262},{},[1263],{"type":49,"value":1264},"3 rows \u002F 17 paths",{"type":43,"tag":52,"props":1266,"children":1267},{},[1268,1270,1275],{"type":49,"value":1269},"Six legitimate multi-channel clusters rank at the top of both scored queries (confidence 2–5, scores 0.533–0.883). The three synthetic-identity pairs sit distinctly below them (confidence 1, scores 0.375–0.401), flagged only because three corroboration signals agree — and a fourth for one of the three, since David and Daniel Kim also land 241m apart. Two location-only pairs are invisible to every attribute-based query and are found only by ",{"type":43,"tag":95,"props":1271,"children":1273},{"className":1272},[],[1274],{"type":49,"value":1188},{"type":49,"value":1276},". 476 of the 500 identities have no genuine match at all.",{"type":43,"tag":52,"props":1278,"children":1279},{},[1280,1282,1287],{"type":49,"value":1281},"The counts above are a property of this dataset's random seed, not a guarantee. If you regenerate or extend the sample data, re-run every template and update both this section and the expected-result comments in ",{"type":43,"tag":95,"props":1283,"children":1285},{"className":1284},[],[1286],{"type":49,"value":256},{"type":49,"value":746},{"type":43,"tag":109,"props":1289,"children":1291},{"id":1290},"operational-constraints",[1292],{"type":49,"value":1293},"Operational Constraints",{"type":43,"tag":63,"props":1295,"children":1296},{},[1297,1302,1322,1349,1374,1406],{"type":43,"tag":67,"props":1298,"children":1299},{},[1300],{"type":49,"value":1301},"Prefer the bundled sample-data Import flow, and confirm the target database and connection before executing anything.",{"type":43,"tag":67,"props":1303,"children":1304},{},[1305,1307,1312,1314,1320],{"type":49,"value":1306},"Right after a sample-data import, offer the statements in ",{"type":43,"tag":95,"props":1308,"children":1310},{"className":1309},[],[1311],{"type":49,"value":273},{"type":49,"value":1313}," — 3 statements, 1 required, 2 recommended, plus a clearly optional spatial section. Explain each statement's purpose when presenting it, before it runs. If the user declines one, state which queries it affects and that their accuracy can no longer be guaranteed, and repeat that caveat when an affected query is used later. Never recreate node-key constraints after Import — ",{"type":43,"tag":95,"props":1315,"children":1317},{"className":1316},[],[1318],{"type":49,"value":1319},"GRAPH_MODEL.json",{"type":49,"value":1321}," already created them.",{"type":43,"tag":67,"props":1323,"children":1324},{},[1325,1327,1332,1333,1339,1341,1347],{"type":49,"value":1326},"Requires Neo4j 5.x \u002F Cypher 5. ",{"type":43,"tag":95,"props":1328,"children":1330},{"className":1329},[],[1331],{"type":49,"value":1129},{"type":49,"value":814},{"type":43,"tag":95,"props":1334,"children":1336},{"className":1335},[],[1337],{"type":49,"value":1338},"Confidence-Scored Identity Matches",{"type":49,"value":1340}," use negated label expressions (",{"type":43,"tag":95,"props":1342,"children":1344},{"className":1343},[],[1345],{"type":49,"value":1346},":!Placeholder",{"type":49,"value":1348},").",{"type":43,"tag":67,"props":1350,"children":1351},{},[1352,1357,1358,1364,1366,1372],{"type":43,"tag":95,"props":1353,"children":1355},{"className":1354},[],[1356],{"type":49,"value":1201},{"type":49,"value":814},{"type":43,"tag":95,"props":1359,"children":1361},{"className":1360},[],[1362],{"type":49,"value":1363},"Weighted Composite Match Score",{"type":49,"value":1365}," require APOC (",{"type":43,"tag":95,"props":1367,"children":1369},{"className":1368},[],[1370],{"type":49,"value":1371},"apoc.text.jaroWinklerDistance",{"type":49,"value":1373},"). No other template needs it.",{"type":43,"tag":67,"props":1375,"children":1376},{},[1377,1382,1384,1390,1392,1398,1400,1405],{"type":43,"tag":95,"props":1378,"children":1380},{"className":1379},[],[1381],{"type":49,"value":1240},{"type":49,"value":1383}," requires the ",{"type":43,"tag":95,"props":1385,"children":1387},{"className":1386},[],[1388],{"type":49,"value":1389},"ssnFuzzyIndex",{"type":49,"value":1391}," fulltext index with the ",{"type":43,"tag":95,"props":1393,"children":1395},{"className":1394},[],[1396],{"type":49,"value":1397},"keyword",{"type":49,"value":1399}," analyzer (the required statement of ",{"type":43,"tag":95,"props":1401,"children":1403},{"className":1402},[],[1404],{"type":49,"value":273},{"type":49,"value":1348},{"type":43,"tag":67,"props":1407,"children":1408},{},[1409,1414,1416,1422],{"type":43,"tag":95,"props":1410,"children":1412},{"className":1411},[],[1413],{"type":49,"value":1214},{"type":49,"value":1415}," uses the built-in ",{"type":43,"tag":95,"props":1417,"children":1419},{"className":1418},[],[1420],{"type":49,"value":1421},"point.distance()",{"type":49,"value":1423},"; no plugin needed.",{"type":43,"tag":109,"props":1425,"children":1427},{"id":1426},"response-shape",[1428],{"type":49,"value":1429},"Response Shape",{"type":43,"tag":52,"props":1431,"children":1432},{},[1433],{"type":49,"value":1434},"When returning guidance, keep output structured:",{"type":43,"tag":1436,"props":1437,"children":1442},"pre",{"className":1438,"code":1440,"language":49,"meta":1441},[1439],"language-text","Model assumptions\nCypher (if requested)\nWhat this detects\nTuning options\nValidation approach\n","",[1443],{"type":43,"tag":95,"props":1444,"children":1445},{"__ignoreMap":1441},[1446],{"type":49,"value":1440},{"items":1448,"total":1517},[1449,1464,1471,1489,1502],{"slug":1450,"name":1450,"fn":1451,"description":1452,"org":1453,"tags":1454,"stars":23,"repoUrl":24,"updatedAt":1463},"ev-route-planning","plan electric vehicle routes with graph analysis","Plan electric vehicle routes across a logistics network with Neo4j — battery state-of-charge, charging stops, time-of-day travel, and Cypher 25 stateful path patterns across cities, charging stations, roads, and fleet vehicles.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1455,1456,1459,1460],{"name":13,"slug":14,"type":15},{"name":1457,"slug":1458,"type":15},"Logistics","logistics",{"name":9,"slug":8,"type":15},{"name":1461,"slug":1462,"type":15},"Optimization","optimization","2026-08-18T03:49:45.937937",{"slug":4,"name":4,"fn":5,"description":6,"org":1465,"tags":1466,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1467,1468,1469,1470],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":21,"slug":22,"type":15},{"name":9,"slug":8,"type":15},{"slug":1472,"name":1472,"fn":1473,"description":1474,"org":1475,"tags":1476,"stars":23,"repoUrl":24,"updatedAt":1488},"insurance-claims-fraud","detect insurance claims fraud using graph analysis","Detect insurance claims fraud by modelling claimants, medical professionals, vehicles, and claims as a graph. Provides a graph model, bundled sample data, and Cypher for repeat claimants, unusual medical-professional activity, and vehicles reused across claims.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1477,1480,1483,1484,1487],{"name":1478,"slug":1479,"type":15},"Data Analysis","data-analysis",{"name":1481,"slug":1482,"type":15},"Fraud","fraud",{"name":13,"slug":14,"type":15},{"name":1485,"slug":1486,"type":15},"Insurance","insurance",{"name":9,"slug":8,"type":15},"2026-08-18T03:49:43.272995",{"slug":1490,"name":1490,"fn":1491,"description":1492,"org":1493,"tags":1494,"stars":23,"repoUrl":24,"updatedAt":1501},"patient-journey","analyze patient journeys using graph models","Model and analyze patient journeys through a healthcare system with Neo4j — longitudinal care pathways, comorbidity, treatment-pattern queries across patients, encounters, diagnoses, and more.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1495,1496,1497,1500],{"name":1478,"slug":1479,"type":15},{"name":13,"slug":14,"type":15},{"name":1498,"slug":1499,"type":15},"Healthcare","healthcare",{"name":9,"slug":8,"type":15},"2026-08-18T03:49:43.794045",{"slug":1503,"name":1503,"fn":1504,"description":1505,"org":1506,"tags":1507,"stars":23,"repoUrl":24,"updatedAt":1516},"retail-banking","detect retail banking fraud rings","Detect retail banking transaction fraud rings with graph models, Neo4j schema design, and Cypher query patterns for ring, chronology, and amount-decay checks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1508,1511,1512,1513],{"name":1509,"slug":1510,"type":15},"Finance","finance",{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":1514,"slug":1515,"type":15},"Security","security","2026-08-18T03:49:47.474584",5,{"items":1519,"total":1517},[1520,1527,1534,1542,1549],{"slug":1450,"name":1450,"fn":1451,"description":1452,"org":1521,"tags":1522,"stars":23,"repoUrl":24,"updatedAt":1463},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1523,1524,1525,1526],{"name":13,"slug":14,"type":15},{"name":1457,"slug":1458,"type":15},{"name":9,"slug":8,"type":15},{"name":1461,"slug":1462,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":1528,"tags":1529,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1530,1531,1532,1533],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":21,"slug":22,"type":15},{"name":9,"slug":8,"type":15},{"slug":1472,"name":1472,"fn":1473,"description":1474,"org":1535,"tags":1536,"stars":23,"repoUrl":24,"updatedAt":1488},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1537,1538,1539,1540,1541],{"name":1478,"slug":1479,"type":15},{"name":1481,"slug":1482,"type":15},{"name":13,"slug":14,"type":15},{"name":1485,"slug":1486,"type":15},{"name":9,"slug":8,"type":15},{"slug":1490,"name":1490,"fn":1491,"description":1492,"org":1543,"tags":1544,"stars":23,"repoUrl":24,"updatedAt":1501},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1545,1546,1547,1548],{"name":1478,"slug":1479,"type":15},{"name":13,"slug":14,"type":15},{"name":1498,"slug":1499,"type":15},{"name":9,"slug":8,"type":15},{"slug":1503,"name":1503,"fn":1504,"description":1505,"org":1550,"tags":1551,"stars":23,"repoUrl":24,"updatedAt":1516},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1552,1553,1554,1555],{"name":1509,"slug":1510,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":1514,"slug":1515,"type":15}]