EXPERIMENTAL: These features are experimental and should not be used in production systems.
Graph Library: Basic Operations
Rel’s Graph Library implements a wide range of algorithms
for common graph analytics tasks.
The algorithms are implemented in the rel:graphlib
module.
This document introduces you to using the Graph Library to perform operations on graphs. The Neighbors and Degrees guides explain basic operations in more detail, such as finding neighbors and computing degrees of nodes in a graph.
Using The Graph Library
All of the algorithms in the Graph Library are contained in the
rel:graphlib
module.
Once you have
created a graph,
you can instantiate rel:graphlib
on the graph to make
available all of the library relations that perform operations
and compute measures and statistics on that graph.
Instantiating rel:graphlib
To instantiate rel:graphlib
,
apply
the library module to a
graph module,
such as a graph construced using one of the Library’s
graph constructors.
// Construct a directed graph with two nodes and one edge.
def my_graph = directed_graph[{(1, 2)}]
// Instantiate rel:graphlib on my_graph.
// The module should always be instantiated with @inline.
@inline
def my_graphlib = rel:graphlib[my_graph]
Always instantiate rel:graphlib
with the
@inline
annotation.
Without it, you may experience errors
when using certain relations.
For the best performance,
persist the instantiated rel:graphlib
module in a model.
See
Performance Tips
for more information.
Using Library Relations
Once rel:graphlib
has been instantiated, you can run algorithms
and perform analyses by using relations in the instantiated module.
To use a relation,
import the relation
from the instantiated module (for example, with my_graphlib use degree
)
or use the relation’s
qualified name
(for example, my_graphlib:degree
):
// read query
// Construct a directed graph with two nodes and one edge.
def my_graph = directed_graph[{(1, 2)}]
// Instantiate rel:graphlib on my_graph.
@inline
def my_graphlib = rel:graphlib[my_graph]
// Display the degree of each node in my_graph.
// Here, degree is accessed by its qualified name.
def output = my_graphlib:degree
// Alternatively, you may import the degree relation first.
with my_graphlib use degree
def output = degree
Learn more about the degree
relation in the
Degrees
guide.
The
Neighbors
guide describes how to work with the Graph Library’s
neighbor relations.
Performance Tips
Here are two tips for getting the best performance out of the Graph Library’s relations:
-
Persist the graph module and instantiated
rel:graphlib
module to a model. When algorithms are run, the materialized relations are persisted so that they do not have to be recalculated for each query. See Create a Graph From a CSV File for an example.Installing the library module has another advantage: If the base data for the graph changes, any materialized library relations can be updated incrementally, allowing updates to stored computations to finish much faster in some cases. See Ingestion Workflows: ELT for details.
-
Use integer nodes. Many of the algorithms implemented by the Graph Library perform better when all of the nodes in a graph are integers. See Graphs: Performance Tips for details on mapping nodes to integers.
Learn More
Explore our how-to guides for common operations with neighbors and degrees: