{"id":50951333,"url":"https://github.com/ikwattro/operationalising-entity-resolved-graphs","last_synced_at":"2026-06-18T01:32:31.594Z","repository":{"id":362474107,"uuid":"1247615040","full_name":"ikwattro/operationalising-entity-resolved-graphs","owner":"ikwattro","description":"A workshop by Paco Nathan and Christophe Willemsen at the GraphAware's Bridge Meetup Prague 2026","archived":false,"fork":false,"pushed_at":"2026-06-04T10:29:31.000Z","size":4624,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-04T12:14:02.762Z","etag":null,"topics":["entity-resolution","graphaware","knowledge-graphs","neo4j","senzing"],"latest_commit_sha":null,"homepage":"","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ikwattro.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-23T14:53:29.000Z","updated_at":"2026-06-04T10:29:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ikwattro/operationalising-entity-resolved-graphs","commit_stats":null,"previous_names":["ikwattro/operationalising-entity-resolved-graphs"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/ikwattro/operationalising-entity-resolved-graphs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ikwattro%2Foperationalising-entity-resolved-graphs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ikwattro%2Foperationalising-entity-resolved-graphs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ikwattro%2Foperationalising-entity-resolved-graphs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ikwattro%2Foperationalising-entity-resolved-graphs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ikwattro","download_url":"https://codeload.github.com/ikwattro/operationalising-entity-resolved-graphs/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ikwattro%2Foperationalising-entity-resolved-graphs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34472822,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-17T02:00:05.408Z","response_time":127,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["entity-resolution","graphaware","knowledge-graphs","neo4j","senzing"],"created_at":"2026-06-18T01:32:30.956Z","updated_at":"2026-06-18T01:32:31.587Z","avatar_url":"https://github.com/ikwattro.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Operationalising Entity Resolved Graphs\n\nWorkshop material for the **[GraphAware Bridge Meetup](https://graphaware.com)**, Prague — June 4th, 2026.\n\n**Presenters**\n- [Paco Nathan](https://github.com/ceteri) — Principal Developer Relations Engineer, [Senzing](https://senzing.com)\n- [Christophe Willemsen](https://github.com/ikwattro) — CTO, [GraphAware](https://graphaware.com)\n\n---\n\n## What this workshop covers\n\nA hands-on walkthrough of how to build, operate, and consume an entity-resolved graph in production — combining [Senzing](https://senzing.com)'s entity resolution engine with [Neo4j](https://neo4j.com) and [GraphAware Hume](https://graphaware.com). We cover the full operational arc: ingesting raw records, understanding how Senzing resolves (and separates) entities, keeping the graph live as records update, and surfacing explainability to end users through Hume.\n\nThe dataset used throughout is a subset of the [min_aml](references/min_aml.md) corpus: UK beneficial-ownership records (Open Ownership) cross-referenced with sanctioned entities (OpenSanctions).\n\n---\n\n## Repository structure\n\n```\nnotes/            Speaker notes and section prose (primary content workspace)\n  sections/       13 section .md files, one per workshop phase\n  assets/         Data files, Mermaid diagrams, Senzing JSON snippets\n  TODOS.md        Open questions and missing assets, owner-tagged\n\nhow/              Senzing WHY / HOW API examples\n  explain_how.py  Convert a HOW response JSON → HTML report\n  explain_why.py  Convert a WHY response JSON → HTML report\n\nmappings/         Python mapping code: raw graph records → Senzing JSON\nslides/           Marp slide deck — see slides/README.md for build instructions\nreferences/       Data references and prior talks\nscreenshots/      Screenshots used in this README and slides\n```\n\n---\n\n## Getting started\n\n### Prerequisites\n\n- Python 3.9+ (for `how/` and `mappings/` scripts)\n- Node.js 18+ and npm (for `slides/`)\n- A Senzing installation if you want to run the ER pipeline live\n\n### Content (notes)\n\nThe `notes/sections/` directory is the primary workspace. Each file maps to one workshop phase. Start with `notes/sections/00-running-order.md` for the full agenda and per-section time budget.\n\nOpen questions and pending decisions are tracked in `notes/TODOS.md`, grouped by section and tagged by owner (Paco / Christophe / Joint).\n\n### Senzing WHY / HOW reports\n\nThese scripts render Senzing API responses to self-contained HTML pages — useful for demos and slide prep.\n\n```bash\n# WHY report: why are these records in the same entity?\ncd how\npython explain_why.py senzing-why-response.json why-report.html\n\n# HOW report: step-by-step resolution trace\npython explain_how.py senzing-how-response.json how-report.html\n```\n\n### Record mappings\n\nThe `mappings/` scripts show how raw person and organisation records from a Hume graph are translated into Senzing's JSON input format.\n\n```bash\n# Inspect the base mapping template\ncat mappings/mapping.py\n```\n\n### Slides\n\n```bash\ncd slides\nnpm install\nmake dev      # live preview at http://localhost:8080\nmake build    # export to slides/dist/\n```\n\nSee `slides/README.md` for full instructions.\n\n---\n\n## Screenshots\n\n### Graph before entity resolution — disconnected records\n\n![min_aml before resolution](./screenshots/min_aml_not_resolved.png)\n\n### After resolution — entities merged\n\n![min_aml resolved, view 1](./screenshots/min_aml_resolved_1.png)\n\n![min_aml resolved, view 2](./screenshots/min_aml_resolved_2.png)\n\n### Senzing WHY explanation in Hume\n\n![Senzing WHY panel in Hume](./screenshots/min_aml_senzing_why.png)\n\n### Senzing Pipeline\n\n![Hume Orchestra Senzing Pipeline](./screenshots/hume-orchestra-senzing-pipeline.png)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fikwattro%2Foperationalising-entity-resolved-graphs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fikwattro%2Foperationalising-entity-resolved-graphs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fikwattro%2Foperationalising-entity-resolved-graphs/lists"}