Skip to main content
Glama
orneryd

M.I.M.I.R - Multi-agent Intelligent Memory & Insight Repository

by orneryd
nornicdb-vs-neo4j.bench.ts24.7 kB
/** * NornicDB vs Neo4j Benchmark Suite * * Compares performance between: * - NornicDB (drop-in replacement): bolt://localhost:7687 * - Neo4j: bolt://localhost:7687 (or configured via NEO4J_URI) * * Uses the Neo4j Movies example dataset for realistic benchmarks. * * Run with: npm run bench:compare-dbs * * Configuration (environment variables): * NORNICDB_URI=bolt://localhost:7687 * NORNICDB_USER=neo4j * NORNICDB_PASSWORD=password * * NEO4J_URI=bolt://localhost:7687 * NEO4J_USER=neo4j * NEO4J_PASSWORD=neo4j */ import { describe, bench, beforeAll, afterAll } from 'vitest'; import neo4j, { Driver, Session } from 'neo4j-driver'; // ============================================================================ // CONFIGURATION // ============================================================================ // NornicDB (your drop-in replacement) const NORNICDB_URI = process.env.NORNICDB_URI || 'bolt://localhost:7687'; const NORNICDB_USER = process.env.NORNICDB_USER || 'admin'; const NORNICDB_PASSWORD = process.env.NORNICDB_PASSWORD || 'admin'; // Neo4j (original for comparison) const NEO4J_URI = process.env.NEO4J_URI || 'bolt://localhost:7688'; const NEO4J_USER = process.env.NEO4J_USER || 'neo4j'; const NEO4J_PASSWORD = process.env.NEO4J_PASSWORD || 'password'; // ============================================================================ // DATABASE CONNECTIONS // ============================================================================ let nornicdbDriver: Driver; let nornicdbSession: Session; let neo4jDriver: Driver; let neo4jSession: Session; // ============================================================================ // MOVIES DATASET (Neo4j Example Data - simplified for loading) // ============================================================================ async function loadMoviesDataset(session: Session): Promise<void> { // Clear existing data await session.run('MATCH (n) DETACH DELETE n'); // Create Movies await session.run(` CREATE (m1:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'}) CREATE (m2:Movie {title:'The Matrix Reloaded', released:2003, tagline:'Free your mind'}) CREATE (m3:Movie {title:'The Matrix Revolutions', released:2003, tagline:'Everything that has a beginning has an end'}) CREATE (m4:Movie {title:"The Devil's Advocate", released:1997, tagline:'Evil has its winning ways'}) CREATE (m5:Movie {title:"A Few Good Men", released:1992, tagline:"In the heart of the nation's capital"}) CREATE (m6:Movie {title:"Top Gun", released:1986, tagline:'I feel the need, the need for speed.'}) CREATE (m7:Movie {title:'Jerry Maguire', released:2000, tagline:'The rest of his life begins now.'}) CREATE (m8:Movie {title:"Stand By Me", released:1986, tagline:"For some, it's the last real taste of innocence"}) CREATE (m9:Movie {title:'As Good as It Gets', released:1997, tagline:'A comedy from the heart'}) CREATE (m10:Movie {title:'What Dreams May Come', released:1998, tagline:'After life there is more'}) CREATE (m11:Movie {title:'Snow Falling on Cedars', released:1999, tagline:'First loves last. Forever.'}) CREATE (m12:Movie {title:"You've Got Mail", released:1998, tagline:'At odds in life... in love on-line.'}) CREATE (m13:Movie {title:'Sleepless in Seattle', released:1993, tagline:'What if someone you never met'}) CREATE (m14:Movie {title:'Joe Versus the Volcano', released:1990, tagline:'A story of love, lava'}) CREATE (m15:Movie {title:'When Harry Met Sally', released:1998, tagline:'Can two friends sleep together'}) CREATE (m16:Movie {title:'Cloud Atlas', released:2012, tagline:'Everything is connected'}) CREATE (m17:Movie {title:'The Da Vinci Code', released:2006, tagline:'Break The Codes'}) CREATE (m18:Movie {title:'V for Vendetta', released:2006, tagline:'Freedom! Forever!'}) CREATE (m19:Movie {title:'Speed Racer', released:2008, tagline:'Speed has no limits'}) CREATE (m20:Movie {title:'The Green Mile', released:1999, tagline:"Walk a mile you'll never forget."}) `); // Create People await session.run(` CREATE (p1:Person {name:'Keanu Reeves', born:1964}) CREATE (p2:Person {name:'Carrie-Anne Moss', born:1967}) CREATE (p3:Person {name:'Laurence Fishburne', born:1961}) CREATE (p4:Person {name:'Hugo Weaving', born:1960}) CREATE (p5:Person {name:'Lilly Wachowski', born:1967}) CREATE (p6:Person {name:'Lana Wachowski', born:1965}) CREATE (p7:Person {name:'Joel Silver', born:1952}) CREATE (p8:Person {name:'Tom Hanks', born:1956}) CREATE (p9:Person {name:'Tom Cruise', born:1962}) CREATE (p10:Person {name:'Jack Nicholson', born:1937}) CREATE (p11:Person {name:'Demi Moore', born:1962}) CREATE (p12:Person {name:'Kevin Bacon', born:1958}) CREATE (p13:Person {name:'Cuba Gooding Jr.', born:1968}) CREATE (p14:Person {name:'Renee Zellweger', born:1969}) CREATE (p15:Person {name:'Meg Ryan', born:1961}) CREATE (p16:Person {name:'Billy Crystal', born:1948}) CREATE (p17:Person {name:'Robin Williams', born:1951}) CREATE (p18:Person {name:'Natalie Portman', born:1981}) CREATE (p19:Person {name:'Halle Berry', born:1966}) CREATE (p20:Person {name:'Michael Clarke Duncan', born:1957}) `); // Create ACTED_IN relationships await session.run(` MATCH (keanu:Person {name:'Keanu Reeves'}), (matrix:Movie {title:'The Matrix'}) CREATE (keanu)-[:ACTED_IN {roles:['Neo']}]->(matrix) `); await session.run(` MATCH (carrie:Person {name:'Carrie-Anne Moss'}), (matrix:Movie {title:'The Matrix'}) CREATE (carrie)-[:ACTED_IN {roles:['Trinity']}]->(matrix) `); await session.run(` MATCH (laurence:Person {name:'Laurence Fishburne'}), (matrix:Movie {title:'The Matrix'}) CREATE (laurence)-[:ACTED_IN {roles:['Morpheus']}]->(matrix) `); await session.run(` MATCH (hugo:Person {name:'Hugo Weaving'}), (matrix:Movie {title:'The Matrix'}) CREATE (hugo)-[:ACTED_IN {roles:['Agent Smith']}]->(matrix) `); // More ACTED_IN for Matrix sequels await session.run(` MATCH (keanu:Person {name:'Keanu Reeves'}), (m:Movie {title:'The Matrix Reloaded'}) CREATE (keanu)-[:ACTED_IN {roles:['Neo']}]->(m) `); await session.run(` MATCH (keanu:Person {name:'Keanu Reeves'}), (m:Movie {title:'The Matrix Revolutions'}) CREATE (keanu)-[:ACTED_IN {roles:['Neo']}]->(m) `); await session.run(` MATCH (carrie:Person {name:'Carrie-Anne Moss'}), (m:Movie {title:'The Matrix Reloaded'}) CREATE (carrie)-[:ACTED_IN {roles:['Trinity']}]->(m) `); await session.run(` MATCH (carrie:Person {name:'Carrie-Anne Moss'}), (m:Movie {title:'The Matrix Revolutions'}) CREATE (carrie)-[:ACTED_IN {roles:['Trinity']}]->(m) `); // Tom Hanks movies await session.run(` MATCH (tom:Person {name:'Tom Hanks'}), (m:Movie {title:"You've Got Mail"}) CREATE (tom)-[:ACTED_IN {roles:['Joe Fox']}]->(m) `); await session.run(` MATCH (tom:Person {name:'Tom Hanks'}), (m:Movie {title:'Sleepless in Seattle'}) CREATE (tom)-[:ACTED_IN {roles:['Sam Baldwin']}]->(m) `); await session.run(` MATCH (tom:Person {name:'Tom Hanks'}), (m:Movie {title:'Joe Versus the Volcano'}) CREATE (tom)-[:ACTED_IN {roles:['Joe Banks']}]->(m) `); await session.run(` MATCH (tom:Person {name:'Tom Hanks'}), (m:Movie {title:'The Green Mile'}) CREATE (tom)-[:ACTED_IN {roles:['Paul Edgecomb']}]->(m) `); await session.run(` MATCH (tom:Person {name:'Tom Hanks'}), (m:Movie {title:'Cloud Atlas'}) CREATE (tom)-[:ACTED_IN {roles:['Zachry']}]->(m) `); await session.run(` MATCH (tom:Person {name:'Tom Hanks'}), (m:Movie {title:'The Da Vinci Code'}) CREATE (tom)-[:ACTED_IN {roles:['Dr. Robert Langdon']}]->(m) `); // Meg Ryan movies await session.run(` MATCH (meg:Person {name:'Meg Ryan'}), (m:Movie {title:"You've Got Mail"}) CREATE (meg)-[:ACTED_IN {roles:['Kathleen Kelly']}]->(m) `); await session.run(` MATCH (meg:Person {name:'Meg Ryan'}), (m:Movie {title:'Sleepless in Seattle'}) CREATE (meg)-[:ACTED_IN {roles:['Annie Reed']}]->(m) `); await session.run(` MATCH (meg:Person {name:'Meg Ryan'}), (m:Movie {title:'Joe Versus the Volcano'}) CREATE (meg)-[:ACTED_IN {roles:['DeDe', 'Angelica']}]->(m) `); await session.run(` MATCH (meg:Person {name:'Meg Ryan'}), (m:Movie {title:'When Harry Met Sally'}) CREATE (meg)-[:ACTED_IN {roles:['Sally Albright']}]->(m) `); await session.run(` MATCH (meg:Person {name:'Meg Ryan'}), (m:Movie {title:'Top Gun'}) CREATE (meg)-[:ACTED_IN {roles:['Carole']}]->(m) `); // Tom Cruise await session.run(` MATCH (tom:Person {name:'Tom Cruise'}), (m:Movie {title:'Top Gun'}) CREATE (tom)-[:ACTED_IN {roles:['Maverick']}]->(m) `); await session.run(` MATCH (tom:Person {name:'Tom Cruise'}), (m:Movie {title:'Jerry Maguire'}) CREATE (tom)-[:ACTED_IN {roles:['Jerry Maguire']}]->(m) `); await session.run(` MATCH (tom:Person {name:'Tom Cruise'}), (m:Movie {title:"A Few Good Men"}) CREATE (tom)-[:ACTED_IN {roles:['Lt. Daniel Kaffee']}]->(m) `); // Others await session.run(` MATCH (jack:Person {name:'Jack Nicholson'}), (m:Movie {title:"A Few Good Men"}) CREATE (jack)-[:ACTED_IN {roles:['Col. Nathan R. Jessup']}]->(m) `); await session.run(` MATCH (jack:Person {name:'Jack Nicholson'}), (m:Movie {title:'As Good as It Gets'}) CREATE (jack)-[:ACTED_IN {roles:['Melvin Udall']}]->(m) `); await session.run(` MATCH (demi:Person {name:'Demi Moore'}), (m:Movie {title:"A Few Good Men"}) CREATE (demi)-[:ACTED_IN {roles:['Lt. Cdr. JoAnne Galloway']}]->(m) `); await session.run(` MATCH (kevin:Person {name:'Kevin Bacon'}), (m:Movie {title:"A Few Good Men"}) CREATE (kevin)-[:ACTED_IN {roles:['Capt. Jack Ross']}]->(m) `); await session.run(` MATCH (cuba:Person {name:'Cuba Gooding Jr.'}), (m:Movie {title:'Jerry Maguire'}) CREATE (cuba)-[:ACTED_IN {roles:['Rod Tidwell']}]->(m) `); await session.run(` MATCH (renee:Person {name:'Renee Zellweger'}), (m:Movie {title:'Jerry Maguire'}) CREATE (renee)-[:ACTED_IN {roles:['Dorothy Boyd']}]->(m) `); await session.run(` MATCH (billy:Person {name:'Billy Crystal'}), (m:Movie {title:'When Harry Met Sally'}) CREATE (billy)-[:ACTED_IN {roles:['Harry Burns']}]->(m) `); await session.run(` MATCH (robin:Person {name:'Robin Williams'}), (m:Movie {title:'What Dreams May Come'}) CREATE (robin)-[:ACTED_IN {roles:['Chris Nielsen']}]->(m) `); await session.run(` MATCH (natalie:Person {name:'Natalie Portman'}), (m:Movie {title:'V for Vendetta'}) CREATE (natalie)-[:ACTED_IN {roles:['Evey Hammond']}]->(m) `); await session.run(` MATCH (hugo:Person {name:'Hugo Weaving'}), (m:Movie {title:'V for Vendetta'}) CREATE (hugo)-[:ACTED_IN {roles:['V']}]->(m) `); await session.run(` MATCH (hugo:Person {name:'Hugo Weaving'}), (m:Movie {title:'Cloud Atlas'}) CREATE (hugo)-[:ACTED_IN {roles:['Bill Smoke']}]->(m) `); await session.run(` MATCH (halle:Person {name:'Halle Berry'}), (m:Movie {title:'Cloud Atlas'}) CREATE (halle)-[:ACTED_IN {roles:['Luisa Rey']}]->(m) `); await session.run(` MATCH (michael:Person {name:'Michael Clarke Duncan'}), (m:Movie {title:'The Green Mile'}) CREATE (michael)-[:ACTED_IN {roles:['John Coffey']}]->(m) `); // Create DIRECTED relationships await session.run(` MATCH (lilly:Person {name:'Lilly Wachowski'}), (m:Movie {title:'The Matrix'}) CREATE (lilly)-[:DIRECTED]->(m) `); await session.run(` MATCH (lana:Person {name:'Lana Wachowski'}), (m:Movie {title:'The Matrix'}) CREATE (lana)-[:DIRECTED]->(m) `); await session.run(` MATCH (lilly:Person {name:'Lilly Wachowski'}), (m:Movie {title:'The Matrix Reloaded'}) CREATE (lilly)-[:DIRECTED]->(m) `); await session.run(` MATCH (lana:Person {name:'Lana Wachowski'}), (m:Movie {title:'The Matrix Reloaded'}) CREATE (lana)-[:DIRECTED]->(m) `); await session.run(` MATCH (lilly:Person {name:'Lilly Wachowski'}), (m:Movie {title:'The Matrix Revolutions'}) CREATE (lilly)-[:DIRECTED]->(m) `); await session.run(` MATCH (lana:Person {name:'Lana Wachowski'}), (m:Movie {title:'The Matrix Revolutions'}) CREATE (lana)-[:DIRECTED]->(m) `); await session.run(` MATCH (lilly:Person {name:'Lilly Wachowski'}), (m:Movie {title:'Cloud Atlas'}) CREATE (lilly)-[:DIRECTED]->(m) `); await session.run(` MATCH (lana:Person {name:'Lana Wachowski'}), (m:Movie {title:'Cloud Atlas'}) CREATE (lana)-[:DIRECTED]->(m) `); await session.run(` MATCH (lilly:Person {name:'Lilly Wachowski'}), (m:Movie {title:'V for Vendetta'}) CREATE (lilly)-[:DIRECTED]->(m) `); await session.run(` MATCH (lana:Person {name:'Lana Wachowski'}), (m:Movie {title:'V for Vendetta'}) CREATE (lana)-[:DIRECTED]->(m) `); await session.run(` MATCH (lilly:Person {name:'Lilly Wachowski'}), (m:Movie {title:'Speed Racer'}) CREATE (lilly)-[:DIRECTED]->(m) `); await session.run(` MATCH (lana:Person {name:'Lana Wachowski'}), (m:Movie {title:'Speed Racer'}) CREATE (lana)-[:DIRECTED]->(m) `); // Create PRODUCED relationships await session.run(` MATCH (joel:Person {name:'Joel Silver'}), (m:Movie {title:'The Matrix'}) CREATE (joel)-[:PRODUCED]->(m) `); await session.run(` MATCH (joel:Person {name:'Joel Silver'}), (m:Movie {title:'The Matrix Reloaded'}) CREATE (joel)-[:PRODUCED]->(m) `); await session.run(` MATCH (joel:Person {name:'Joel Silver'}), (m:Movie {title:'The Matrix Revolutions'}) CREATE (joel)-[:PRODUCED]->(m) `); } // ============================================================================ // SETUP AND TEARDOWN // ============================================================================ beforeAll(async () => { console.log('\n╔════════════════════════════════════════════════════════════════════╗'); console.log('║ NornicDB vs Neo4j Performance Benchmark Suite ║'); console.log('╚════════════════════════════════════════════════════════════════════╝\n'); // Connect to NornicDB console.log(`Connecting to NornicDB at ${NORNICDB_URI}...`); try { nornicdbDriver = neo4j.driver(NORNICDB_URI, neo4j.auth.basic(NORNICDB_USER, NORNICDB_PASSWORD)); nornicdbSession = nornicdbDriver.session(); await nornicdbSession.run('RETURN 1'); console.log('✓ Connected to NornicDB'); console.log('Loading Movies dataset into NornicDB...'); await loadMoviesDataset(nornicdbSession); const result1 = await nornicdbSession.run('MATCH (n) RETURN count(n) as count'); console.log(` → ${result1.records[0].get('count')} nodes created in NornicDB`); } catch (error) { console.error(`✗ Failed to connect to NornicDB: ${error}`); } // Connect to Neo4j console.log(`\nConnecting to Neo4j at ${NEO4J_URI}...`); try { neo4jDriver = neo4j.driver(NEO4J_URI, neo4j.auth.basic(NEO4J_USER, NEO4J_PASSWORD)); neo4jSession = neo4jDriver.session(); await neo4jSession.run('RETURN 1'); console.log('✓ Connected to Neo4j'); console.log('Loading Movies dataset into Neo4j...'); await loadMoviesDataset(neo4jSession); const result2 = await neo4jSession.run('MATCH (n) RETURN count(n) as count'); console.log(` → ${result2.records[0].get('count')} nodes created in Neo4j`); } catch (error) { console.error(`✗ Failed to connect to Neo4j: ${error}`); } console.log('\n' + '─'.repeat(72) + '\n'); }); afterAll(async () => { console.log('\n' + '─'.repeat(72)); console.log('Cleaning up...'); if (nornicdbSession) { await nornicdbSession.run('MATCH (n) DETACH DELETE n').catch(() => {}); await nornicdbSession.close(); } if (nornicdbDriver) await nornicdbDriver.close(); if (neo4jSession) { await neo4jSession.run('MATCH (n) DETACH DELETE n').catch(() => {}); await neo4jSession.close(); } if (neo4jDriver) await neo4jDriver.close(); console.log('✓ Cleanup complete\n'); }); // ============================================================================ // NORNICDB BENCHMARKS // ============================================================================ describe('NornicDB Benchmarks', () => { // Basic reads bench('Count all nodes', async () => { await nornicdbSession.run('MATCH (n) RETURN count(n)'); }); bench('Count all relationships', async () => { await nornicdbSession.run('MATCH ()-[r]->() RETURN count(r)'); }); bench('Get all movies', async () => { await nornicdbSession.run('MATCH (m:Movie) RETURN m.title, m.released'); }); bench('Get all people', async () => { await nornicdbSession.run('MATCH (p:Person) RETURN p.name, p.born'); }); // Lookup by property bench('Find movie by title', async () => { await nornicdbSession.run("MATCH (m:Movie {title: 'The Matrix'}) RETURN m"); }); bench('Find person by name', async () => { await nornicdbSession.run("MATCH (p:Person {name: 'Keanu Reeves'}) RETURN p"); }); // Relationship traversal (1 hop) bench('Actors in The Matrix', async () => { await nornicdbSession.run(` MATCH (m:Movie {title: 'The Matrix'})<-[:ACTED_IN]-(p:Person) RETURN p.name, m.title `); }); bench('Movies Keanu acted in', async () => { await nornicdbSession.run(` MATCH (p:Person {name: 'Keanu Reeves'})-[:ACTED_IN]->(m:Movie) RETURN m.title, m.released `); }); // Relationship traversal (2 hops) bench('Co-actors of Keanu', async () => { await nornicdbSession.run(` MATCH (p:Person {name: 'Keanu Reeves'})-[:ACTED_IN]->(m:Movie)<-[:ACTED_IN]-(coactor:Person) WHERE coactor <> p RETURN DISTINCT coactor.name `); }); // Relationship traversal (3 hops) bench('Directors of co-actors movies', async () => { await nornicdbSession.run(` MATCH (p:Person {name: 'Keanu Reeves'})-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(coactor:Person) WHERE coactor <> p MATCH (coactor)-[:ACTED_IN]->(m:Movie)<-[:DIRECTED]-(d:Person) RETURN DISTINCT d.name, m.title LIMIT 20 `); }); // Aggregations bench('Movies per decade', async () => { await nornicdbSession.run(` MATCH (m:Movie) RETURN (m.released / 10) * 10 AS decade, count(m) AS count ORDER BY decade `); }); bench('Most prolific actors', async () => { await nornicdbSession.run(` MATCH (p:Person)-[:ACTED_IN]->(m:Movie) RETURN p.name, count(m) AS movies ORDER BY movies DESC LIMIT 10 `); }); // Complex patterns bench('Actor-Director pairs', async () => { await nornicdbSession.run(` MATCH (a:Person)-[:ACTED_IN]->(m:Movie)<-[:DIRECTED]-(d:Person) RETURN a.name, d.name, count(m) AS collaborations ORDER BY collaborations DESC LIMIT 10 `); }); // OPTIONAL MATCH bench('Movies with or without directors', async () => { await nornicdbSession.run(` MATCH (m:Movie) OPTIONAL MATCH (m)<-[:DIRECTED]-(d:Person) RETURN m.title, d.name LIMIT 20 `); }); // WITH and ORDER bench('Top movies by actor count', async () => { await nornicdbSession.run(` MATCH (m:Movie)<-[:ACTED_IN]-(a:Person) WITH m, count(a) AS actorCount ORDER BY actorCount DESC LIMIT 10 RETURN m.title, actorCount `); }); // COLLECT aggregation bench('Movies with cast list', async () => { await nornicdbSession.run(` MATCH (m:Movie)<-[:ACTED_IN]-(a:Person) RETURN m.title, collect(a.name) AS cast LIMIT 5 `); }); // Write operations bench('Create and delete node', async () => { await nornicdbSession.run(` CREATE (t:TestNode {name: 'temp', created: timestamp()}) WITH t DELETE t RETURN count(t) `); }); bench('Create and delete relationship', async () => { await nornicdbSession.run(` MATCH (p:Person {name: 'Keanu Reeves'}), (m:Movie {title: 'The Matrix'}) CREATE (p)-[r:TEST_REL]->(m) WITH r DELETE r RETURN count(r) `); }); }); // ============================================================================ // NEO4J BENCHMARKS // ============================================================================ describe('Neo4j Benchmarks', () => { // Basic reads bench('Count all nodes', async () => { await neo4jSession.run('MATCH (n) RETURN count(n)'); }); bench('Count all relationships', async () => { await neo4jSession.run('MATCH ()-[r]->() RETURN count(r)'); }); bench('Get all movies', async () => { await neo4jSession.run('MATCH (m:Movie) RETURN m.title, m.released'); }); bench('Get all people', async () => { await neo4jSession.run('MATCH (p:Person) RETURN p.name, p.born'); }); // Lookup by property bench('Find movie by title', async () => { await neo4jSession.run("MATCH (m:Movie {title: 'The Matrix'}) RETURN m"); }); bench('Find person by name', async () => { await neo4jSession.run("MATCH (p:Person {name: 'Keanu Reeves'}) RETURN p"); }); // Relationship traversal (1 hop) bench('Actors in The Matrix', async () => { await neo4jSession.run(` MATCH (m:Movie {title: 'The Matrix'})<-[:ACTED_IN]-(p:Person) RETURN p.name, m.title `); }); bench('Movies Keanu acted in', async () => { await neo4jSession.run(` MATCH (p:Person {name: 'Keanu Reeves'})-[:ACTED_IN]->(m:Movie) RETURN m.title, m.released `); }); // Relationship traversal (2 hops) bench('Co-actors of Keanu', async () => { await neo4jSession.run(` MATCH (p:Person {name: 'Keanu Reeves'})-[:ACTED_IN]->(m:Movie)<-[:ACTED_IN]-(coactor:Person) WHERE coactor <> p RETURN DISTINCT coactor.name `); }); // Relationship traversal (3 hops) bench('Directors of co-actors movies', async () => { await neo4jSession.run(` MATCH (p:Person {name: 'Keanu Reeves'})-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(coactor:Person) WHERE coactor <> p MATCH (coactor)-[:ACTED_IN]->(m:Movie)<-[:DIRECTED]-(d:Person) RETURN DISTINCT d.name, m.title LIMIT 20 `); }); // Aggregations bench('Movies per decade', async () => { await neo4jSession.run(` MATCH (m:Movie) RETURN (m.released / 10) * 10 AS decade, count(m) AS count ORDER BY decade `); }); bench('Most prolific actors', async () => { await neo4jSession.run(` MATCH (p:Person)-[:ACTED_IN]->(m:Movie) RETURN p.name, count(m) AS movies ORDER BY movies DESC LIMIT 10 `); }); // Complex patterns bench('Actor-Director pairs', async () => { await neo4jSession.run(` MATCH (a:Person)-[:ACTED_IN]->(m:Movie)<-[:DIRECTED]-(d:Person) RETURN a.name, d.name, count(m) AS collaborations ORDER BY collaborations DESC LIMIT 10 `); }); // OPTIONAL MATCH bench('Movies with or without directors', async () => { await neo4jSession.run(` MATCH (m:Movie) OPTIONAL MATCH (m)<-[:DIRECTED]-(d:Person) RETURN m.title, d.name LIMIT 20 `); }); // WITH and ORDER bench('Top movies by actor count', async () => { await neo4jSession.run(` MATCH (m:Movie)<-[:ACTED_IN]-(a:Person) WITH m, count(a) AS actorCount ORDER BY actorCount DESC LIMIT 10 RETURN m.title, actorCount `); }); // COLLECT aggregation bench('Movies with cast list', async () => { await neo4jSession.run(` MATCH (m:Movie)<-[:ACTED_IN]-(a:Person) RETURN m.title, collect(a.name) AS cast LIMIT 5 `); }); // Write operations bench('Create and delete node', async () => { await neo4jSession.run(` CREATE (t:TestNode {name: 'temp', created: timestamp()}) WITH t DELETE t RETURN count(t) `); }); bench('Create and delete relationship', async () => { await neo4jSession.run(` MATCH (p:Person {name: 'Keanu Reeves'}), (m:Movie {title: 'The Matrix'}) CREATE (p)-[r:TEST_REL]->(m) WITH r DELETE r RETURN count(r) `); }); });

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/orneryd/Mimir'

If you have feedback or need assistance with the MCP directory API, please join our Discord server