Skip to content

Latest commit

 

History

History
193 lines (151 loc) · 5.46 KB

README.md

File metadata and controls

193 lines (151 loc) · 5.46 KB

SingularityNET Meeting Data Graph Database

Python Neo4j Made with Cursor License Maintenance

Overview

A graph-based system for analyzing meeting relationships, participant interactions, and decision flows.

This utility imports SingularityNET meeting data into a Neo4j Aura graph database, creating a queryable graph structure of meetings, participants, documents, action items, and metadata.

Chek out our Wiki for detailed documentation and queries.

Data Model Visualization

Graph Data Model

Figure 1: Graph model showing relationships between Meetings and related entities


Features

  • Meeting Data Import: Converts JSON meeting data into a graph structure
  • Graph Relationships: Creates connections between meetings, people, documents, and tasks
  • Environment Variable Configuration: Securely loads Neo4j credentials from .env
  • Error Handling: Comprehensive error logging for troubleshooting

Prerequisites

Before diving into the analysis, ensure you have the following prerequisites installed and configured:

  • Python 3.8 or later
  • Neo4j Aura database instance
  • Required Python packages:
    pip install neo4j python-dotenv

Setup

  1. Clone and Configure:

    git clone <repository-url>
    cd <repository-directory>
  2. Create .env File:

    NEO4J_URI=neo4j+s://<your-database-uri>
    NEO4J_USERNAME=neo4j
    NEO4J_PASSWORD=<your-password>
  3. Prepare Meeting Data: Place your meeting data in snet-data.json following this structure:

    {
        "meeting_id": [{
            "workgroup": "Governance Workgroup",
            "meetingInfo": {
                "name": "Weekly",
                "date": "2025-01-07",
                "host": "Host Name",
                "documenter": "Documenter Name",
                "peoplePresent": "Person1, Person2, Person3",
                "purpose": "Meeting Purpose",
                "workingDocs": [
                    {"title": "Doc Title", "link": "Doc URL"}
                ]
            },
            "agendaItems": [
                {
                    "status": "carry over",
                    "narrative": "Discussion narrative...",
                    "actionItems": [
                        {
                            "text": "Action Description",
                            "assignee": "Person Name",
                            "dueDate": "2025-01-14",
                            "status": "todo"
                        }
                    ],
                    "decisionItems": [
                        {
                            "decision": "Decision description",
                            "rationale": "Reasoning behind decision",
                            "opposing": "none",
                            "effect": "affectsOnlyThisWorkgroup"
                        }
                    ],
                    "discussionPoints": [
                        "Point 1",
                        "Point 2"
                    ]
                }
            ],
            "tags": {
                "topicsCovered": "Topic1, Topic2, Topic3",
                "emotions": "Productive, Collaborative"
            }
        }]
    }

Usage

Run the importer:

python neo.py

Example Queries

View all relationships:

MATCH (n)-[r]->(m)
RETURN n, r, m

Show meetings and participants:

MATCH (p:Person)-[:ATTENDED]->(m:Meeting)
RETURN m.workgroup, m.date, collect(p.name) as participants

View action items and assignees:

MATCH (m:Meeting)-[:HAS_ACTION]->(a:ActionItem)-[:ASSIGNED_TO]->(p:Person)
RETURN m.date, a.text, p.name, a.status, a.dueDate

View meeting structure:

MATCH (p:Person)-[:ATTENDED]->(m:Meeting)
RETURN m.workgroup, m.date, collect(p.name) as participants

View meeting agenda items and decisions:

MATCH (m:Meeting)-[:HAS_AGENDA_ITEM]->(a:AgendaItem)-[:MADE_DECISION]->(d:Decision)
RETURN m.date, a.status, d.decision, d.rationale

View meeting metadata:

MATCH (m:Meeting)-[:COVERS_TOPIC]->(t:Topic)
RETURN m.date, m.workgroup, collect(t.name) as topics

MATCH (m:Meeting)-[:HAS_EMOTION]->(e:Emotion)
RETURN m.date, m.workgroup, collect(e.name) as emotions

MATCH (m:Meeting)
OPTIONAL MATCH (m)-[:COVERS_TOPIC]->(t:Topic)
OPTIONAL MATCH (m)-[:HAS_EMOTION]->(e:Emotion)
RETURN m.date, m.workgroup, 
       collect(DISTINCT t.name) as topics,
       collect(DISTINCT e.name) as emotions

Files

  • neo.py: Database connection and data import logic
  • snet-data.json: Source meeting data
  • .env: Neo4j credentials (not tracked in git)
  • .gitignore: Git ignore rules

Notes

  • Ensure .env is in .gitignore to protect credentials
  • Meeting data should follow the specified JSON structure
  • Requires active Neo4j Aura instance

License

MIT License