Skip to content

Getting Started with CongraphDB

CongraphDB is an embedded graph database for Node.js applications. In this tutorial, we'll build a simple social network to learn the basics.

What We'll Build

A simple social network with: - Users - Friendships (relationships) - Friend recommendations

Installation

First, install CongraphDB:

npm install congraphdb

Creating the Database

const { Database } = require('congraphdb');

const db = new Database('./social-network.cgraph');
db.init();

const conn = db.createConnection();

Defining the Schema

// Create a User table
await conn.query(`
  CREATE NODE TABLE User(
    username STRING,
    display_name STRING,
    bio STRING,
    created_at INT64,
    PRIMARY KEY (username)
  )
`);

// Create a Knows relationship table
await conn.query(`
  CREATE REL TABLE Knows(FROM User TO User, since INT64)
`);

Adding Users

const users = [
  { username: 'alice', display_name: 'Alice', bio: 'Developer' },
  { username: 'bob', display_name: 'Bob', bio: 'Designer' },
  { username: 'charlie', display_name: 'Charlie', bio: 'PM' },
];

for (const user of users) {
  await conn.query(`
    CREATE (u:User {
      username: $username,
      display_name: $display_name,
      bio: $bio,
      created_at: $timestamp
    })
  `, { ...user, timestamp: Date.now() });
}

Creating Friendships

// Alice knows Bob
await conn.query(`
  MATCH (alice:User {username: 'alice'})
  MATCH (bob:User {username: 'bob'})
  CREATE (alice)-[:Knows {since: 2020}]->(bob)
`);

// Bob knows Charlie
await conn.query(`
  MATCH (bob:User {username: 'bob'})
  MATCH (charlie:User {username: 'charlie'})
  CREATE (bob)-[:Knows {since: 2021}]->(charlie)
`);

Querying the Graph

Find Alice's Friends

const result = await conn.query(`
  MATCH (u:User {username: 'alice'})-[:Knows]->(friend)
  RETURN friend.display_name
`);

for (const row of result.getAll()) {
  console.log(row['friend.display_name']);
}

Friend Recommendations

// Friends of friends I don't know yet
const result = await conn.query(`
  MATCH (me:User {username: 'alice'})-[:Knows]->(friend)-[:Knows]->(foaf:User)
  WHERE NOT (me)-[:Knows]->(foaf) AND me <> foaf
  RETURN foaf.display_name, COUNT(friend) AS mutual_friends
  ORDER BY mutual_friends DESC
`);

console.log('Friend recommendations:');
for (const row of result.getAll()) {
  console.log(`  ${row['foaf.display_name']} (${row.mutual_friends} mutual)`);
}

Cleanup

conn.close();
db.close();

Next Steps

Full Example

const { Database } = require('congraphdb');

async function main() {
  const db = new Database('./social-network.cgraph');
  db.init();
  const conn = db.createConnection();

  // Create schema
  await conn.query(`
    CREATE NODE TABLE User(
      username STRING,
      display_name STRING,
      bio STRING,
      PRIMARY KEY (username)
    )
  `);
  await conn.query(`
    CREATE REL TABLE Knows(FROM User TO User, since INT64)
  `);

  // Add users
  const users = [
    { username: 'alice', display_name: 'Alice', bio: 'Developer' },
    { username: 'bob', display_name: 'Bob', bio: 'Designer' },
    { username: 'charlie', display_name: 'Charlie', bio: 'PM' },
  ];

  for (const user of users) {
    await conn.query(`
      CREATE (u:User {username: $username, display_name: $display_name, bio: $bio})
    `, user);
  }

  // Add friendships
  await conn.query(`
    MATCH (alice:User {username: 'alice'})
    MATCH (bob:User {username: 'bob'})
    CREATE (alice)-[:Knows {since: 2020}]->(bob)
  `);

  // Query
  const result = await conn.query(`
    MATCH (u:User {username: 'alice'})-[:Knows]->(friend)
    RETURN friend.display_name
  `);

  console.log("Alice's friends:");
  for (const row of result.getAll()) {
    console.log(`- ${row['friend.display_name']}`);
  }

  db.close();
}

main().catch(console.error);

Happy graphing! :tada: