From 2298bc586bea4b29ef2918acf1654ac20d66a4fc Mon Sep 17 00:00:00 2001 From: shkale-msft Date: Wed, 26 Jun 2019 01:13:27 -0700 Subject: [PATCH] Adding sample for shortest path Added a sample for shortest path. This is a new feature introduced in SQL Server 2019 CTP3.1 --- .../ShortestPath/AdventureWorksBOM.png | Bin 0 -> 63081 bytes .../features/sql-graph/ShortestPath/README.md | 67 ++++++++++++++++ .../sql-graph/ShortestPath/ShortestPath.sql | 72 ++++++++++++++++++ .../sql-graph/ShortestPath/setup-BOMGraph.sql | 53 +++++++++++++ 4 files changed, 192 insertions(+) create mode 100644 samples/features/sql-graph/ShortestPath/AdventureWorksBOM.png create mode 100644 samples/features/sql-graph/ShortestPath/README.md create mode 100644 samples/features/sql-graph/ShortestPath/ShortestPath.sql create mode 100644 samples/features/sql-graph/ShortestPath/setup-BOMGraph.sql diff --git a/samples/features/sql-graph/ShortestPath/AdventureWorksBOM.png b/samples/features/sql-graph/ShortestPath/AdventureWorksBOM.png new file mode 100644 index 0000000000000000000000000000000000000000..4e4b99f1bca4208a8a35c43014fc153e167f3fa5 GIT binary patch literal 63081 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%0A+;fjnXD$ZvHq$4)$RZIGMJ#Ing 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 +[Before you begin](#before-you-begin)
+[Run this sample](#run-this-sample)
+[Related links](#related-links) + +## About this sample +1. **Applies to:** + - SQL Server 2019 CTP3.1 (or higher) +2. **Demos:** + - Build and populate graph node and edge tables + - Use SHORTEST_PATH function to compute shortest path + - between 2 given nodes. + - starting from a given node to all other nodes in the graph. + - starting from a given node to all other nodes, which are 1 to 3 hops away from the start node. +3. **Workload:** Queries executed on [AdventureWorks2014](https://github.com/Microsoft/sql-server-samples/releases/download/adventureworks/AdventureWorks2014.bak) +4. **Programming Language:** T-SQL +5. **Author:** Shreya Verma + +## Before you begin +To run these demo scripts, you need the following prerequisites. + +**Account and Software prerequisites:** + +1. SQL Server 2019 CTP3.1 (or higher) +2. SQL Server Management Studio 18.x (or higher) + +## Run This Sample + +### Setup + +#### SQL Server Setup + +1. Download [**AdventureWorks2014.bak**](https://github.com/Microsoft/sql-server-samples/releases/download/adventureworks/AdventureWorks2014.bak) + +2. Launch SQL Server Management Studio, connect to your SQL Server instance (2019) and restore **AdventureWorks2014.bak**. This document describes how to [Restore a Database Backup Using SSMS](https://docs.microsoft.com/en-us/sql/relational-databases/backup-restore/restore-a-database-backup-using-ssms). + + +#### Running the Sample Scripts +1. Once the database is restored, run the *setup-BOMGraph.sql* script to create the necessary graph node and edge tables. We will be using these tables to run our sample queries. The setup file creates Product node table and IsPartOf edge table, which represents the BOM for products in AdventureWorks Cycles manufacturing pipeline. + +![AdventureWorksBOM](AdventureWorksBOM.png) + + +2. Run the *ShortestPath.sql* script to run some SHORTEST_PATH queries. The script has following example queries: + 1. Starting from a given node, find shortest path to all the other nodes in the graph. + 2. Starting from a given node, find shortest path to all the other nodes in the graph, which are 1 -3 hops away from the start node. + 3. Find shortest path between 2 given nodes (start and end node) + + +## Related Links + +For more information about Graph DB in SQL Server 2017, see these articles: + +1. [Graph processing with SQL Server and Azure SQL Database](https://docs.microsoft.com/en-us/sql/relational-databases/graphs/sql-graph-overview) + +2. [SQL Graph Architecture](https://docs.microsoft.com/en-us/sql/relational-databases/graphs/sql-graph-architecture) + +3. [Using MATCH in MERGE DML](https://blogs.msdn.microsoft.com/sqlserverstorageengine/2018/07/16/match-support-in-merge-dml-for-graph-tables/) +4. [Edge Constraints on graph tables](https://blogs.msdn.microsoft.com/sqlserverstorageengine/2018/09/28/public-preview-of-graph-edge-constraints-on-sql-server-2019/) + diff --git a/samples/features/sql-graph/ShortestPath/ShortestPath.sql b/samples/features/sql-graph/ShortestPath/ShortestPath.sql new file mode 100644 index 00000000..60ac808e --- /dev/null +++ b/samples/features/sql-graph/ShortestPath/ShortestPath.sql @@ -0,0 +1,72 @@ +USE AdventureWorks2014 +GO + +------------------------------------------------------------------------------------ +-- Find all assemblies that require a Bearing Ball in the bill of materials +-- Or, Starting with a given node, find shortest paths to all the others nodes in +-- the graph +------------------------------------------------------------------------------------ + +SELECT + P1.ProductID, + P1.Name, + STRING_AGG(P2.Name,'->') WITHIN GROUP (GRAPH PATH) AS [Assembly], + LAST_VALUE(P2.ProductID) WITHIN GROUP (GRAPH PATH) AS [Final ProductID] +FROM + PRODUCT P1, + PRODUCT FOR PATH P2, + ISPARTOF FOR PATH IPO +WHERE + MATCH(SHORTEST_PATH(P1(-(IPO)->P2)+)) + AND P1.ProductID = 2 + ORDER BY P1.ProductID + +------------------------------------------------------------------------------------ +-- Find all products which are up to 3 levels away from Bearing Ball in BOM hierarchy +-- Or, find shortest path from a given start node to all other nodes in the graph, +-- which are 1-3 hops away from the start node. +------------------------------------------------------------------------------------ + +SELECT + P1.ProductID, + P1.Name, + STRING_AGG(P2.Name,'->') WITHIN GROUP (GRAPH PATH) AS [Assembly], + LAST_VALUE(P2.ProductID) WITHIN GROUP (GRAPH PATH) AS [Final ProductID], + COUNT(P2.ProductID) WITHIN GROUP (GRAPH PATH) AS Levels +FROM + PRODUCT P1, + PRODUCT FOR PATH P2, + ISPARTOF FOR PATH IPO +WHERE + MATCH(SHORTEST_PATH(P1(-(IPO)->P2){1,3})) + AND P1.ProductID = 2 + ORDER BY P1.ProductID + + +------------------------------------------------------------------------------------ +-- Find shortest path between 2 given nodes (start node and end node) +-- Note that, to apply filter on the end node, we have to use a subquery +-- but the filter applied on end node in outer query is pushed down while +-- computing the shortest path. +------------------------------------------------------------------------------------ + +SELECT + ProductID, Name, [Assembly], FinalProductID, Levels +FROM ( + SELECT + P1.ProductID, + P1.Name, + STRING_AGG(P2.Name,'->') WITHIN GROUP (GRAPH PATH) AS [Assembly], + LAST_VALUE(P2.ProductID) WITHIN GROUP (GRAPH PATH) AS FinalProductID, + COUNT(P2.ProductID) WITHIN GROUP (GRAPH PATH) AS Levels + FROM + PRODUCT P1, + PRODUCT FOR PATH P2, + ISPARTOF FOR PATH IPO + WHERE + MATCH(SHORTEST_PATH(P1(-(IPO)->P2)+)) + AND P1.ProductID = 2 + ) AS Q + WHERE Q.FinalProductID = 768 + + diff --git a/samples/features/sql-graph/ShortestPath/setup-BOMGraph.sql b/samples/features/sql-graph/ShortestPath/setup-BOMGraph.sql new file mode 100644 index 00000000..9e613dae --- /dev/null +++ b/samples/features/sql-graph/ShortestPath/setup-BOMGraph.sql @@ -0,0 +1,53 @@ +USE AdventureWorks2014 +GO + +-- create product node +CREATE TABLE dbo.Product ( + ProductID INT, + Name NVARCHAR(50), + ProductNumber NVARCHAR(25), + StandardCost money, + ListPrice money, + DaysToManu INT, + Weight decimal(8,2), + SellStartDate datetime, + SellEndDate datetime, +) AS NODE; +GO + +-- populate data into product node from Production.Product table +INSERT INTO dbo.Product +SELECT + p.ProductID, + p.Name, + p.ProductNumber, + p.StandardCost, + p.ListPrice, + p.Weight, + p.DaysToManufacture, + p.SellStartDate, + p.SellEndDate +FROM Production.Product p; +GO + +-- create IsPartOf edge +CREATE TABLE IsPartOf (PerAssemblyQty decimal(8,2)) AS EDGE; +go + +-- Insert into isPartOf edge BOM hierarchy links +INSERT INTO IsPartOf +( + $from_id, + $to_id, + PerAssemblyQty +) +SELECT + P.$node_id, + PP.$node_id, + BOM.PerAssemblyQty +FROM + dbo.Product AS P +JOIN + Production.BillOfMaterials AS BOM ON P.ProductId = BOM.ComponentID +JOIN + dbo.Product AS PP ON PP.ProductID = BOM.ProductAssemblyID