examples/meeting_notes_graph_falkordb/README.md
Extract structured information from meeting notes stored in Google Drive and build a knowledge graph in FalkorDB. The flow ingests Markdown notes, splits them by headings into per-meeting sections, uses an LLM (via LiteLLM + instructor) to parse participants, organizer, time, and tasks, and writes nodes and relationships into the graph.
Please drop CocoIndex on Github a star to support us and stay tuned for more updates. Thank you so much 🥥🤗.
Meeting nodes — one per meeting section, keyed by a stable integer id
derived from (note_file, date)Person nodes — canonical organizers, participants, and task assignees,
deduplicated by an embedding + LLM entity-resolution pass (so "Alice",
"Alice Chen", and "alice c." collapse to a single node)Task nodes — tasks decided in meetings (keyed by description)ATTENDED — Person → Meeting (with is_organizer flag)DECIDED — Meeting → TaskASSIGNED_TO — Person → TaskThe source is one or more Google Drive folders shared with a service account. The flow watches for changes and keeps the graph up to date incrementally.
The pipeline runs in three phases:
# / ##) into meeting sections, and for each section
extract a structured Meeting via LiteLLM + instructor (date, note,
organizer, participants, tasks with assignees). Meeting and Task nodes
plus DECIDED edges are declared in this phase. Raw person names are
carried forward.Person nodes are declared, then
ATTENDED and ASSIGNED_TO edges are wired up using resolved names.CocoIndex reconciles changes incrementally — re-running after editing one note only re-processes the affected sections, and the resolution phase only re-runs when the set of raw names changes.
docker run -d -p 6379:6379 -p 3000:3000 falkordb/falkordb:latest
LLM_MODEL for other
providers — see LiteLLM providers).Set the following variables (copy .env.example to .env and fill in):
export OPENAI_API_KEY=sk-...
export GOOGLE_SERVICE_ACCOUNT_CREDENTIAL=/absolute/path/to/service_account.json
export GOOGLE_DRIVE_ROOT_FOLDER_IDS=folderId1,folderId2
export FALKORDB_URI=falkor://localhost:6379
export FALKORDB_GRAPH=meeting_notes
export LLM_MODEL=openai/gpt-5.4
export RESOLUTION_LLM_MODEL=openai/gpt-5-mini # used for entity resolution
Then:
set -a && source .env && set +a
Install dependencies:
uv pip install -e .
Build/update the graph:
cocoindex update main
Open the FalkorDB browser at http://localhost:3000, select the
meeting_notes graph, and run Cypher queries.
// All relationships
MATCH p=()-->() RETURN p
// Who attended which meetings (including organizer; one edge per attendee)
MATCH (p:Person)-[:ATTENDED]->(m:Meeting)
RETURN p.name, m.note_file, m.time, m.id
// Tasks decided in meetings
MATCH (m:Meeting)-[:DECIDED]->(t:Task)
RETURN m.note_file, m.time, t.description
// Task assignments
MATCH (p:Person)-[:ASSIGNED_TO]->(t:Task)
RETURN p.name, t.description
// Meetings someone organized
MATCH (p:Person)-[r:ATTENDED {is_organizer: true}]->(m:Meeting)
RETURN p.name, m.note_file, m.time
You can also use redis-cli:
redis-cli GRAPH.QUERY meeting_notes \
"MATCH (p:Person)-[:ATTENDED]->(m:Meeting) RETURN p.name, m.note_file, m.time"