DEV Community

Cover image for Supply Chain Optimization using postgreSQL and Apache-Age - Part 2
Adeel Ahmed
Adeel Ahmed

Posted on

2

Supply Chain Optimization using postgreSQL and Apache-Age - Part 2

For Part 1 follow this link.

Load data into the database:
To load data into the supply chain graph, you can use the Cypher 'CREATE' and 'MERGE' statements. Here's an example of how to load sample data into the supply chain graph:

1 - Create Suppliers:

SELECT * FROM cypher('
  CREATE (s:Supplier {id: 1, name: "Supplier A", location: "USA"}),
         (s2:Supplier {id: 2, name: "Supplier B", location: "Germany"})
');
Enter fullscreen mode Exit fullscreen mode

2 - Create Manufacturers:

SELECT * FROM cypher('
  CREATE (m:Manufacturer {id: 1, name: "Manufacturer A", location: "USA"}),
         (m2:Manufacturer {id: 2, name: "Manufacturer B", location: "Germany"})
');
Enter fullscreen mode Exit fullscreen mode

3 - Create Distributors:

SELECT * FROM cypher('
  CREATE (d:Distributor {id: 1, name: "Distributor A", location: "USA"}),
         (d2:Distributor {id: 2, name: "Distributor B", location: "Germany"})
');
Enter fullscreen mode Exit fullscreen mode

4 - Create Retailers:

SELECT * FROM cypher('
  CREATE (r:Retailer {id: 1, name: "Retailer A", location: "USA"}),
         (r2:Retailer {id: 2, name: "Retailer B", location: "Germany"})
');
Enter fullscreen mode Exit fullscreen mode

5 - Create Supplies relationships:

SELECT * FROM cypher('
  MATCH (s:Supplier {id: 1}), (m:Manufacturer {id: 1})
  CREATE (s)-[:Supplies {cost: 100, lead_time: 7}]->(m)
');

SELECT * FROM cypher('
  MATCH (s:Supplier {id: 2}), (m:Manufacturer {id: 2})
  CREATE (s)-[:Supplies {cost: 120, lead_time: 10}]->(m)
');
Enter fullscreen mode Exit fullscreen mode

6 - Create Produces relationships:

SELECT * FROM cypher('
  MATCH (m:Manufacturer {id: 1}), (d:Distributor {id: 1})
  CREATE (m)-[:Produces {cost: 200, lead_time: 5}]->(d)
');

SELECT * FROM cypher('
  MATCH (m:Manufacturer {id: 2}), (d:Distributor {id: 2})
  CREATE (m)-[:Produces {cost: 250, lead_time: 6}]->(d)
');
Enter fullscreen mode Exit fullscreen mode

7 - Create Distributes relationships:

SELECT * FROM cypher('
  MATCH (d:Distributor {id: 1}), (r:Retailer {id: 1})
  CREATE (d)-[:Distributes {cost: 150, lead_time: 4}]->(r)
');

SELECT * FROM cypher('
  MATCH (d:Distributor {id: 2}), (r:Retailer {id: 2})
  CREATE (d)-[:Distributes {cost: 180, lead_time: 3}]->(r)
');
Enter fullscreen mode Exit fullscreen mode

This example creates a simple supply chain graph with two suppliers, two manufacturers, two distributors, and two retailers. The relationships between these entities are defined by the cost and lead time for each step of the process. You can customize the data to match your actual supply chain and use Cypher queries to analyze and optimize the network.

Query the data for insights:
Here are some example Cypher queries to gain insights from the supply chain graph data:

1 - Find all suppliers for a specific manufacturer:

SELECT * FROM cypher('
  MATCH (s:Supplier)-[:Supplies]->(m:Manufacturer)
  WHERE m.id = 1
  RETURN s.name, s.location, m.name
');
Enter fullscreen mode Exit fullscreen mode

2 - Find all retailers that a specific distributor serves:

SELECT * FROM cypher('
  MATCH (d:Distributor)-[:Distributes]->(r:Retailer)
  WHERE d.id = 1
  RETURN d.name, d.location, r.name, r.location
');
Enter fullscreen mode Exit fullscreen mode

3 - Calculate the average lead time from manufacturers to distributors:

SELECT * FROM cypher('
  MATCH (m:Manufacturer)-[p:Produces]->(d:Distributor)
  RETURN avg(p.lead_time) as average_lead_time
');
Enter fullscreen mode Exit fullscreen mode

4 - Find the shortest path between a supplier and a retailer based on cost:

SELECT * FROM cypher('
  MATCH p=(s:Supplier)-[:Supplies|:Produces|:Distributes*]->(r:Retailer)
  WHERE s.id = 1 AND r.id = 1
  RETURN p, reduce(totalCost = 0, rel in relationships(p) | totalCost + rel.cost) AS totalCost
  ORDER BY totalCost
  LIMIT 1
');
Enter fullscreen mode Exit fullscreen mode

5 - Find suppliers with the lowest lead time for a specific manufacturer:

SELECT * FROM cypher('
  MATCH (s:Supplier)-[sup:Supplies]->(m:Manufacturer)
  WHERE m.id = 1
  RETURN s.name, sup.lead_time
  ORDER BY sup.lead_time
  LIMIT 5
');
Enter fullscreen mode Exit fullscreen mode

6 - Find the most efficient distribution route based on a combination of cost and lead time:

SELECT * FROM cypher('
  MATCH p=(s:Supplier)-[:Supplies|:Produces|:Distributes*]->(r:Retailer)
  WHERE s.id = 1 AND r.id = 1
  RETURN p, reduce(totalScore = 0, rel in relationships(p) | totalScore + rel.cost + rel.lead_time) AS totalScore
  ORDER BY totalScore
  LIMIT 1
');
Enter fullscreen mode Exit fullscreen mode

These queries demonstrate different ways to gain insights from the supply chain graph data. You can customize and expand these queries to answer more specific questions about your supply chain and identify opportunities for optimization.

Visualize the results:

You can use graph visualization tools like Apache AGE Viewer to visualize the results of your analysis. These tools can help you understand the structure of your supply chain network and identify areas for improvement.

Related Articles

Supply Chain Optimization using postgreSQL and Apache-Age - Part 1

Contribute to Apache AGE

Apache AGE website: https://age.apache.org/

Apache AGE Github: https://github.com/apache/age

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

Top comments (0)

Heroku

This site is built on Heroku

Join the ranks of developers at Salesforce, Airbase, DEV, and more who deploy their mission critical applications on Heroku. Sign up today and launch your first app!

Get Started

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay