DEV Community

Moiz Ibrar
Moiz Ibrar

Posted on • Updated on

Efficient Graph Processing with Dijkstra's Algorithm using Apache Age

Introduction

Dijkstra’s algorithm is a classic algorithm used in graph theory to find the shortest path between two nodes in a graph. In this article, we will explore how to implement Dijkstra’s algorithm using ApacheAge, a graph database built on top of Apache Arrow. ApacheAge provides a simple and efficient way to store and analyze large graphs.

Prerequisites

Before diving into the implementation, make sure that you have ApacheAge installed in your system. You can install it using pip command as follows:

pip install apache-age

Enter fullscreen mode Exit fullscreen mode

Once the installation is complete, we can proceed with implementing Dijkstra’s algorithm.

Implementation

First, we need to create a graph in ApacheAge. Let’s create a graph with the following nodes and edges:

Nodes: A, B, C, D, E, F
Edges: (A,B,5), (A,C,3), (B,D,2), (C,D,1), (C,E,6), (D,E,4), (D,F,2), (E,F,1)

Enter fullscreen mode Exit fullscreen mode

We can create the graph in ApacheAge as follows:

from age import Graph, Vertex, Edge

graph = Graph()

# add vertices
graph.add_vertex(Vertex('A'))
graph.add_vertex(Vertex('B'))
graph.add_vertex(Vertex('C'))
graph.add_vertex(Vertex('D'))
graph.add_vertex(Vertex('E'))
graph.add_vertex(Vertex('F'))

# add edges
graph.add_edge(Edge('A', 'B', 5))
graph.add_edge(Edge('A', 'C', 3))
graph.add_edge(Edge('B', 'D', 2))
graph.add_edge(Edge('C', 'D', 1))
graph.add_edge(Edge('C', 'E', 6))
graph.add_edge(Edge('D', 'E', 4))
graph.add_edge(Edge('D', 'F', 2))
graph.add_edge(Edge('E', 'F', 1))
Enter fullscreen mode Exit fullscreen mode

Next, we can implement Dijkstra’s algorithm to find the shortest path between two nodes. Here is the implementation:

import heapq

def dijkstra(graph, start, end):
    # initialize distance to all vertices as infinite
    distance = {vertex: float('inf') for vertex in graph.vertices}
    # set distance to start vertex as 0
    distance[start] = 0
    # create a heap to store vertices with their distances
    heap = [(0, start)]
    # initialize visited set
    visited = set()

    while heap:
        # pop the vertex with the smallest distance
        (dist, current_vertex) = heapq.heappop(heap)
        # mark the vertex as visited
        visited.add(current_vertex)

        # if we have reached the end vertex, return the distance
        if current_vertex == end:
            return distance[end]

        # iterate through the neighbors of the current vertex
        for neighbor in graph.neighbors(current_vertex):
            # calculate the new distance to the neighbor through the current vertex
            new_distance = distance[current_vertex] + graph.edge_weight(current_vertex, neighbor)
            # if the new distance is smaller than the current distance, update it
            if new_distance < distance[neighbor]:
                distance[neighbor] = new_distance
                # add the neighbor to the heap with its distance
                heapq.heappush(heap, (new_distance, neighbor))

    # if the end vertex is not reachable, return None
    return None
Enter fullscreen mode Exit fullscreen mode

Let's test the Dijkstra's algorithm on our graph.

print(dijkstra(graph, 'A', 'F'))
Enter fullscreen mode Exit fullscreen mode

The output should be 8, which is the shortest distance from node A to node

Apache-Age:-https://age.apache.org/
GitHub:-https://github.com/apache/age

Top comments (3)

Collapse
 
matheusfarias03 profile image
Matheus Farias de Oliveira Matsumoto

That's pretty neat! Do I need to have a postgres instance running for this to work?

Collapse
 
khan35343434 profile image
syvco

Can you share knowledeg About ehsaas rashan

Collapse
 
ehsaas8171program profile image
ehsaas-program

Its super amazing graph processing system via Apache Age. Good work. regards: 8171