From ce57e7615f1a2105828c9b0e6b62bfd629a849a1 Mon Sep 17 00:00:00 2001 From: shkale-msft Date: Tue, 6 Nov 2018 10:36:17 -0800 Subject: [PATCH 1/3] Adding sample for derived tables and views in graph match query feature --- .../DerivedTablesAndViewsInGraphMatch.sql | 90 ++++ .../README.md | 81 ++++ .../graph-layout.png | Bin 0 -> 29003 bytes .../setup-wwi-graph.sql | 440 ++++++++++++++++++ 4 files changed, 611 insertions(+) create mode 100644 samples/features/sql-graph/DerivedTablesAndViewsInGraphMatch/DerivedTablesAndViewsInGraphMatch.sql create mode 100644 samples/features/sql-graph/DerivedTablesAndViewsInGraphMatch/README.md create mode 100644 samples/features/sql-graph/DerivedTablesAndViewsInGraphMatch/graph-layout.png create mode 100644 samples/features/sql-graph/DerivedTablesAndViewsInGraphMatch/setup-wwi-graph.sql diff --git a/samples/features/sql-graph/DerivedTablesAndViewsInGraphMatch/DerivedTablesAndViewsInGraphMatch.sql b/samples/features/sql-graph/DerivedTablesAndViewsInGraphMatch/DerivedTablesAndViewsInGraphMatch.sql new file mode 100644 index 00000000..0b8a58fb --- /dev/null +++ b/samples/features/sql-graph/DerivedTablesAndViewsInGraphMatch/DerivedTablesAndViewsInGraphMatch.sql @@ -0,0 +1,90 @@ +drop view if exists OperatesIn, CUstomer, Novelty_supplier, Novelty_customer +go + +---------------------------------------------------------------------------- +-- Querying heterogeneous edges +---------------------------------------------------------------------------- +CREATE VIEW OperatesIn AS +SELECT *, 'located' AS relation FROM locatedIn +UNION ALL +SELECT *, 'delivery' FROM deliveryIn +GO + +SELECT SupplierID, SupplierName, PhoneNumber, relation + FROM Supplier, + City, + OperatesIn + WHERE MATCH(Supplier-(OperatesIn)->City) + AND City.CityName = 'San Francisco' + +---------------------------------------------------------------------------- +-- Querying heterogeneous nodes +---------------------------------------------------------------------------- + +CREATE VIEW Customer AS +SELECT SupplierID AS ID, + SupplierName AS NAME, + SupplierCategory AS CATEGORY + FROM Supplier +UNION ALL +SELECT CustomerID, + CustomerName, + CustomerCategory + FROM Customers +GO + + +SELECT Customer.ID, Customer.NAME, Customer.CATEGORY + FROM Customer, + City, + locatedIn + WHERE MATCH(Customer-(locatedIn)->City) + AND City.CityName = 'San Francisco' + + SELECT Customer.ID, Customer.NAME, Customer.CATEGORY + FROM Customer, + City, + OperatesIn + WHERE MATCH(Customer-(OperatesIn)->City) + AND City.CityName = 'San Francisco' + + +---------------------------------------------------------------------------- +-- Querying heterogeneous nodes and edges +---------------------------------------------------------------------------- + + +CREATE VIEW Novelty_Supplier AS +SELECT SupplierID, + SupplierName , + SupplierCategory , + ValidTo + FROM Supplier + WHERE SupplierCategory LIKE '%Novelty%' OR SupplierCategory LIKE '%Toy%' +GO + +CREATE VIEW Novelty_Customer AS + SELECT CustomerID, + CustomerName, + CustomerCategory, + ValidTo + FROM Customers + WHERE CustomerCategory LIKE '%Novelty%' OR CustomerCategory LIKE '%Gift%' +GO + +SELECT Name, ID, Category + FROM +(SELECT SupplierID AS ID, SupplierName AS Name, + SupplierCategory AS Category, ValidTo + FROM Novelty_Supplier WHERE ValidTo > getdate() +UNION ALL + SELECT CustomerID, CustomerName, CustomerCategory, ValidTo + FROM Novelty_Customer WHERE ValidTo > getdate()) AS NoveltyCust, +StockItems, +bought, +OperatesIn, +City + WHERE MATCH(City<-(OperatesIn)-NoveltyCust-(bought)->Stockitems) + AND StockItemName = 'White chocolate snow balls 250g' + AND city.cityname = 'San Francisco' +GO diff --git a/samples/features/sql-graph/DerivedTablesAndViewsInGraphMatch/README.md b/samples/features/sql-graph/DerivedTablesAndViewsInGraphMatch/README.md new file mode 100644 index 00000000..eab2f721 --- /dev/null +++ b/samples/features/sql-graph/DerivedTablesAndViewsInGraphMatch/README.md @@ -0,0 +1,81 @@ +# Derived Tables and Views in Graph Match Queries +SQL Server (starting with SQL Server 2017) and Azure SQL Database now let you create a graph database, to hold your entities and complex many to many relationships. There are several examples on github which demonstrate how the new graph features work. This example shows how you can use derived tables and views created on graph node or edge tables in graph match queries. This feature is in public preview on Azure SQL Database and SQL Server 2019 CTP2.1. + + +To demonstrate the functionality, we will be using WideWorldImporters as our sample database. + +## Contents +[About this sample](#about-this-sample)
+[Before you begin](#before-you-begin)
+[Run this sample](#run-this-sample)
+[Related links](#related-links) + +## About this sample +1. **Applies to:** + - Azure SQL Database v12 (or higher) + - SQL Server 2019 CTP2.1 (or higher) +2. **Demos:** + - Build and populate graph node and edge tables + - Use derived tables and views in graph match queries. +3. **Workload:** Queries executed on [WideWorldImporters](https://github.com/Microsoft/sql-server-samples/releases/tag/wide-world-importers-v1.0) +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. Either + - Azure SQL Database v12 (or higher) + - SQL Server 2019 CTP2.1 (or higher) +2. SQL Server Management Studio 17.x (or higher) + +**Azure prerequisites:** + +1. An Azure subscription. If you don't already have an Azure subscription, you can get one for free here: [get Azure free trial](https://azure.microsoft.com/en-us/free/) + +2. When your Azure subscription is ready to use, you have to create an Azure SQL Database, to do that, you must have completed the first three steps explained in [Design your first Azure SQL database](https://docs.microsoft.com/en-us/azure/sql-database/sql-database-design-first-database) + +## Run This Sample + +### Setup +#### Azure SQL Database Setup + +1. Download the **WideWorldImporters-Standard.bacpac** from the WideWorldImporters database [page](https://github.com/Microsoft/sql-server-samples/releases/tag/wide-world-importers-v1.0) + +2. Import the **WideWorldImporters-Standard.bacpac** bacpac file to your Azure subscription. [This document](https://docs.microsoft.com/en-us/azure/sql-database/sql-database-import) describes how you can restore a bacpac file to your Azure SQL Database. + +3. Launch SQL Server Management Studio and connect to the newly created WideWorldImporters database + + +#### SQL Server Setup + +1. Download [**WideWorldImporters-Full.bak**](https://github.com/Microsoft/sql-server-samples/releases/tag/wide-world-importers-v1.0) + +2. Launch SQL Server Management Studio, connect to your SQL Server instance (2017) and restore **WideWorldImporters-Full.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-wwi-graph.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 the following graph schema + +![DerivedTablesAndViewsInGraphMatch Schema](graph-layout.png) + + +2. Run the *DerivedTablesAndViewsInGraphMatch.sql* script to create derived tables and views on nodes and edges, that can be then used in graph match queries to generate insights. The script demonstrates: + + 1. How to query heterogeneous edges in match query. + 2. How to query heterogeneous nodes in match query. + 3. How to query heterogeneous nodes and edges in match query. + +## 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/DerivedTablesAndViewsInGraphMatch/graph-layout.png b/samples/features/sql-graph/DerivedTablesAndViewsInGraphMatch/graph-layout.png new file mode 100644 index 0000000000000000000000000000000000000000..dc5f6513c3981f9b9acdff63e398dcb2cf91bf79 GIT binary patch literal 29003 zcmcG$1x%f56fM|NC|2Cvi$i;GFYd+NibHWL4lV9lXo2GHR;;+YySuwP%-4HwGH)i6 zN#1)iCn4mV{O6ZX_FjAKwN9}7M{y(se1sP-ULZ+Ih$y~z@v;N_Il)1JPi_m5eu955 z9TdfdUX%A9FJ6>KB0lKDfcNmW5*iLKULd#s{d?JMlV|keh3$%@h@i5I z?qM>lwzAq>;GlI3=57e0?Rbn`M~{>y>(JIv>>WTC|LqJv>?sP z7+OIyR7k?XXr_2@aB%OOq@tptrlzK>EYkI{>krZdbidbR*r7T)I*beqmR459RY(K` z1oZTUeC}5p8ymLIDbDc!oFXbeGjn~e%3}4cyH)$p(9pty$Nkme?Ck79^R|wUkrXOE zw9($d!J7nf{^F97l1aL#b&9kA84`Yvo=5j3Dv2EEbU_-Uz0J)|Hggm_JUmJzA5vB* ze;GbLzHCL>=>n>(+}v0hc%KnCiJUpa-tVNWa54E;LJ%rABp;)K#wZzhAz#vj&&=R^ zBc%TyAJQ{1Iy&0X(XqIgY*e80&!xV~q$?mIh8C)o#>iA5{x^t4X=$WvY*l%AK^9}g z;E4oLrM`kEhfat7e}9t)&7Z2LuCA`2(8~Bc^><>@jY#D=H|vj^EXH#Nua~{Oj~2Mf z)dz~*kq{6N$SEj7LqqF~8NY#(`#}Uh{4pCPH&YfDH@!NTHS7vYV7JoL)g`XEW8-u= zSvmH8zL);NWY@0=1x5|dcx`Lzs($&=dS@iPjBeik`bg*72YF4+&*tW?PYjYYE{3PH(;!nj#}Ir zOe)o>uQu$CSgd!hv>CPkJ4`f4!6F6*20mpM0|_kJ;~0ucN~8QnJ*fH0nmRgj2$SoKjXywCs3G~vS8oHy;0DDRu!mCxNMhWcLfxL99-E&oOEIWF`iY~yskT|x zm6Jn3qrbQt_I^4aO6GaT&~$rwd5MjU?R__%ipneGU?!4=a7xx7>N#I+g-aMB@&eKP z>UfzXLM-g|>Hb)Fa3rC*`FZ*I>6%t4XNBlJX4`ye(;dS6*7kNJG2h+u)A2Lu+Qx>F zNYjYfr%$A78V@hZ+-HPznUoHUj+Yu?-{8KpUHR}3YiM9lizP?H!0?OL^{h9Rx^9z$ znv>I|%@6)&x;zvFhxP8rZgIbBQSDL*%rf`KyUY8V^+>fM^=~M@tSq@Gl`iFz5;YyK zEaMY20;19EEBj7t%RjUfQ~bsYg6CrM*giZQWaCROm$9(0ScRygU$zILP)PYNMx|$> zxRJ|=7rBA;H$m2#>ivYL=f&P|c7A?8zx-rkY>b7EA3{1YGlLsWOG^tzDK)w$6FKwo ze)&0t+lg+kv$GSdpXYUwXSi(g0@0ulj?S-=l9H(JmykWb_w*aP-CgXyH|#PpHr6j~ zIUglAuzgTo5%W^y!1Mk}^h1csO>#S| G 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 data in the bought edge. +INSERT INTO Bought +( + $from_id, + $to_id, + [PurchasedCount] +) +SELECT + C.$node_id, + P.$node_id, + PurchasedCount = COUNT(OD.OrderLineID) +FROM + Sales.OrderLines AS OD +JOIN + Sales.Orders AS OH ON OH.OrderID = OD.OrderID +JOIN + Customers AS C ON C.CustomerID = OH.CustomerID +JOIN + StockItems AS P ON P.StockItemID = OD.StockItemID +GROUP BY + C.$node_id, P.$node_id +GO + +-- Insert Supplier-bought->StockItems data in the bought edge. +INSERT INTO Bought +( + $from_id, + $to_id, + [PurchasedCount] +) +SELECT + S.$node_id, + P.$node_id, + PurchasedCount = COUNT(OD.OrderLineID) +FROM + Sales.OrderLines AS OD +JOIN + Sales.Orders AS OH ON OH.OrderID = OD.OrderID +JOIN + Supplier AS S ON S.SupplierID = OH.CustomerID +JOIN + StockItems AS P ON P.StockItemID = OD.StockItemID +GROUP BY + S.$node_id, P.$node_id +GO + + +------------------------------------------------------------------------------------- +---- Populate FriendOf edge table. +------------------------------------------------------------------------------------- +DECLARE @j INTEGER; +DECLARE @lower INTEGER; +DECLARE @upper INTEGER; +DECLARE @i INTEGER; +DECLARE @random INTEGER; + +SET @upper = 1061 +SET @i = 1 +WHILE (@i <= @upper) +BEGIN + SET @j = 0 + WHILE (@j < 3) + BEGIN + SELECT @random = ROUND(((@Upper - @i) * RAND() + @j), 0) + + INSERT FriendOf($from_id, $to_id) + SELECT C1.$node_id, C2.$node_id + FROM Customers AS C1, Customers AS C2 + WHERE C2.CustomerID = @random --$to_id + AND C1.CustomerID = @i --$from_id + SET @j = @j + 1 + END + SET @i = @i + 1 +END; +GO + + +-- Insert some fixed records in FriendOf table, +-- to be used later in shortest path query +INSERT INTO FriendOf($from_id, $to_id) +SELECT C1.$node_id , C2.$node_id +FROM Customers C1, Customers C2 +where C1.customerID = 1037 +and C2.customerID = 1040 +GO + +INSERT INTO FriendOf($from_id, $to_id) +SELECT C1.$node_id , C2.$node_id +FROM Customers C1, Customers C2 +where C1.customerID = 1040 +and C2.customerID = 1042 +GO + +INSERT INTO FriendOf($from_id, $to_id) +SELECT C1.$node_id , C2.$node_id +FROM Customers C1, Customers C2 +where C1.customerID = 1042 +and C2.customerID = 1028 +GO + +INSERT INTO FriendOf($from_id, $to_id) +SELECT C1.$node_id , C2.$node_id +FROM Customers C1, Customers C2 +where C1.customerID = 1028 +and C2.customerID = 1054 +GO + + + + +------------------------------------------------------------------------------------- +---- Populate locatedIn edge table. +------------------------------------------------------------------------------------- +INSERT INTO locatedIn +( + $from_id, + $to_id +) +SELECT + S.$node_id, + C.$node_id +FROM + Purchasing.Suppliers AS PS +JOIN + Application.Cities AS AC ON PS.PostalCityID = AC.CityID +JOIN + Supplier AS S ON S.SupplierID = PS.SupplierID +JOIN + City AS C ON C.CityID = AC.CityID + + +-- Insert customer - city data +INSERT INTO locatedIn +( + $from_id, + $to_id +) +SELECT + CUS.$node_id, + C.$node_id +FROM + Sales.Customers AS SC +JOIN + Application.Cities AS AC ON SC.PostalCityID = AC.CityID +JOIN + Customers AS CUS ON CUS.CustomerID = SC.CustomerID +JOIN + City AS C ON C.CityID = AC.CityID + + +-- Insert customer locatedIn San Francisco. +-- We will use this data later in queries. +INSERT INTO locatedIn +( + $from_id, + $to_id +) +SELECT + CUS.$node_id, + C.$node_id +FROM + Customers AS CUS, City AS C +WHERE + CUS.CustomerID IN (5,1059,1060,1061,908) + AND + C.cityid = 30378 + + +INSERT INTO locatedIn +( + $from_id, + $to_id +) +SELECT + S.$node_id, + C.$node_id +FROM + Supplier AS S, City AS C +WHERE + S.SupplierID = 2 +AND + C.CityID = 30378 + + + +------------------------------------------------------------------------------------- +---- Populate deliveryIN edge table. +------------------------------------------------------------------------------------- +INSERT INTO deliveryIn +( + $from_id, + $to_id +) +SELECT + S.$node_id, + C.$node_id +FROM + Purchasing.Suppliers AS PS +JOIN + Application.Cities AS AC ON PS.DeliveryCityID = AC.CityID +JOIN + Supplier AS S ON S.SupplierID = PS.SupplierID +JOIN + City AS C ON C.CityID = AC.CityID + + +-- Insert customer - city data +INSERT INTO deliveryIn +( + $from_id, + $to_id +) +SELECT + CUS.$node_id, + C.$node_id +FROM + Sales.Customers AS SC +JOIN + Application.Cities AS AC ON SC.DeliveryCityID = AC.CityID +JOIN + Customers AS CUS ON CUS.CustomerID = SC.CustomerID +JOIN + City AS C ON C.CityID = AC.CityID + + +-- Insert customer deliveryIn San Francisco. +-- We will use this data later in queries. +INSERT INTO deliveryIn +( + $from_id, + $to_id +) +SELECT + CUS.$node_id, + C.$node_id +FROM + Customers AS CUS, City AS C +WHERE + CUS.CustomerID IN (5,1059,1060,1061,908) + AND + C.cityid = 30378 + + +INSERT INTO deliveryIn +( + $from_id, + $to_id +) +SELECT + S.$node_id, + C.$node_id +FROM + Supplier AS S, City AS C +WHERE + S.SupplierID = 2 +AND + C.CityID = 30378 +GO + +------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------- \ No newline at end of file From 433c3b5a8cbfcc4a9198ded2177e7ff2304f6a76 Mon Sep 17 00:00:00 2001 From: Travis Wright Date: Tue, 6 Nov 2018 11:05:47 -0800 Subject: [PATCH 2/3] updating shell script to not look for .exe files on Linux :) --- samples/features/sql-big-data-cluster/bootstrap-sample-db.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/samples/features/sql-big-data-cluster/bootstrap-sample-db.sh b/samples/features/sql-big-data-cluster/bootstrap-sample-db.sh index 33cf879c..29238110 100644 --- a/samples/features/sql-big-data-cluster/bootstrap-sample-db.sh +++ b/samples/features/sql-big-data-cluster/bootstrap-sample-db.sh @@ -23,8 +23,7 @@ KNOX_PASSWORD=${KNOX_PASSWORD:=$SQL_MASTER_SA_PASSWORD} SQL_MASTER_INSTANCE=$SQL_MASTER_IP,31433 KNOX_ENDPOINT=$KNOX_IP:30443 - -for util in sqlcmd.exe bcp.exe kubectl.exe curl.exe +for util in sqlcmd bcp kubectl curl do echo Verifying $util is in path & which $util 1>NUL 2>NUL || (echo Unable to locate $util && exit 1) done From a7c47ceb28c38fe5d8308de112b5eaa728bef4ec Mon Sep 17 00:00:00 2001 From: Mihaela Blendea Date: Tue, 6 Nov 2018 14:13:41 -0800 Subject: [PATCH 3/3] Update deploy-sql-big-data-aks.py --- .../deployment/aks/deploy-sql-big-data-aks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/features/sql-big-data-cluster/deployment/aks/deploy-sql-big-data-aks.py b/samples/features/sql-big-data-cluster/deployment/aks/deploy-sql-big-data-aks.py index 99c9c858..01b333f9 100644 --- a/samples/features/sql-big-data-cluster/deployment/aks/deploy-sql-big-data-aks.py +++ b/samples/features/sql-big-data-cluster/deployment/aks/deploy-sql-big-data-aks.py @@ -68,7 +68,7 @@ command="az group create --name "+GROUP_NAME+" --location "+AZURE_REGION executeCmd (command) print("Creating AKS cluster: "+CLUSTER_NAME) -command = "az aks create --name "+CLUSTER_NAME+" --resource-group "+GROUP_NAME+" --generate-ssh-keys --node-vm-size "+VM_SIZE+" --node-count "+AKS_NODE_COUNT+" --kubernetes-version 1.10.7" +command = "az aks create --name "+CLUSTER_NAME+" --resource-group "+GROUP_NAME+" --generate-ssh-keys --node-vm-size "+VM_SIZE+" --node-count "+AKS_NODE_COUNT+" --kubernetes-version 1.10.8" executeCmd (command) command = "az aks get-credentials --name "+CLUSTER_NAME+" --resource-group "+GROUP_NAME+" --admin"