Files
koios/docs/neo4j-unified-schema.md
Robert Helewka 7859264359 Add Neo4j schema initialization and validation scripts
- Introduced `neo4j-schema-init.py` for creating the foundational schema for the personal knowledge graph used by multiple AI assistants.
- Implemented functionality for creating constraints, indexes, and sample nodes, along with comprehensive testing of the schema.
- Added `neo4j-validate.py` to perform validation checks on the Neo4j knowledge graph, including constraints, indexes, sample nodes, relationships, and junk data detection.
- Enhanced logging for better traceability and debugging during schema initialization and validation processes.
2026-03-06 14:11:52 +00:00

1799 lines
44 KiB
Markdown

# Neo4j Unified Knowledge Graph Schema
> Canonical schema for the single shared graph database used by all AI assistants
---
version: 2.0.0
last_updated: 2025-02-16
replaces:
- prompts/personal/neo4j-schema.md (v1.0.0)
- prompts/work/neo4j-schema.md (v1.0.0)
---
## Overview
This document defines the canonical schema for **one shared Neo4j graph database** used by all AI assistants across three teams. The graph connects personal life, professional work, and engineering infrastructure in a single knowledge space.
### Design Principles
1. **One graph, many domains** — All assistants read from and write to the same database
2. **Domain ownership** — Each assistant owns specific node types and is the primary writer
3. **Universal read access** — Every assistant can read any node to build cross-domain context
4. **ID-based deduplication** — Always MERGE on `id`; always check before creating
5. **Temporal context** — All nodes carry `created_at` / `updated_at` timestamps
6. **Cross-domain relationships** — The graph's power comes from connecting life domains
### Teams & Assistants
| Team | Assistant | Domain | Graph Access |
|------|-----------|--------|--------------|
| **Personal** | Nate | Travel & Adventure | Read all, write own domain |
| **Personal** | Hypatia | Learning & Reading | Read all, write own domain |
| **Personal** | Marcus | Fitness & Training | Read all, write own domain |
| **Personal** | Seneca | Reflection & Wellness | Read all, write own domain |
| **Personal** | Bourdain | Food & Cooking | Read all, write own domain |
| **Personal** | Bowie | Arts & Culture | Read all, write own domain |
| **Personal** | Cousteau | Nature & Living Things | Read all, write own domain |
| **Personal** | Garth | Personal Finance | Read all, write own domain |
| **Personal** | Cristiano | Football | Read all, write own domain |
| **Work** | Alan | Strategy & Business Model | Read all, write all work nodes |
| **Work** | Ann | Marketing & Visibility | Read all, write all work nodes |
| **Work** | Jeffrey | Proposals & Sales | Read all, write all work nodes |
| **Work** | Jarvis | Daily Execution | Read all, write all work nodes |
| **Engineering** | Scotty | Infrastructure & Ops | Read all, write own domain |
| **Engineering** | Harper | Prototyping & Hacking | Read all, write own domain |
---
## Universal Node Types
These nodes are shared across all teams. Any assistant can create or update them.
### Person
People in the user's life — self, family, friends, colleagues, contacts.
```cypher
(:Person {
id: String!, // e.g., "user_main", "person_john_doe"
name: String!,
relationship: String, // self, friend, family, colleague, client_contact
domain: String, // personal, work, both
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
**Standard user node:**
```cypher
MERGE (p:Person {id: "user_main"})
SET p.name = "User",
p.relationship = "self",
p.domain = "both"
```
### Location
Physical places — shared across travel, training, dining, nature, work events.
```cypher
(:Location {
id: String!, // e.g., "location_tokyo_japan", "location_home_office"
name: String!,
type: String!, // city, country, landmark, restaurant, gym, trail, park, office, venue
country: String,
region: String,
coordinates: Point,
address: String,
domain: String, // personal, work, both
notes: String,
created_by: String, // which assistant created it
created_at: DateTime,
updated_at: DateTime
})
```
### Event
Significant occurrences spanning any domain.
```cypher
(:Event {
id: String!, // e.g., "event_birthday_2025", "event_ccw_2025"
name: String!,
date: Date!,
end_date: Date,
type: String, // celebration, milestone, conference, webinar, workshop, competition
domain: String, // personal, work, both
description: String,
location: String,
role: String, // attendee, speaker, panelist, host (for work events)
people: [String],
outcomes: String,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
### Topic
Subjects of interest — learning, writing, speaking, thinking.
```cypher
(:Topic {
id: String!, // e.g., "topic_stoicism", "topic_ai_in_cx"
name: String!,
category: String!, // philosophy, science, technology, strategy, operations, etc.
domain: String, // personal, work, both
description: String,
key_figures: [String],
key_works: [String],
key_messages: [String], // (work) core talking points
target_audience: [String], // (work) who cares about this
expertise_level: String, // learning, competent, expert
trending: Boolean,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
### Goal
Objectives and aspirations — life, fitness, career, financial.
```cypher
(:Goal {
id: String!, // e.g., "goal_mindfulness_2025", "goal_revenue_target_2025"
name: String!,
category: String!, // personal_growth, wellness, fitness, career, financial, relationship
domain: String, // personal, work, both
why: String,
status: String, // planning, in_progress, completed, paused, abandoned
progress: String,
milestones: [String],
deadline: Date,
values_aligned: [String],
created_at: DateTime,
updated_at: DateTime
})
```
---
## Personal Team — Domain Node Types
### Nate's Domain (Travel & Adventure)
#### Trip
```cypher
(:Trip {
id: String!, // e.g., "trip_costarica_2025"
name: String!,
status: String!, // planning, booked, in_progress, completed, cancelled
start_date: Date,
end_date: Date,
destinations: [String],
budget: Float,
currency: String,
purpose: String, // vacation, business, both
notes: String,
highlights: [String],
created_at: DateTime,
updated_at: DateTime
})
```
#### Destination
```cypher
(:Destination {
id: String!, // e.g., "destination_costa_rica"
name: String!,
country: String!,
region: String,
visited: Boolean,
visit_dates: [Date],
rating: Integer, // 1-5
want_to_return: Boolean,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Activity
```cypher
(:Activity {
id: String!, // e.g., "activity_volcano_hike_arenal"
name: String!,
type: String!, // adventure, cultural, food, nature, relaxation
location: String,
date: Date,
duration: Integer, // minutes
cost: Float,
rating: Integer,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
### Hypatia's Domain (Learning & Reading)
#### Book
```cypher
(:Book {
id: String!, // e.g., "book_meditations_aurelius"
title: String!,
author: String!,
status: String, // to_read, reading, completed, abandoned
start_date: Date,
end_date: Date,
rating: Integer, // 1-5
themes: [String],
notes: String,
quotes: [String],
created_at: DateTime,
updated_at: DateTime
})
```
#### Author
```cypher
(:Author {
id: String!, // e.g., "author_marcus_aurelius"
name: String!,
era: String,
nationality: String,
fields: [String],
notable_works: [String],
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### LearningPath
```cypher
(:LearningPath {
id: String!, // e.g., "path_stoicism_intro"
name: String!,
goal: String!,
topics: [String],
status: String, // planning, in_progress, completed
progress: String,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Concept
```cypher
(:Concept {
id: String!, // e.g., "concept_dichotomy_of_control"
name: String!,
definition: String,
origin: String,
related_concepts: [String],
source_works: [String],
created_at: DateTime,
updated_at: DateTime
})
```
#### Quote
```cypher
(:Quote {
id: String!, // e.g., "quote_obstacle_way_aurelius"
text: String!,
source: String!,
author: String,
context: String,
themes: [String],
personal_notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
### Marcus's Domain (Fitness & Training)
#### Training
```cypher
(:Training {
id: String!, // e.g., "training_2025-01-07_morning"
date: Date!,
type: String!, // strength, cardio, mobility, sport, mixed
duration: Integer, // minutes
exercises: [String],
volume: String, // low, moderate, high
intensity: String, // low, moderate, high
feeling: String,
location: String,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Exercise
```cypher
(:Exercise {
id: String!, // e.g., "exercise_barbell_squat"
name: String!,
category: String!, // compound, isolation, cardio, mobility, plyometric
equipment: [String],
target_muscles: [String],
technique_notes: String,
progression_notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Program
```cypher
(:Program {
id: String!, // e.g., "program_marathon_prep_2025"
name: String!,
goal: String!,
type: String, // strength, hypertrophy, endurance, sport_specific
duration_weeks: Integer,
days_per_week: Integer,
status: String, // planning, active, completed, paused
start_date: Date,
end_date: Date,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### PersonalRecord
```cypher
(:PersonalRecord {
id: String!, // e.g., "pr_squat_2025-01-07"
exercise: String!,
value: Float!,
unit: String!, // lbs, kg, seconds, meters, reps
date: Date!,
conditions: String,
previous_record: Float,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### BodyMetric
```cypher
(:BodyMetric {
id: String!, // e.g., "metric_weight_2025-01-07"
type: String!, // weight, bodyfat, chest, waist, etc.
value: Float!,
unit: String!,
date: Date!,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
### Seneca's Domain (Reflection & Wellness)
#### Reflection
```cypher
(:Reflection {
id: String!, // e.g., "reflection_2025-01-07"
date: Date!,
type: String!, // daily, weekly, monthly, event_triggered
content: String,
themes: [String],
mood: String,
gratitude: [String],
lessons: String,
questions: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Value
```cypher
(:Value {
id: String!, // e.g., "value_presence"
name: String!,
description: String,
priority: Integer, // 1-5
examples: [String],
challenges: [String],
created_at: DateTime,
updated_at: DateTime
})
```
#### Habit
```cypher
(:Habit {
id: String!, // e.g., "habit_morning_meditation"
name: String!,
frequency: String!, // daily, weekly, etc.
purpose: String,
status: String, // building, active, paused, dropped
streak: Integer,
triggers: [String],
obstacles: [String],
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### LifeEvent
```cypher
(:LifeEvent {
id: String!, // e.g., "event_promotion_2025"
name: String!,
date: Date!,
type: String, // milestone, transition, loss, achievement, relationship
impact: String,
lessons: String,
related_people: [String],
emotions: [String],
created_at: DateTime,
updated_at: DateTime
})
```
#### Intention
```cypher
(:Intention {
id: String!, // e.g., "intention_2025-01-07"
date: Date!,
content: String!,
fulfilled: Boolean,
reflection: String,
obstacles: String,
created_at: DateTime,
updated_at: DateTime
})
```
### Bourdain's Domain (Food & Cooking)
#### Recipe
```cypher
(:Recipe {
id: String!, // e.g., "recipe_carbonara_classic"
name: String!,
cuisine: String,
category: String, // main, appetizer, dessert, drink, etc.
ingredients: [String],
instructions: String,
prep_time: Integer, // minutes
cook_time: Integer,
servings: Integer,
difficulty: String, // easy, medium, hard
notes: String,
rating: Integer,
times_made: Integer,
created_at: DateTime,
updated_at: DateTime
})
```
#### Restaurant
```cypher
(:Restaurant {
id: String!, // e.g., "restaurant_jiro_tokyo"
name: String!,
cuisine: String,
location: String,
price_range: String, // $, $$, $$$, $$$$
visited: Boolean,
visit_dates: [Date],
rating: Integer,
favorite_dishes: [String],
notes: String,
recommended_by: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Ingredient
```cypher
(:Ingredient {
id: String!, // e.g., "ingredient_saffron"
name: String!,
category: String, // protein, vegetable, spice, dairy, etc.
season: [String],
notes: String,
substitutes: [String],
created_at: DateTime,
updated_at: DateTime
})
```
#### Meal
```cypher
(:Meal {
id: String!, // e.g., "meal_2025-01-07_dinner"
date: Date!,
type: String!, // breakfast, lunch, dinner, snack
dishes: [String],
location: String,
people: [String],
notes: String,
rating: Integer,
created_at: DateTime,
updated_at: DateTime
})
```
#### Technique
```cypher
(:Technique {
id: String!, // e.g., "technique_braising"
name: String!,
category: String, // cooking, prep, preservation
description: String,
tips: [String],
common_mistakes: [String],
mastery_level: String, // learning, comfortable, mastered
created_at: DateTime,
updated_at: DateTime
})
```
### Bowie's Domain (Arts & Culture)
#### Music
```cypher
(:Music {
id: String!, // e.g., "music_heroes_bowie"
title: String!,
artist: String!,
album: String,
year: Integer,
genre: [String],
mood: [String],
rating: Integer,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Film
```cypher
(:Film {
id: String!, // e.g., "film_blade_runner_2049"
title: String!,
director: String,
year: Integer,
genre: [String],
status: String, // to_watch, watched
watch_date: Date,
rating: Integer,
themes: [String],
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Artwork
```cypher
(:Artwork {
id: String!, // e.g., "artwork_starry_night_vangogh"
title: String!,
artist: String!,
year: Integer,
medium: String,
movement: String,
location: String, // museum/gallery
seen_in_person: Boolean,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Playlist
```cypher
(:Playlist {
id: String!, // e.g., "playlist_morning_focus"
name: String!,
purpose: String, // workout, focus, relaxation, travel, etc.
tracks: [String],
mood: [String],
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Artist
```cypher
(:Artist {
id: String!, // e.g., "artist_david_bowie"
name: String!,
type: String!, // musician, director, painter, etc.
active_period: String,
genres: [String],
notable_works: [String],
influences: [String],
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Style
```cypher
(:Style {
id: String!, // e.g., "style_minimalist_wardrobe"
name: String!,
category: String, // fashion, interior, aesthetic
description: String,
influences: [String],
key_pieces: [String],
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
### Cousteau's Domain (Nature & Living Things)
#### Species
```cypher
(:Species {
id: String!, // e.g., "species_clownfish"
name: String!,
scientific_name: String,
category: String!, // fish, coral, invertebrate, mammal, bird, reptile, plant
habitat: String,
care_level: String, // easy, moderate, difficult, expert
notes: String,
kept: Boolean,
observed_locations: [String],
created_at: DateTime,
updated_at: DateTime
})
```
#### Plant
```cypher
(:Plant {
id: String!, // e.g., "plant_monstera_living_room"
name: String!,
species: String,
location: String, // room or garden area
acquired_date: Date,
status: String, // thriving, stable, struggling, deceased
light_needs: String,
water_frequency: String,
last_watered: Date,
last_fertilized: Date,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Tank
```cypher
(:Tank {
id: String!, // e.g., "tank_reef_75gal"
name: String!,
type: String!, // freshwater, saltwater, reef, planted
size_gallons: Integer,
location: String,
setup_date: Date,
inhabitants: [String],
equipment: [String],
parameters: Map, // pH, temp, salinity, etc.
maintenance_schedule: String,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Garden
```cypher
(:Garden {
id: String!, // e.g., "garden_backyard_vegetables"
name: String!,
type: String!, // vegetable, flower, herb, mixed
location: String,
size: String,
plants: [String],
soil_type: String,
sun_exposure: String,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Ecosystem
```cypher
(:Ecosystem {
id: String!, // e.g., "ecosystem_costa_rica_cloud_forest"
name: String!,
type: String!, // forest, reef, desert, wetland, etc.
location: String,
key_species: [String],
visited: Boolean,
visit_dates: [Date],
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Observation
```cypher
(:Observation {
id: String!, // e.g., "observation_2025-01-07_hummingbird"
date: Date!,
species: String!,
location: String,
behavior: String,
conditions: String,
notes: String,
photos: Boolean,
created_at: DateTime,
updated_at: DateTime
})
```
### Garth's Domain (Personal Finance)
#### Account
```cypher
(:Account {
id: String!, // e.g., "account_tfsa_questrade"
name: String!,
type: String!, // TFSA, RRSP, RRIF, RESP, non_registered, cash
institution: String,
balance: Float,
contribution_room: Float,
opened_date: Date,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Investment
```cypher
(:Investment {
id: String!, // e.g., "investment_xeqt"
name: String!,
type: String!, // ETF, stock, bond, GIC, mutual_fund
ticker: String,
allocation_percent: Float,
mer: Float,
book_value: Float,
market_value: Float,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Asset
```cypher
(:Asset {
id: String!, // e.g., "asset_home_main"
name: String!,
type: String!, // real_estate, vehicle, other
value: Float,
purchase_price: Float,
purchase_date: Date,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Liability
```cypher
(:Liability {
id: String!, // e.g., "liability_mortgage_main"
name: String!,
type: String!, // mortgage, heloc, credit_card, loan, line_of_credit
balance: Float,
interest_rate: Float,
payment: Float,
maturity_date: Date,
secured_by: String,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Budget
```cypher
(:Budget {
id: String!, // e.g., "budget_2025_monthly"
period: String!, // monthly, quarterly, annual
income: Float,
expenses: Float,
savings_rate: Float,
categories: Map, // {housing: 2000, food: 600, ...}
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### FinancialGoal
```cypher
(:FinancialGoal {
id: String!, // e.g., "fgoal_retirement_2045"
name: String!,
target_amount: Float,
deadline: Date,
current_progress: Float,
strategy: String,
priority: String, // critical, high, medium, low
status: String, // planning, in_progress, completed, paused
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
---
### Cristiano's Domain (Football)
#### Match
```cypher
(:Match {
id: String!, // e.g., "match_arsenal_city_2025-02-15"
date: Date!,
home_team: String!,
away_team: String!,
competition: String, // "Premier League", "Champions League", etc.
stage: String, // "Group Stage", "Quarter-Final", "Matchday 25"
score: String, // "2-1"
venue: String,
watched: Boolean,
key_moments: [String],
tactical_notes: String,
man_of_the_match: String,
rating: Integer, // 1-5
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Team
```cypher
(:Team {
id: String!, // e.g., "team_arsenal", "team_real_madrid"
name: String!,
league: String,
country: String,
manager: String,
formation: String, // "4-3-3", "3-5-2"
style: String, // "Positional play, inverted fullbacks, high press"
followed: Boolean,
stadium: String,
founded: Integer,
season_status: String,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### League
```cypher
(:League {
id: String!, // e.g., "league_premier_league", "league_la_liga"
name: String!,
country: String,
tier: Integer, // 1 = top flight
season: String, // "2025-26"
current_leader: String,
following: Boolean,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Tournament
```cypher
(:Tournament {
id: String!, // e.g., "tournament_ucl_2025-26", "tournament_wc_2026"
name: String!,
type: String, // "club", "international"
year: Integer,
stage: String, // current stage of tournament
host: String,
current_holder: String,
following: Boolean,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Player
```cypher
(:Player {
id: String!, // e.g., "player_bellingham_jude"
name: String!,
team: String,
nationality: String,
position: String, // "CM", "RW", "ST", "CB", "GK"
age: Integer,
style: String,
strengths: [String],
weaknesses: [String],
market_value: String,
favorite: Boolean,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Season
```cypher
(:Season {
id: String!, // e.g., "season_arsenal_2025-26"
team: String!,
season_year: String!, // "2025-26"
league_position: Integer,
champions_league: String,
domestic_cup: String,
top_scorer: String,
key_signings: [String],
key_departures: [String],
manager: String,
assessment: String,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
---
## Work Team — Domain Node Types
### Business Nodes
#### Client
```cypher
(:Client {
id: String!, // e.g., "client_acme_corp"
name: String!,
industry: String,
size: String, // startup, smb, mid-market, enterprise
status: String!, // prospect, active, past, dormant
relationship_start: Date,
primary_contact: String,
account_value: String, // low, medium, high, strategic
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Contact
```cypher
(:Contact {
id: String!, // e.g., "contact_john_smith_acme"
name: String!,
title: String,
company: String,
email: String,
phone: String,
linkedin: String,
relationship_strength: String, // new, developing, strong, champion
last_contact: Date,
notes: String,
tags: [String], // decision_maker, influencer, technical, executive
created_at: DateTime,
updated_at: DateTime
})
```
#### Opportunity
```cypher
(:Opportunity {
id: String!, // e.g., "opp_acme_cx_transformation_2025"
name: String!,
client: String!,
status: String!, // identified, qualifying, proposing, negotiating, won, lost
value: Float,
currency: String,
probability: Integer, // 0-100
expected_close: Date,
type: String, // project, retainer, managed_services, advisory
description: String,
next_action: String,
competitors: [String],
win_themes: [String],
loss_reasons: [String],
created_at: DateTime,
updated_at: DateTime
})
```
#### Proposal
```cypher
(:Proposal {
id: String!, // e.g., "proposal_acme_cx_2025-01"
name: String!,
client: String!,
opportunity: String,
status: String!, // drafting, submitted, presented, won, lost, withdrawn
submitted_date: Date,
decision_date: Date,
value: Float,
currency: String,
type: String, // project, retainer, managed_services
executive_summary: String,
key_differentiators: [String],
pricing_approach: String,
outcome_notes: String,
lessons_learned: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Project
```cypher
(:Project {
id: String!, // e.g., "project_acme_cx_implementation"
name: String!,
client: String!,
status: String!, // planning, active, on_hold, completed, cancelled
type: String, // assessment, strategy, implementation, managed_services
start_date: Date,
end_date: Date,
value: Float,
description: String,
outcomes: [String],
lessons_learned: String,
referenceable: Boolean,
satisfaction_score: Integer,
created_at: DateTime,
updated_at: DateTime
})
```
### Market Intelligence Nodes
#### Vendor
```cypher
(:Vendor {
id: String!, // e.g., "vendor_genesys"
name: String!,
category: String!, // ccaas, wfm, qa, virtual_agent, crm, analytics
tier: String, // leader, challenger, niche
relationship: String, // partner, familiar, competitor_aligned
strengths: [String],
weaknesses: [String],
ideal_for: [String],
certifications_held: [String],
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Competitor
```cypher
(:Competitor {
id: String!, // e.g., "competitor_big_consulting"
name: String!,
type: String, // global_si, boutique, vendor_services, freelance
strengths: [String],
weaknesses: [String],
typical_clients: [String],
pricing_approach: String,
differentiation: String,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### MarketTrend
```cypher
(:MarketTrend {
id: String!, // e.g., "trend_ai_agents_2025"
name: String!,
category: String, // technology, buyer_behavior, regulation, workforce
status: String, // emerging, growing, mature, declining
impact: String, // high, medium, low
timeframe: String, // immediate, near_term, long_term
description: String,
implications: [String],
opportunities: [String],
sources: [String],
created_at: DateTime,
updated_at: DateTime
})
```
#### Technology
```cypher
(:Technology {
id: String!, // e.g., "tech_conversational_ai"
name: String!,
category: String!, // platform, capability, integration, methodology
maturity: String, // emerging, established, commoditized
vendors: [String],
use_cases: [String],
expertise_level: String,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
### Content & Visibility Nodes
#### Content
```cypher
(:Content {
id: String!, // e.g., "content_ai_cx_article_2025-01"
title: String!,
type: String!, // article, blog_post, linkedin_post, whitepaper, talk, webinar, podcast
status: String!, // idea, drafting, review, published, archived
topic: String,
publication: String,
published_date: Date,
url: String,
abstract: String,
key_points: [String],
performance: String,
repurpose_ideas: [String],
created_at: DateTime,
updated_at: DateTime
})
```
#### Publication
```cypher
(:Publication {
id: String!, // e.g., "pub_linkedin"
name: String!,
type: String, // social, blog, industry_pub, conference, podcast
audience: String,
reach: String,
submission_process: String,
contacts: [String],
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
### Professional Development Nodes
#### Skill
```cypher
(:Skill {
id: String!, // e.g., "skill_conversational_ai_design"
name: String!,
category: String!, // technical, consulting, leadership, industry
level: String!, // learning, competent, proficient, expert
evidence: [String],
development_plan: String,
priority: String, // active, maintenance, future
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Certification
```cypher
(:Certification {
id: String!, // e.g., "cert_aws_solutions_architect"
name: String!,
issuer: String!,
status: String!, // pursuing, active, expired, planned
earned_date: Date,
expiry_date: Date,
renewal_requirements: String,
value_proposition: String,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Relationship
Professional network beyond clients.
```cypher
(:Relationship {
id: String!, // e.g., "rel_analyst_jane_doe"
name: String!,
type: String!, // analyst, journalist, peer, mentor, mentee, partner
organization: String,
context: String,
strength: String, // new, developing, strong
last_contact: Date,
value_exchange: String,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
### Daily Operations Nodes
#### Task
```cypher
(:Task {
id: String!, // e.g., "task_2025-01-08_proposal_draft"
title: String!,
status: String!, // pending, in_progress, completed, deferred, cancelled
priority: String, // urgent, high, medium, low
due_date: Date,
context: String, // client, opportunity, content, admin
related_to: String,
description: String,
completed_date: Date,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Meeting
```cypher
(:Meeting {
id: String!, // e.g., "meeting_2025-01-08_acme_discovery"
title: String!,
date: Date!,
time: String,
duration: Integer, // minutes
type: String, // discovery, presentation, negotiation, check_in, internal
attendees: [String],
client: String,
opportunity: String,
agenda: String,
notes: String,
outcomes: [String],
follow_ups: [String],
created_at: DateTime,
updated_at: DateTime
})
```
#### Note
```cypher
(:Note {
id: String!, // e.g., "note_2025-01-08_market_observation"
date: Date!,
type: String, // observation, idea, insight, concern, opportunity
content: String!,
context: String,
related_to: [String],
action_required: Boolean,
tags: [String],
created_at: DateTime,
updated_at: DateTime
})
```
#### Decision
```cypher
(:Decision {
id: String!, // e.g., "decision_2025-01-08_pricing_model"
date: Date!,
title: String!,
context: String,
options_considered: [String],
decision: String!,
rationale: String,
outcome: String,
lessons: String,
reversible: Boolean,
created_at: DateTime,
updated_at: DateTime
})
```
---
## Engineering Team — Domain Node Types
### Scotty's Domain (Infrastructure & Ops)
#### Infrastructure
```cypher
(:Infrastructure {
id: String!, // e.g., "infra_neo4j_prod", "infra_haproxy_main"
name: String!,
type: String!, // server, container, service, network, database, loadbalancer
host: String,
status: String, // running, stopped, degraded, planned
environment: String, // production, staging, development
config_notes: String,
documentation: String,
last_checked: DateTime,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Incident
```cypher
(:Incident {
id: String!, // e.g., "incident_2025-02-15_neo4j_oom"
title: String!,
date: DateTime!,
severity: String!, // critical, high, medium, low
status: String!, // active, investigating, resolved, post_mortem
affected_services: [String],
root_cause: String,
resolution: String,
duration_minutes: Integer,
lessons_learned: String,
prevention: String,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
### Harper's Domain (Prototyping & Experiments)
#### Prototype
```cypher
(:Prototype {
id: String!, // e.g., "proto_slack_neo4j_bridge"
name: String!,
description: String,
status: String!, // idea, building, working, abandoned, promoted
tech_stack: [String],
repo_url: String,
demo_url: String,
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
#### Experiment
```cypher
(:Experiment {
id: String!, // e.g., "exp_llm_graph_query_2025-02"
name: String!,
hypothesis: String,
approach: String,
outcome: String, // success, partial, failure, inconclusive
learnings: String,
tech_used: [String],
notes: String,
created_at: DateTime,
updated_at: DateTime
})
```
---
## Relationship Types
### Universal Relationships
```cypher
// Ownership / Creation
(Person)-[:OWNS]->(Tank|Garden|Plant|Account|Asset)
(Person)-[:CREATED]->(Recipe|Playlist|Prototype)
(Person)-[:WROTE]->(Reflection|Content)
(Person)-[:OWES]->(Liability)
// Completion / Progress
(Person)-[:COMPLETED]->(Book|Film|Training|Trip|Project)
(Person)-[:READING|WATCHING|PLANNING]->(Book|Film|Trip)
(Person)-[:PURSUING]->(Goal|FinancialGoal)
(Person)-[:PRACTICING]->(Habit)
// Preferences
(Person)-[:INTERESTED_IN]->(Topic|Species)
(Person)-[:HOLDS]->(Value)
(Person)-[:FAVORITES]->(Recipe|Restaurant|Music|Film)
```
### Personal Cross-Domain Relationships
```cypher
// Location connections
(Trip)-[:VISITS]->(Destination)
(Trip)-[:INCLUDES]->(Activity)
(Activity|Training|Meal|Observation)-[:AT_LOCATION]->(Location)
(Restaurant)-[:LOCATED_IN]->(Location)
(LifeEvent)-[:OCCURRED_AT]->(Location)
// Preparation and support
(Training)-[:PREPARATION_FOR]->(Trip)
(Book)-[:PREPARATION_FOR]->(Trip)
(Recipe)-[:FUELS]->(Training)
(Training)-[:SUPPORTS]->(Goal)
(Habit)-[:SUPPORTS]->(Goal)
(Book)-[:INFORMS]->(Goal)
// Inspiration and influence
(Book)-[:INSPIRED]->(Reflection|Goal)
(Music|Film)-[:EVOKED]->(Reflection)
(Trip)-[:INSPIRED]->(Goal|Reflection)
(Author)-[:INFLUENCED_BY]->(Author)
(Artist)-[:INFLUENCED_BY]->(Artist)
// Content relationships
(Book)-[:WRITTEN_BY]->(Author)
(Book)-[:EXPLORES]->(Topic)
(Book)-[:CONTAINS]->(Quote)
(Book)-[:ADAPTED_TO]->(Film)
(Music)-[:BY_ARTIST]->(Artist)
(Film)-[:DIRECTED_BY]->(Artist)
(Recipe)-[:USES]->(Ingredient)
(Recipe)-[:REQUIRES]->(Technique)
// Nature connections
(Tank|Garden)-[:HOUSES]->(Species|Plant)
(Species)-[:OBSERVED_AT]->(Location)
(Trip)-[:WILDLIFE_HIGHLIGHT]->(Species)
(Ecosystem)-[:CONTAINS]->(Species)
// Financial connections
(Account)-[:HOLDS]->(Investment)
(Liability)-[:SECURED_BY]->(Asset)
(FinancialGoal)-[:SUPPORTS]->(Goal)
(FinancialGoal)-[:FUNDS]->(Trip)
(Budget)-[:ALLOCATED_FOR]->(Trip)
(FinancialGoal)-[:ALIGNED_WITH]->(Value)
(Book)-[:INFORMS]->(Investment)
// Temporal / Sequential
(Exercise)-[:PROGRESSION_FROM]->(Exercise)
(PersonalRecord)-[:IMPROVES_ON]->(PersonalRecord)
(Style)-[:EVOLVED_FROM]->(Style)
(Goal)-[:LED_TO]->(Goal)
(LifeEvent)-[:LED_TO]->(Goal|Reflection)
```
### Work Cross-Domain Relationships
```cypher
// Client relationships
(Contact)-[:WORKS_AT]->(Client)
(Contact)-[:DECISION_MAKER_FOR]->(Opportunity)
(Opportunity)-[:FOR_CLIENT]->(Client)
(Proposal)-[:FOR_CLIENT]->(Client)
(Proposal)-[:ADDRESSES]->(Opportunity)
(Project)-[:FOR_CLIENT]->(Client)
(Project)-[:WON_FROM]->(Proposal)
// Sales process
(Opportunity)-[:COMPETES_WITH]->(Competitor)
(Opportunity)-[:INVOLVES]->(Technology)
(Proposal)-[:DIFFERENTIATES_AGAINST]->(Competitor)
(Proposal)-[:PROPOSES]->(Technology)
(Meeting)-[:ABOUT]->(Opportunity)
(Task)-[:SUPPORTS]->(Opportunity)
// Market intelligence
(Vendor)-[:PROVIDES]->(Technology)
(Competitor)-[:PARTNERS_WITH]->(Vendor)
(MarketTrend)-[:AFFECTS]->(Technology)
(MarketTrend)-[:CREATES]->(Opportunity)
(Client)-[:USES]->(Vendor)
// Content & visibility
(Content)-[:ABOUT]->(Topic)
(Content)-[:PUBLISHED_IN]->(Publication)
(Content)-[:PRESENTED_AT]->(Event)
(Topic)-[:RELATES_TO]->(Technology)
(Topic)-[:ADDRESSES]->(MarketTrend)
// Professional development
(Skill)-[:DEMONSTRATED_IN]->(Project)
(Skill)-[:VALIDATED_BY]->(Certification)
(Certification)-[:ISSUED_BY]->(Vendor)
(Relationship)-[:MET_AT]->(Event)
// Daily operations
(Task)-[:RELATED_TO]->(Client|Opportunity|Proposal|Content)
(Meeting)-[:WITH]->(Contact)
(Meeting)-[:ABOUT]->(Opportunity|Project)
(Note)-[:ABOUT]->(Client|Opportunity|MarketTrend)
(Decision)-[:AFFECTS]->(Opportunity|Project)
```
### Cross-Team Relationships (Personal ↔ Work ↔ Engineering)
```cypher
// Travel for work
(Trip)-[:FOR_EVENT]->(Event)
(Trip)-[:FOR_CLIENT]->(Client)
(Restaurant)-[:VISITED_WITH]->(Contact)
// Learning supporting work
(Book)-[:INFORMS]->(Content)
(Book)-[:DEVELOPS]->(Skill)
(LearningPath)-[:TARGETS]->(Skill)
(Concept)-[:APPLIED_IN]->(Project)
// Reflection on work
(Reflection)-[:ABOUT]->(Project|Meeting|Decision)
(LifeEvent)-[:CAREER_IMPACT]->(Opportunity|Project)
// Culture and work
(Playlist)-[:CREATED_FOR]->(Task)
(Film)-[:DISCUSSED_WITH]->(Contact)
// Finance and work
(Project)-[:GENERATES_REVENUE]->(Account)
(Opportunity)-[:PROJECTED_VALUE]->(FinancialGoal)
// Engineering supporting everything
(Infrastructure)-[:HOSTS]->(Project|Prototype)
(Incident)-[:AFFECTED]->(Infrastructure)
(Prototype)-[:DEMONSTRATES]->(Technology)
(Prototype)-[:SUPPORTS]->(Opportunity)
(Experiment)-[:TESTED]->(Technology)
(Experiment)-[:INFORMED_BY]->(Book|Concept)
// Fitness and work
(Training)-[:BUILDS]->(Skill) // discipline, resilience
(Habit)-[:SUPPORTS]->(Goal) // career goals too
```
---
## ID Naming Conventions
Use lowercase with underscores:
```
{type}_{identifier}_{qualifier}
```
### Examples by Team
**Personal:**
- `person_john_doe`
- `book_meditations_aurelius`
- `trip_costarica_2025`
- `training_2025-01-07_morning`
- `recipe_carbonara_classic`
- `species_clownfish`
- `reflection_2025-01-07`
- `account_tfsa_questrade`
- `investment_xeqt`
**Work:**
- `client_acme_corp`
- `contact_john_smith_acme`
- `opp_acme_cx_transformation_2025`
- `proposal_acme_cx_2025-01`
- `project_acme_implementation`
- `content_ai_cx_article_2025-01`
- `task_2025-01-08_proposal_draft`
**Engineering:**
- `infra_neo4j_prod`
- `incident_2025-02-15_neo4j_oom`
- `proto_slack_neo4j_bridge`
- `exp_llm_graph_query_2025-02`
### Date-based IDs
Use ISO format: `YYYY-MM-DD`
### Qualifiers
Add when needed for uniqueness:
- Time of day: `_morning`, `_evening`
- Year: `_2025`
- Location: `_tokyo`, `_home`
- Company: `_acme`
- Type: `_discovery`, `_proposal`
- Variant: `_v2`, `_spicy`
---
## Query Best Practices
### Always Check Before Creating
```cypher
MATCH (b:Book {title: "Meditations", author: "Marcus Aurelius"})
RETURN b
// Use MERGE for idempotent creation
MERGE (b:Book {id: "book_meditations_aurelius"})
SET b.title = "Meditations",
b.author = "Marcus Aurelius",
b.updated_at = datetime()
ON CREATE SET b.created_at = datetime()
```
### Use OPTIONAL MATCH for Graceful Handling
```cypher
MATCH (p:Person {id: "user_main"})
OPTIONAL MATCH (p)-[:PLANNING]->(t:Trip)
WHERE t.start_date > date()
RETURN p, collect(t) as upcoming_trips
```
### Always Set Timestamps
```cypher
MERGE (n:Node {id: "..."})
SET n.property = value,
n.updated_at = datetime()
ON CREATE SET n.created_at = datetime()
```
### Batch Related Operations
```cypher
MERGE (t:Training {id: "training_2025-01-07_morning"})
SET t.date = date("2025-01-07"),
t.type = "strength",
t.updated_at = datetime()
WITH t
MATCH (p:Person {id: "user_main"})
MERGE (p)-[:COMPLETED]->(t)
WITH t
MATCH (trip:Trip {id: "trip_costarica_2025"})
MERGE (t)-[:PREPARATION_FOR]->(trip)
```
### Cross-Team Discovery Queries
```cypher
// Find connections between a trip and work
MATCH (trip:Trip {id: "trip_lisbon_2025"})
OPTIONAL MATCH (trip)-[:FOR_EVENT]->(e:Event)
OPTIONAL MATCH (trip)-[:FOR_CLIENT]->(c:Client)
OPTIONAL MATCH (trip)-[:VISITS]->(d:Destination)
RETURN trip, e, c, d
// Find all nodes related to a topic across domains
MATCH (t:Topic {id: "topic_ai_in_cx"})
OPTIONAL MATCH (b:Book)-[:EXPLORES]->(t)
OPTIONAL MATCH (c:Content)-[:ABOUT]->(t)
OPTIONAL MATCH (e:Event)-[:COVERS]->(t)
RETURN t, collect(b) as books, collect(c) as content, collect(e) as events
```
---
## MCP Integration
### Neo4j Queries
All assistants execute Cypher queries via the Neo4j MCP server:
```
Tool: neo4j_query (or as configured in MCP setup)
```
**Execution pattern:**
1. Construct the Cypher query
2. Execute via MCP tool
3. Parse the response
4. Handle errors gracefully
5. Never expose raw errors to user
### Athena Integration (Work Team)
Alan, Jeffrey, and Jarvis have additional access to Athena for client relationship management:
- Client history and interaction timeline
- Contact intelligence and relationship mapping
- Proposal history and win/loss analysis
- Relationship health indicators
### Error Handling
If queries fail:
1. Acknowledge naturally in conversation
2. Continue helping with available context
3. Suggest checking MCP server connection if persistent
4. Never show raw errors or stack traces
---
## Node Type Summary
| # | Node Type | Domain | Primary Owner | Constraint Field |
|---|-----------|--------|---------------|-----------------|
| 1 | Person | Universal | Any | id |
| 2 | Location | Universal | Any | id |
| 3 | Event | Universal | Any | id |
| 4 | Topic | Universal | Hypatia / Ann | id |
| 5 | Goal | Universal | Seneca | id |
| 6 | Trip | Personal | Nate | id |
| 7 | Destination | Personal | Nate | id |
| 8 | Activity | Personal | Nate | id |
| 9 | Book | Personal | Hypatia | id |
| 10 | Author | Personal | Hypatia | id |
| 11 | LearningPath | Personal | Hypatia | id |
| 12 | Concept | Personal | Hypatia | id |
| 13 | Quote | Personal | Hypatia | id |
| 14 | Training | Personal | Marcus | id |
| 15 | Exercise | Personal | Marcus | id |
| 16 | Program | Personal | Marcus | id |
| 17 | PersonalRecord | Personal | Marcus | id |
| 18 | BodyMetric | Personal | Marcus | id |
| 19 | Reflection | Personal | Seneca | id |
| 20 | Value | Personal | Seneca | id |
| 21 | Habit | Personal | Seneca | id |
| 22 | LifeEvent | Personal | Seneca | id |
| 23 | Intention | Personal | Seneca | id |
| 24 | Recipe | Personal | Bourdain | id |
| 25 | Restaurant | Personal | Bourdain | id |
| 26 | Ingredient | Personal | Bourdain | id |
| 27 | Meal | Personal | Bourdain | id |
| 28 | Technique | Personal | Bourdain | id |
| 29 | Music | Personal | Bowie | id |
| 30 | Film | Personal | Bowie | id |
| 31 | Artwork | Personal | Bowie | id |
| 32 | Playlist | Personal | Bowie | id |
| 33 | Artist | Personal | Bowie | id |
| 34 | Style | Personal | Bowie | id |
| 35 | Species | Personal | Cousteau | id |
| 36 | Plant | Personal | Cousteau | id |
| 37 | Tank | Personal | Cousteau | id |
| 38 | Garden | Personal | Cousteau | id |
| 39 | Ecosystem | Personal | Cousteau | id |
| 40 | Observation | Personal | Cousteau | id |
| 41 | Account | Personal | Garth | id |
| 42 | Investment | Personal | Garth | id |
| 43 | Asset | Personal | Garth | id |
| 44 | Liability | Personal | Garth | id |
| 45 | Budget | Personal | Garth | id |
| 46 | FinancialGoal | Personal | Garth | id |
| 47 | Match | Personal | Cristiano | id |
| 48 | Team | Personal | Cristiano | id |
| 49 | League | Personal | Cristiano | id |
| 50 | Tournament | Personal | Cristiano | id |
| 51 | Player | Personal | Cristiano | id |
| 52 | Season | Personal | Cristiano | id |
| 53 | Client | Work | Alan / All | id |
| 54 | Contact | Work | Jeffrey / All | id |
| 55 | Opportunity | Work | Jeffrey / All | id |
| 56 | Proposal | Work | Jeffrey / All | id |
| 57 | Project | Work | Jarvis / All | id |
| 58 | Vendor | Work | Alan / All | id |
| 59 | Competitor | Work | Alan / All | id |
| 60 | MarketTrend | Work | Alan / All | id |
| 61 | Technology | Work | Alan / All | id |
| 62 | Content | Work | Ann / All | id |
| 63 | Publication | Work | Ann / All | id |
| 64 | Skill | Work | Any work | id |
| 65 | Certification | Work | Any work | id |
| 66 | Relationship | Work | Any work | id |
| 67 | Task | Work | Jarvis / All | id |
| 68 | Meeting | Work | Jarvis / All | id |
| 69 | Note | Work | Jarvis / All | id |
| 70 | Decision | Work | Alan / Jarvis | id |
| 71 | Infrastructure | Engineering | Scotty | id |
| 72 | Incident | Engineering | Scotty | id |
| 73 | Prototype | Engineering | Harper | id |
| 74 | Experiment | Engineering | Harper | id |
---
## Version History
| Version | Date | Changes |
|---------|------|---------|
| 1.0.0 | 2025-01-07 | Initial personal schema |
| 1.0.0-work | 2025-01-08 | Initial work schema |
| 2.0.0 | 2025-02-16 | Unified schema: merged personal + work, added Garth (finance), added engineering nodes (Scotty/Harper), added cross-team relationships, promoted Topic/Goal/Event to universal, added domain property for disambiguation |
| 2.1.0 | 2026-02-16 | Added Cristiano (Football): Match, Team, League, Tournament, Player, Season (6 node types). Total: 74 nodes, 15 assistants |