.do

graphdl

Semantic graph definition language for modeling business domains

graphdl

GraphDL (Graph Definition Language) is a semantic modeling language for defining business domains using graph structures and triple patterns.

Quick Start

import { graph } from 'graphdl'

// Define graph schema
const schema = graph.define({
  Business: {
    owns: 'Brand',
    employs: 'User',
    sells: 'Product',
  },
  Brand: {
    offers: 'Product',
    targets: 'Audience',
  },
  Product: {
    belongsTo: 'Category',
    has: 'Review',
  },
})

// Query using semantic triples
const brands = await schema.query($.Business.owns.Brand, {
  subject: 'acme-inc',
})

Semantic Triples

Basic Pattern

// Subject.Predicate.Object
$.Business.owns.Brand
$.User.has.Role
$.Product.belongsTo.Category

Chained Relationships

// Navigate multiple levels
$.Business.owns.Brand.sells.Product

// Get all products from business's brands
const products = await graph.traverse($.Business.owns.Brand.sells.Product, { businessId: 'acme-inc' })

Schema Definition

import { defineSchema } from 'graphdl'

const schema = defineSchema({
  entities: {
    Business: {
      properties: {
        name: 'string',
        industry: 'string',
        founded: 'number',
      },
      relationships: {
        owns: { target: 'Brand', cardinality: 'many' },
        employs: { target: 'User', cardinality: 'many' },
      },
    },
    Brand: {
      properties: {
        name: 'string',
        logo: 'string',
      },
      relationships: {
        ownedBy: { target: 'Business', cardinality: 'one' },
        sells: { target: 'Product', cardinality: 'many' },
      },
    },
  },
})

Graph Queries

// Get direct relationships
const brands = await graph.related('business-id', 'owns')

// Get inverse relationships
const business = await graph.relatedOne('brand-id', 'ownedBy')

// Navigate graph
const employees = await graph.traverse($.Business.owns.Brand.employs.User, { businessId: 'acme-inc' })

// Query with filters
const products = await graph.query($.Brand.sells.Product, {
  subject: 'brand-id',
  where: { price: { gte: 50, lte: 200 } },
})

Graph Operations

// Create relationship
await graph.relate('business-id', 'owns', 'brand-id')

// Remove relationship
await graph.unrelate('business-id', 'owns', 'brand-id')

// Update relationship metadata
await graph.updateRelation('business-id', 'owns', 'brand-id', {
  since: '2020-01-01',
  percentage: 100,
})

Documentation