پایگاه داده گراف در Sql Server - قسمت شش: پرس و جو از یک پایگاه داده گراف SQL Server
پرس و جو از همه چیز در جدول گره به آسانی ABC است:
SELECT * from Restaurants
خودشه! و می توانید همین کار را در جدول های لبه ای انجام دهید.
با این وجود ، پرس و جو از 2 جدول گره مربوطه برای استفاده از عملکرد MATCH در بند WHERE نیاز به 2 جدول گره و 1 جدول لبه دارد. با آنچه که ما از JOIN ها استفاده نخواهیم کرد کاملاً متفاوت است. بیایید با یک پرس و جو ساده با استفاده از MATCH شروع کنیم. با این کار تمام رستوران ها و غذایی که آنها سرو می کنند نمایش داده می شود.
مثال 1: استفاده از MATCH
SELECT Restaurants.Name, FoodBeverages.Name, FoodBeverages.Amount
FROM Restaurants, isServed, FoodBeverages
WHERE MATCH(FoodBeverages<-(isServed)-Restaurants)
بیایید کوئری را تفکیک کنیم:
رستوران ها را انتخاب کنید. نام ، FoodBeverages. نام ، FoodBeverages. مقدار
- این به سادگی مشخصات (ستون ها) گره را لیست می کند. برای ارجاع به خصوصیات می توانید از نام جدول یا نام مستعار جدول استفاده کنید.
از رستوران ها ، سرویس خوراکی ، نوشیدنی های غذایی
- بند FROM شامل تمام جداول گره و لبه مورد نیاز شما در پرس و جو است. در این حالت ، جداول گره رستوران ها و FoodBeverages و جدول لبه isServe. اگر مدت زمان زیادی است که عبارات SQL را برنامه نویسی می کنید ، به نظر می رسد نحوه استاندارد شبیه SQL-89 می باشد:
SELECT.
WHERE MATCH(FoodBeverages<-(isServed)-Restaurants)
- اگر قبلاً به پایگاه داده های گراف نرفته باشید ، این قسمت همان بخشی است که باید به آن عادت کند. اگر بخواهم این را به صورت گرافیکی نمایش دهم ، به صورت زیر خواهد بود:
همانطور که می بینید ، پرس و جو دقیقاً از گراف مفهومی که قبلاً برای رستوران ها و غذاهای آشپزی تهیه کردیم پیروی می کند. و جداول لبه همیشه داخل پرانتز قرار می گیرند. در این حالت ، از جدول لبه isServe برای ارتباط رستوران به FoodBeverages استفاده می شود.
اکنون ، به پیکان ها توجه کنید. هنگامی که سوابق را در جدول لبه وارد می کنید ، تعریف می کنید که from_id$ و to_id $چیست. این از جایی شروع می شود که پیکان شروع و پایان یابد.
استعلام پایگاه داده های گراف ساده تر و طبیعی تر است زیرا اساساً از مدل مفهومی پیروی می کند.
قبل از اینکه با این مثال به پایان برسیم ، در زیر مجموعه نتایج آمده است:
مثال 2: استفاده از MATCH
این بار ، بیایید مثال دیگری را امتحان کنیم که ممکن است در وب سایت سیستم تحویل غذا مشترک باشد. تصور کنید که مشتری برای اولین بار غذا سفارش می دهد. از آنجا که گرسنه است ، دوست دارد از نزدیکترین رستوران غذا سفارش دهد.
در این مثال ، مشتری Fletcher (CustomerID = 3) در دانشکده پزشکی دانشگاه آتنئو مانیل است (LocationID = 7). او باید از رستوران های مجاور واقع در فاصله 1000 متری او مطلع شود. این همان چیزی است که از پرس و جو ایجاد خواهد شد:
-- this will be used to store Fletcher's location - the place where the
-- order will be delivered
DECLARE @deliveryLocation GEOGRAPHY-- Get the location of Fletcher. We assume that Fletcher defined his location from his account with a map.
SELECT @deliveryLocation = Locations.GeoLocation
FROM Customers, willReceiveIn, Locations
WHERE MATCH(Customers-(willReceiveIn)->Locations)
AND Customers.CustomerID = 3-- Get the restaurants within 1000m from Fletcher's location
SELECT
Restaurants.Name
,Restaurants.Description
,Restaurants.Opening
,Restaurants.Closing
,Locations.Description
,ROUND(Locations.GeoLocation.STDistance(@deliveryLocation),2) AS Distance
FROM Restaurants, isLocated, Locations
WHERE MATCH(Restaurants-(isLocated)->Locations)
AND locations.GeoLocation.STDistance(@deliveryLocation) <= 1000
ORDER BY Distance
خوب است ، نه؟
از آنجا که هم از محل رستوران و هم از مشتری اطلاع داریم ، می توانیم فاصله بین آنها را با استفاده از نوع داده جغرافیایی و عملکرد STDistance اندازه گیری کنیم. من در پست بعدی بیشتر در مورد نوع داده جغرافیایی توضیح خواهم داد.
مثال 3: پاسخ دادن به "افرادی که <food item> سفارش دادند نیز سفارش دادند ..."
اکنون ، از آنجا که این سیستم از یک توصیه در زمان واقعی استفاده می کند ، بیایید کمی پیچیده تر مانند برگرداندن نتیجه برای "افرادی که <ماده غذایی> نیز سفارش داده اند ..."
در این مثال ، ما می خواهیم بدانیم که افراد هنگام سفارش Berry Pomegranate Power (FoodBeverageID = 16) از آب جامبا چه چیز دیگری سفارش می دهند.
SELECT
fb2.Name
FROM Orders o1, isIncluded ii1, OrderDetails od1, includes i1, FoodBeverages fb1
,isIncluded ii2, OrderDetails od2, includes i2, FoodBeverages fb2
WHERE MATCH(fb1<-(i1)-od1<-(ii1)-o1-(ii2)->od2-(i2)->fb2)
AND fb1.FoodBeverageID = 16
AND fb2.FoodBeverageID <> 16
بیایید کوئری را تفکیک کنیم.
از سفارشات o1 ، شامل ii1 ، سفارش جزئیات od1 ، شامل i1 ، FoodBeverages fb1
، isIncluded ii2 ، OrderDetails od2 ، شامل i2 ، FoodBeverages fb2 است
برای رسیدن به نتیجه مورد نظر ما 2 چیز وجود دارد:
سفارشات حاوی توت بری انار (FoodBeverageID = 16). این امر با ذکر جدول های Order o1، isIncluded ii1، OrderDetails od1، شامل i1، FoodBeverages fb1 انجام می شود.
همین سفارشات حاوی موارد دیگری غیر از Berry Pomegranate Power (FoodBeverageID <> 16) است. این کار با اضافه کردن isIncluded ii2 ، OrderDetails od2 ، شامل i2 ، FoodBeverages fb2 انجام می شود.
ما دو برابر جدول گره و لبه را اضافه کردیم تا 2 شرط بالا را برآورده کنیم.
WHERE MATCH (fb1 <- (i1) -od1 <- (ii1) -o1- (ii2) -> od2- (i2) -> fb2)
این مسیر رسم گراف از FoodBeverages است <- OrderDetails <- Order -> OrderDetails -> FoodBeverages. این در گراف زیر نشان داده شده است:
بند WHERE با MATCH برای عبور از گراف به این ترتیب ساخته شده است. برای فیلتر کردن بیشتر شرایط و بدست آوردن سوابق دقیق مورد نظر ما ، شرایط لازم به بند WHERE پیوست می شود:
AND fb1.FoodBeverageID = 16 - برای سفارشات با Berry Pomegranate Power
AND fb2.FoodBeverageID <> 16 - برای همان سفارشات با موارد دیگری به غیر از Berry Pomegranate Power
و نتیجه؟ لطفا پایین را ببینید:
مثال 4: پاسخ دادن به "افرادی که از <Restaurant> سفارش دادند نیز از .. سفارش دادند"
بیایید توصیه دیگری را امتحان کنیم.
در این مثال ، ما پاسخ خواهیم داد "افرادی که از Jamba Juice سفارش دادند نیز از from سفارش دادند".
بیایید با استفاده از گره ها و لبه های مختلف از همان منطق استفاده کنیم. در اینجا می رود:
SELECT DISTINCT
r1.Name
,r1.Description
,r1.Opening
,r1.Closing
FROM Restaurants r1, received rcv1, Orders o1, ordered ord1, Customers c
,Restaurants r2, received rcv2, Orders o2, ordered ord2
WHERE MATCH(r1-(rcv1)->o1<-(ord1)-c-(ord2)->o2<-(rcv2)-r2)
AND r1.RestaurantID <> 4
AND r2.RestaurantID = 4
باز هم ، بیایید تشریح کنیم:
از رستوران های r1 ، دریافت rcv1 ، سفارشات o1 ، سفارش سفارش ، مشتریان ج
، رستوران ها r2 ، rcv2 دریافت کردند ، سفارشات o2 ، سفارش ord2
مسیر گراف مورد نیاز ما Restoran-> سفارشات <- مشتری- سفارشات <-رستوران است.
WHERE MATCH (r1- (rcv1) -> o1 <- (ord1) -c- (ord2) -> o2 <- (rcv2) -r2)
این بند را می توان با استفاده از شکل 11 زیر به صورت گرافیکی نشان داد:
AND r1.RestaurantID <> 4 AND r2.RestaurantID = 4
و مانند مثال قبلی ، به 2 شرط لازم نیز نیاز داریم:
ابتدا مشتریانی که از Jamba Juice سفارش داده اند (RestaurantID = 4).
سپس ، همان مشتریانی که از رستوران های دیگری به غیر از آب میوه جمبا نیز سفارش داده اند (RestaurantID <> 4).
و قبل از اینکه فراموش کنیم ، در زیر رستوران هایی وجود دارد که مردم به غیر از آب جامبا نیز از آنها سفارش داده اند:
بنابراین ، چطور دوست دارید تاکنون جداول گراف را پرس و جو کنید؟
آیا تعجب می کنید که آیا همه اینها ارزش آن را دارند؟ با استفاده از یک مدل رابطه ای نیز می توانیم همین کار را انجام دهیم.
در واقع ، ممکن است در قسمت بعدی غافلگیر شوید.
توضیحات خود را بنویسید