• Products
    مطابق با جستجوی شما محصولی یافت نشد. توجه فرمایید که در جستجو ترتیب عبارات وارد شده مهم می باشد.

    پایگاه داده گراف در 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)

    - اگر قبلاً به پایگاه داده های گراف نرفته باشید ، این قسمت همان بخشی است که باید به آن عادت کند. اگر بخواهم این را به صورت گرافیکی نمایش دهم ، به صورت زیر خواهد بود:

     پرس و جو از یک پایگاه داده گراف SQL Server

    همانطور که می بینید ، پرس و جو دقیقاً از گراف مفهومی که قبلاً برای رستوران ها و غذاهای آشپزی تهیه کردیم پیروی می کند. و جداول لبه همیشه داخل پرانتز قرار می گیرند. در این حالت ، از جدول لبه isServe برای ارتباط رستوران به FoodBeverages استفاده می شود.

    اکنون ، به پیکان ها توجه کنید. هنگامی که سوابق را در جدول لبه وارد می کنید ، تعریف می کنید که  from_id$ و  to_id $چیست. این از جایی شروع می شود که پیکان شروع و پایان یابد.

    استعلام پایگاه داده های گراف ساده تر و طبیعی تر است زیرا اساساً از مدل مفهومی پیروی می کند.

    قبل از اینکه با این مثال به پایان برسیم ، در زیر مجموعه نتایج آمده است:

    پرس و جو از یک پایگاه داده گراف SQL Server

    مثال 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

    پرس و جو از یک پایگاه داده گراف SQL Server

    خوب است ، نه؟

    از آنجا که هم از محل رستوران و هم از مشتری اطلاع داریم ، می توانیم فاصله بین آنها را با استفاده از نوع داده جغرافیایی و عملکرد 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. این در گراف زیر نشان داده شده است:

    پرس و جو از یک پایگاه داده گراف SQL Server

    بند WHERE با MATCH برای عبور از گراف به این ترتیب ساخته شده است. برای فیلتر کردن بیشتر شرایط و بدست آوردن سوابق دقیق مورد نظر ما ، شرایط لازم به بند WHERE پیوست می شود:

    AND fb1.FoodBeverageID = 16 - برای سفارشات با Berry Pomegranate Power

    AND fb2.FoodBeverageID <> 16 - برای همان سفارشات با موارد دیگری به غیر از Berry Pomegranate Power

    و نتیجه؟ لطفا پایین را ببینید:

    پرس و جو از یک پایگاه داده گراف SQL Server

    مثال 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 زیر به صورت گرافیکی نشان داد:

    پرس و جو از یک پایگاه داده گراف SQL Server

    AND r1.RestaurantID <> 4 AND r2.RestaurantID = 4

    و مانند مثال قبلی ، به 2 شرط لازم نیز نیاز داریم:

    ابتدا مشتریانی که از Jamba Juice سفارش داده اند (RestaurantID = 4).

    سپس ، همان مشتریانی که از رستوران های دیگری به غیر از آب میوه جمبا نیز سفارش داده اند (RestaurantID <> 4).

    و قبل از اینکه فراموش کنیم ، در زیر رستوران هایی وجود دارد که مردم به غیر از آب جامبا نیز از آنها سفارش داده اند:

     پرس و جو از یک پایگاه داده گراف SQL Server

    بنابراین ، چطور دوست دارید تاکنون جداول گراف را پرس و جو کنید؟

    آیا تعجب می کنید که آیا همه اینها ارزش آن را دارند؟ با استفاده از یک مدل رابطه ای نیز می توانیم همین کار را انجام دهیم.

    در واقع ، ممکن است در قسمت بعدی غافلگیر شوید.

    توضیحات خود را بنویسید

    back to top
    فیلترگذاری