Understanding Use Of Shortest Path Algorithm In Apache Age
Tags: apacheage, graphdatabase, database, algorithms
Published: 2023-12-26 14:00:49

_**What is shortest path algorithm?**_
In graph theory, the shortest path problem is the problem of finding a path between two vertices (or nodes) in a graph such that the sum of the weights of its constituent edges is minimized.

The problem of finding the shortest path between two intersections on a road map may be modeled as a special case of the shortest path problem in graphs, where the vertices correspond to intersections and the edges correspond to road segments, each weighted by the length of the segment.

Shortest path algorithm is widely applied in various domains, including transportation networks, social networks, and network routing. Apache AGE provides an efficient implementation of the shortest path algorithm, allowing users to find the most optimal path between nodes in their graph data.


**Benefits of using shortest path algorithm in Apache AGE**

**Scalability**
Shortest path algorithms, when implemented in Apache AGE, contribute to the scalability of the system. As the size of the graph grows, the algorithm can still provide efficient pathfinding without a significant degradation in performance.

**Optimized Query Performance**
Use of the shortest path algorithm allows for optimized query performance, especially when dealing with large and complex graphs. It minimizes the computational cost by efficiently navigating the graph structure to find the shortest path.

**Real-time Response**
Shortest path algorithm enable real-time responses to queries related to pathfinding. This is particularly valuable in scenarios where quick decision-making based on the latest data is critical.


**Step to take when implementing shortest path algorithm in Apache Age using `dijkstra algorithm`**

_Requirements needed for dijkstra implementation in python  include:_

```
sudo apt-get update
sudo apt-get install python3-dev libpq-dev
pip install --no-binary :all: psycopg2
```

**1.Set up Apache Age**
install Apache Age and its python library client and this can be done as follows:

```
pip install apache-age apache-age-python-client
```
next after installing apache age and its python client library  we need to install the age-dijkstra library and this is done as follows:
```
pip install apache-age-dijkstra
pip install antlr4-python3-runtime==4.9.3
```
**2.Create your graph database connection**

```
con = Age_Dijkstra()
con.connect(
    host="localhost",       # default is "172.17.0.2" 
    port="5432",            # default is "5432"
    dbname="databaseName",    # default is "postgres"
    user="usernamePostgres",    # default is "postgres"
    password="password password",  # default is "agens"
    printMessage = True     # default is False
)
```

**3.Define Vertex and Edge Properties:**
Vertices: Store vertex IDs and any additional properties (e.g., name, location).
Edges: Store source and target vertex IDs, weight, and any other properties.

**4. Load Data into the Graph:**
Vertices: Store vertex IDs and any additional properties (e.g., name, location).
Edges: Store source and target vertex IDs, weight, and any other properties.


**sample use case code implementation of dijkstra algorithm in Apache Age.**

```

from age_dijkstra import Age_Dijkstra, Graph

con = Age_Dijkstra()
con.connect(
    host="localhost",       # default is "172.17.0.2" 
    port="5430",            # default is "5432"
    dbname="postgresDB",    # default is "postgres"
    user="postgresUser",    # default is "postgres"
    password="postgresPW",  # default is "agens"
    printMessage = True     # default is False
)

con.create_graph( graph_name = "states_graph")

con.set_vertices(
    graph_name = "states_graph", 
    label="County", 
    property={"name" : "Nairobi",}
    )
con.set_vertices(
    graph_name = "states_graph", 
    label="County", 
    property={"name" : "Mombasa",}
    )
con.set_vertices(
    graph_name = "states_graph", 
    label="County", 
    property={"name" : "Kisumu",}
    )
con.set_vertices(
    graph_name = "states_graph", 
    label="County", 
    property={"name" : "Nakuru",}
    )

con.set_edge( 
    graph_name = "states_graph", 
    label1="Country", 
    prop1={"name" : "Nairobi",}, 
    label2="County", 
    prop2={"name" : "Mombasa"}, 
    edge_label = "Neighbour", 
    edge_prop = {"distance":"483.5km"}
)
con.set_edge( 
    graph_name = "states_graph", 
    label1="County", 
    prop1={"name" : "Kisumu",}, 
    label2="County", 
    prop2={"name" : "Kisii"}, 
    edge_label = "Neighbour", 
    edge_prop = {"distance":"115.2km"}
)
con.set_edge( 
    graph_name = "states_graph", 
    label1="County", 
    prop1={"name" : "Kisumu",}, 
    label2="County", 
    prop2={"name" : "Seme"}, 
    edge_label = "Neighbour", 
    edge_prop = {"distance":"72km"}
)
con.set_edge( 
    graph_name = "states_graph", 
    label1="County", 
    prop1={"name" : "Mombasa",}, 
    label2="County", 
    prop2={"name" : "Machakos"}, 
    edge_label = "Neighbour", 
    edge_prop = {"distance":"443.3km"}
)
con.set_edge( 
    graph_name = "states_graph", 
    label1="County", 
    prop1={"name" : "Nairobi",}, 
    label2="County", 
    prop2={"name" : "Nakuru"}, 
    edge_label = "Neighbour", 
    edge_prop = {"distance":"161km"}
)
con.set_edge( 
    graph_name = "states_graph", 
    label1="County", 
    prop1={"name" : "Kiambu",}, 
    label2="County", 
    prop2={"name" : "Nakuru"}, 
    edge_label = "Neighbour", 
    edge_prop = {"distance":"155.7km"}
)

edges = con.get_all_edge()
nodes = []
for x in con.get_all_vertices():
    nodes.append(x['County'])

init_graph = {}
for node in nodes:
    init_graph[node] = {}
    
for edge in edges :
    v1 = edge['v1']['County']
    v2 = edge['v2']['name']
    dist = int(edge['e']['distance'])
    init_graph
    init_graph[v1][v2] = dist

graph = Graph(nodes, init_graph)
previous_nodes, shortest_path = Graph.dijkstra_algorithm(graph=graph, start_node="Dhaka")
Graph.print_shortest_path(previous_nodes, shortest_path, start_node="Dhaka", target_node="Chittagong")

con.delete_graph( graph_name = "states_graph")
con.close_connection()
```
the code sample above will print output of the distance between the various counties available.

**Conclusion**
The sample code implementation is one of the few ways you can  implement dijkstra algorithm in Apache Age using python as your programming language.