Dagraph

Dagraph is a gem which allows you to represent DAG hierarchy using your ActiveRecord models. With a directed acyclic graph, you can represent hierarchical data where children may have multiple parents.

Installation

Install the gem and add to the application's Gemfile by executing:

$ bundle add dagraph

To add a DAG to a model, you can use the generator:

bin/rails generate dagraph:model {MODEL_NAME}

It will add the required line to your model, create the file for the edges model and the required migration.

Usage

After setting up a DAG in one of your model, the following methods are available to use the DAG:

Method name Description
Model.roots Get all objects without a parent
Model.leaves Get all objects without a child
Model#parents Get all parents (direct or not) attached to your object
Model#children Get all children (direct or not) attached to your object
Model#parent_edges Get all parent edges attached to your object, this method return instances from your edge class
Model#child_edges Get all children edges attached to your object, this method return instances from your edge class
Model#direct_parents Get all direct parents attached to your object
Model#direct_children Get all direct children attached to your object
Model#direct_parent_edges Get all direct parent edges attached to your object, this method return instances from your edge class
Model#direct_child_edges Get all direct children edges attached to your object, this method return instances from your edge class
Model#parent_of?(node) Check if your object is a parent of the node
Model#child_of?(node) Check if your object is a child of the node
Model#direct_parent_of?(node) Check if your object is a direct parent of the node
Model#direct_child_of?(node) Check if your object is a direct child of the node
Model#childdren_at_depth(depth) Get all children of your object at a specific depth
Model#root? Check if your object is at the root of your tree (it has no parent)
Model#child? Check if your object is not at the root of your tree (it has one or more parents)
Model#leaf? Check if your object is a leaf in your tree (it has no child)

You can add parents or children to your objects by using the direct_parents and direct_children associations:

# Define all parents for your model
model.direct_parents = [node]

# Add one parent to your model
model.direct_parents << node

# Remove one parent for your model
model.direct_parents.destroy(node)

# Define all children for your model
model.direct_children = [node]

# Add one parent to your model
model.direct_children << node

# Remove one child for your model
model.direct_children.destroy(node)

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake test to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and the created tag, and push the .gem file to rubygems.org.

https://www.codeproject.com/Articles/22824/A-Model-to-Represent-Directed-Acyclic-Graphs-DAG-o#Figure2 https://arxiv.org/pdf/2211.11159 https://www.baeldung.com/cs/dag-applications

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/gdott9/dagraph.

License

The gem is available as open source under the terms of the MIT License.