Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

GraphApi mascot

Introduction to Graph API

Graph API is an ergonomic library for working with in memory graphs in Rust that provides a flexible and type-safe way to interact with graph data structures.

Heavily inspired by Apache TinkerPop, it offers an iterator-like interface specifically designed for graph traversal and manipulation.

Overview

This library offers a unified interface for working with different types of graphs while maintaining strong type safety and ergonomic usage patterns. It includes features for graph traversal, modification, and custom extensions.

Advantages

  • Iterator-like interface for graphs: Intuitive API that feels familiar to Rust developers
  • Works with multiple backends:
    • simple graph - A simple adjacency list based graph with index support
    • petgraph - An excellent established graph library
    • You can also create your own!
  • Composable operations: Chain graph operations together in a fluent, declarative style
  • Separation of graph model and implementation: Define your domain model once and use it with any supported backend

Key Features

  • Type-safe graph operations: Work with graph data in a strongly-typed manner
  • Flexible vertex and edge traversal: Explore graph relationships with powerful walker API
  • Custom graph implementations support: Adapt to various graph storage backends
  • Derive macros for extending graph functionality: Automatically generate boilerplate code
  • Comprehensive testing utilities: Including fuzzing support

Example

    // Find a person using the username index (exact match)
    let bryn = graph
        .walk()
        .vertices(Vertex::person_by_username("bryn123"))
        .first()
        .expect("Bryn should exist in the graph");

    println!("Found person: {:?}", bryn);

    // Find projects created by a person
    let projects_created_by_bryn = graph
        .walk()
        .vertices_by_id(vec![bryn])
        .edges(Edge::created().outgoing())
        .head()
        .collect::<Vec<_>>();

    println!("Bryn created {} projects", projects_created_by_bryn.len());

    // Find all people followed by Bryn
    let followed_by_bryn = graph
        .walk()
        .vertices_by_id(vec![bryn])
        .edges(Edge::follows().outgoing())
        .head()
        .collect::<Vec<_>>();

    println!("Bryn follows {} people", followed_by_bryn.len());

    // Find all people with "graph" in their biography
    let graph_enthusiasts = graph
        .walk()
        .vertices(Vertex::person_by_biography("graph"))
        .collect::<Vec<_>>();

    println!("Found {} graph enthusiasts", graph_enthusiasts.len());

    // Find people in a specific age range
    let people_in_30s = graph
        .walk()
        .vertices(Vertex::person_by_age_range(30..40))
        .collect::<Vec<_>>();

    println!("Found {} people in their 30s", people_in_30s.len());

Book Organization

This book is organized into several sections:

  • User Guide: How to use the Graph API to work with graph data
  • Implementation Guide: How to implement the Graph API traits for your own graph types
  • Reference: Detailed information about API components and functionality
  • Appendix: Additional resources and reference materials

Whether you're a graph API user or implementing your own graph backend, this book provides comprehensive documentation to help you make the most of the Graph API library.