logo

Julia's Graph Analysis Package Graphs.jl 📂Graph Theory

Julia's Graph Analysis Package Graphs.jl

Introduction

Graphs.jl is a package for graph (network) analysis, similar to Python’s NetworkX. It was created by rebooting the LightGraphs.jl package.

The goal of Graphs.jl is to offer a performant platform for network and graph analysis in Julia, following the example of libraries such as NetworkX in Python.

The Graphs.jl project is a reboot of the LightGraphs.jl package (archived in October 2021), which remains available on GitHub at sbromberger/LightGraphs.jl.

Code

The code is broadly similar to NetworkX. However, it seems that there are still some difficulties in using it properly.

Installation

Enter ] add Graphs in the Julia REPL to install.

(@v1.7) pkg> add Graphs

Loading and Version Check

julia> using Graphs
julia> using Pkg

julia> Pkg.status("Graphs")
  [86223c79] Graphs v1.7.1

Graph Creation

Similar to NetworkX, Graph() and DiGraph() are used to create null graphs. The default type of vertices is Int64, and they can only be created with sub-types of this. Graph information is represented as $\left\{ \left| V \right|, \left| E \right| \right\}$.

julia> G = Graph()
{0, 0} undirected simple Int64 graph

julia> G = DiGraph()
{0, 0} directed simple Int64 graph

julia> G = Graph{Float64}()
ERROR: TypeError: in SimpleGraph, in T, expected T<:Integer, got Type{Float64}

julia> G = Graph{UInt64}()
{0, 0} undirected simple UInt64 graph

Adding and Removing Vertices

In NetworkX, nodes can be added by naming the nodes, but in Graphs.jl, vertices start from $1$ and are added in order to $2,3,\dots$.

julia> add_vertex!(G)
true

julia> G
{1, 0} undirected simple Int64 graph

julia> add_vertex!(G)
true

julia> G
{2, 0} undirected simple Int64 graph

add_vertices!(G, n) is used to add $n$ vertices.

julia> add_vertices!(G, 3)
3

julia> G
{5, 0} undirected simple Int64 graph

Note that when removing a specific vertex with rem_vertex!(G, v), the numbers are automatically sorted without leaving any empty numbers. For example, if the vertices are $V = \left\{ 1,2,3,4,5 \right\}$ and $2$ is deleted, the name of $3, 4, 5$ changes to $2, 3, 4$.

julia> G = Graph(5)
{5, 0} undirected simple Int64 graph

julia> rem_vertex!(G, 2)
true

julia> G
{4, 0} undirected simple Int64 graph

julia> has_vertex(G, 2)
true

julia> has_vertex(G, 5)
false

Adding and Removing Edges

When the second vertex is removed with rem_vertex!(G, 2), as explained above, the existing third vertex becomes the new second vertex, but the result for edges is different. It seems to be a bug.

julia> G = Graph(5)
{5, 0} undirected simple Int64 graph
julia> add_edge!(G, 1, 2)
true
julia> add_edge!(G, 2, 3)
true
julia> add_edge!(G, 3, 4)
true
julia> G
{5, 3} undirected simple Int64 graph

julia> has_edge(G, 1, 2)
true
julia> has_edge(G, 2, 3)
true
julia> has_edge(G, 3, 4)
true


julia> rem_vertex!(G, 2)
true
julia> G
{4, 1} undirected simple Int64 graph
julia> has_vertex(G, 2)
true
julia> has_edge(G, 1, 2)
false
julia> has_edge(G, 2, 3)
false
julia> has_edge(G, 3, 4)
true

Environment

  • OS: Windows10
  • Version: Julia 1.7.1, Graphs 1.7.1