عنوان الگوهای معماری داده NoSQL ( بخش دوم )
نوع منبع مقاله
گروه NoSQL
تاریخ انتشار ۲۵ / ۱۰ / ۱۳۹۴
خلاصه بانک های اطلاعاتی گراف از مدل گراف جهت ذخیره داده استفاده می نمایند . در این مدل ، ساختار گراف شامل رئوس و یال ها به عنوان دو موجودیت مهم هر نوع گراف مدل سازی می گردد . Neo4j ، نمونه ای از یک بانک اطلاعاتی گراف است که به کمک آن می توان مسایل گراف را با کارآیی بهتر و ظرافت بیشتر حل کرد .Neo4j دارای جایگاهی برجسته در خانواده بزرگ NoSQL است . در این بخش بر روی دومین الگوی معماری داده NoSQL با نام Graph store متمرکز شده و با آن آشنا خواهیم شد .

در بخش اول با الگوهای معماری داده NoSQL آشنا شدیم و به معرفی اولین الگوی معماری داده Key-value store پرداختیم . در این بخش بر روی دومین الگوی معماری داده NoSQL با نام Graph store متمرکز شده و با آن آشنا خواهیم شد .هدف اصلی این بخش ، آشنایی با ویژگی های یک Graph store ، نحوه استفاده از Graph store به منظور حل مسایل کسب و کار ، آشنایی با واژه ها و اصطلاحات گراف نظیر گره ها ، روابط ، خصلت  و در نهایت کاربرد Graph store در عمل است .

رد پای گراف در علم کامپیوتر
علم کامپیوتر ارتباط بسیار نزدیکی با علم ریاضی دارد و بسیاری از مفاهیم آن ریشه در ریاضیات دارد . الگوریتم ها ، رمزنگاری ، محاسبات  و حتی  تئوری های پایه منطق ریاضی و جبر بولی از جمله  مفاهیم ریاضی می باشند که دارای جایگاه برجسته ای در دنیای کامپیوتر می باشند . یکی دیگر از موضوعات مهم ریاضی که می توان حضور فعال و جدی آن را در بسیاری از کتاب ها و مقالات  کامپیوتری مشاهده کرد ، تئوری گراف است . در علم کامپیوتر ، از گراف جهت ارایه ساختارهای داده خاص نظیر سلسله مراتب سازمانی ، شبکه های اجتماعی ، جریان های کاری و ... استفاده می شود .
تاکنون  از گراف در ابعاد گسترده ای در زمان ایجاد فرآیندهای نرم افزار استفاده شده است ولی این روند در حال تغییر است و بسیاری از پیاده کنندگان تمایل دارند ضمن فراموش کردن گذشته ، با نگاهی نو و این مرتبه در جهت نگهداری داده به آن توجه نمایند .  ما تاکنون نهایت سعی خود را داشته ایم که داده را درون جداول و ستون های بانک های اطلاعاتی رابطه ای قرار دهیم و در ادامه ساختار آن را نرمالیزه و یا  از حالت نرمالیزه خارج کنیم  تا به چیزی که در عمل می خواهیم ، دست یابیم .
بانک های اطلاعاتی گراف از مدل گراف جهت ذخیره داده استفاده می نمایند . در این مدل ، ساختار گراف شامل رئوس  و یال ها ( به عنوان دو موجودیت مهم مدل سازی هر نوع گراف ) مدل سازی می گردد .علاوه بر این ، می توان از تمامی الگوریتم های موجود تئوری گراف ( با توجه به قدمت طولانی آن )  برای حل مسائل گراف با کارآیی بیشتر و در زمان کمتر نسبت به بانک های اطلاعاتی رابطه ای استفاده کرد. Neo4j ، نمونه ای از یک بانک اطلاعاتی گراف است که به کمک آن می توان مسایل گراف را با کارآیی بهتر و ظرافت بیشتر حل کرد .Neo4j  دارای جایگاهی برجسته در خانواده بزرگ NoSQL است .
شکل 1 ، یک نمونه ساختار گراف جهت ذخیره سازی داده کاربران به همراه دوستان هر یک را نشان می دهد  .

یک نمونه بانک اطلاعاتی گراف برای ذخیره کاربران و دوستان مرتبط به هر یک
شکل 1 : شکل 1 : یک نمونه بانک اطلاعاتی گراف برای ذخیره کاربران و دوستان مرتبط به هر یک

مروری بر Graph store
الگوی معماری داده Graph stores در برنامه هایی که نیازمند تحلیل روابط بین اشیاء و یا مشاهده تمامی گره ها در یک گراف می باشند، حائز اهمیت است. معماری فوق برای ذخیره موثر گره های گراف و ارتباطات بهینه بسیار کارساز است و می توان بر روی یک گراف query مورد نظر خود را اجراء کرد . این نوع بانک های اطلاعاتی برای هر نوع مساله کسب و کار که دارای ارتباطاتی پیچیده بین اشیاء می باشند ، مفید است . شبکه های اجتماعی ، موتورهای مبتنی بر قواعد ، ایجاد mashups و تحلیل ساختارهای پیچیده شبکه نمونه هایی از کاربرد الگوی معماری داده Graph store می باشند .
Graph store ، سیستمی است که شامل دنباله ای از گره ها و ارتباطات است که با ترکیب آنها با یکدیگر یک گراف ایجاد می گردد. همانگونه که در بخش اول  اشاره گردید، معماری داده key-value store شامل دو فیلد key و value است . در مقابل ، در یک Graph store از سه فیلد اساسی داده با نام گره ،  روابط  و خصلت استفاده می شود. به برخی از گراف ها به دلیل ساختار node-relationship-node ، اصطلاحا triple stores گفته می شود شکل 2 ، ماهیت یک بانک اطلاعاتی گراف را نشان می دهد .

ساختار یک بانک اطلاعاتی گراف
شکل 2 : ساختار یک بانک اطلاعاتی گراف

زمانی که دارای آیتم های زیادی می باشیم که با یکدیگر روابط  پیچیده ای دارند و هر یک نیز دارای خصلت های مختص به خود می باشند، استفاده از Graph stores  بسیار مناسب است . در Graph store امکان اجرای query ساده وجود دارد و می توان به عنوان نمونه نزدیک ترین همسایه و یا الگوی خاصی را پیدا کرد . مثلا اگر از یک بانک اطلاعاتی رابطه ای برای ذخیره لیستی از دوستان خود استفاده کرده باشید ، می توان لیست مرتب شده ای بر اساس نام خانوادگی از دوستان خود را تولید و در خروجی نمایش داد . در صورت استفاده از  graph store ، نه تنها می توان لیستی از دوستان خود را بر اساس نام خانوادگی پیدا کرد ، همچنین  می توان لیستی از دوستان خود را که علاقه مند به مطالعه کتاب های علمی می باشند نیز پیدا کرد . Graph stores ، صرفا به این موضوع اکتفاء نمی کند که به شما بگوید بین دو گره یک رابطه وجود دارد بلکه قادر به ارایه گزارشات تکمیلی همراه با جزییات مورد نیاز در خصوص هر یک از روابط موجود است.
گره های گراف معمولا بیانگر اشیاء دنیای واقعی نظیر اسامی می باشند . گره ها می توانند افراد ، سازمان ها ، شماره تلفن ، صفحات وب ، کامپیوترهای موجود بر روی یک شبکه و یا حتی سلول های بیولوژیکی در یک ارگانیزم زنده باشند . ارتباطات را می توان به منزله اتصالات بین اشیاء درنظر گرفت که معمولا به صورت کمان در دیاگرام ها نشان داده می شوند . اجرای یک query بر روی یک گراف ، مشابه حرکت کردن بین گره ها در یک گراف است . به عنوان نمونه می توان با اجرای یک query به درخواست هایی مشابه زیر پاسخ داد:
  •  کوتاهترین مسیر بین دو گره موجود در گراف چیست ؟
  •  چه گره ای دارای همسایگانی با خصلت های خاصی است ؟
  •  با دادن دو گره در گراف ، تا چه میزان همسایگان آن به هم شبیه هستند ؟
  •  متوسط ارتباطات بین نقاط مختلف گراف با یکدیگر  چه میزان است ؟
همانگونه که قبلا اشاره گردید ، در سیستم های مدیریت بانک اطلاعاتی رابطه ای (RDBMS ) از اعداد به عنوان کلید اصلی و خارجی برای ارتباط سطرها در جداولی که در بخش های مختلف یک هارد دیسک ذخیره شده اند ، استفاده می گردد . انجام عملیاتی نظیر Join در RDBMS دارای هزینه بالایی است و علاوه بر تاخیر در انجام عملیات ، I/O زیادی را نیز به دنبال خواهد داشت. Graph store ، گره ها را با یکدیگر مرتبط می نماید و متوجه این موضوع می شود که دو گره با شناسه یکسان ،گره های مشابه هستند . Graph stores به گره ها شناسه های داخلی را نسبت می دهد و از این شناسه ها برای Join شبکه ها به یکدیگر استفاده می کند. بر خلاف RBDMS ، در Graph stores عملیات Join سبک تر بوده و کار با سرعت به مراتب بیشتری انجام می شود . علت این کار به ماهیت کوچک هر گره و قابلیت نگهداری گراف در RAM برمی گردد . این بدان معنی است که گراف درون حافظه بارگذاری می شود و بازیابی داده نیازمند عملیات I/O نمی باشد .
برخلاف سایر الگوهای  NoSQL ، مقیاس پذیری Graph stores بر روی چندین سرویس دهنده دارای چالش های مختص به خود است . در چنین مواردی . می توان داده را بر روی چندین سرویس دهنده تکرار کرد تا امکان خواندن و کارآیی اجرای query بهتر گردد . ولی نوشتن بر روی چندین سرویس دهنده و اجرای query بر روی گرافی که گره های آن بین چندین سرویس دهنده توزیع شده اند دارای پیچیدگی ها مختص به خود است .
با این که Graph stores بر اساس واقعیت ساختار داده node-relationship-node ایجاد می گردد ولی می تواند دارای پیچیدگی های مختص به خود باشد و حتی در برخی موارد ناسازگار به نظر آید . روش تعامل با Graph stores مشابه سایر بانک های اطلاعاتی است : داده بارگذاری می گردد ، query بر روی آن اجرا می شود و در صورت لزوم داده بهنگام و یا حذف می گردد. تفاوت به نوع query استفاده شده برمی گردد . یک query گراف ، مجموعه ای از گره های مورد نیاز برای ایجاد یک graph image و نمایش ارتباطات بین داده را برمی گرداند .

واژه ها و اصطلاحات Graph store
اجازه دهید ، نگاهی داشته باشیم به اصطلاحات مختلفی که از آنها جهت تشریح نوع های مختلف گراف استفاده می گردد. همانگونه که در صفحات وب مشاهده کرده اید ، لینک های موجود بر روی یک صفحه وب شما را به سمت صفحه دیگر هدایت می کنند. این لینک ها می توانند توسط یک گراف نمایش داده شوند . صفحه وب موجود اولین و یا گره مبداء است . لینک ، کمانی است که به صفحه دوم اشاره می کند و دومین صفحه مقصد ، گره دوم است. در این مثال ، اولین گره توسط URL صفحه مبداء نشان داده می شود و دومین گره و یا مقصد ، URL صفحه مقصد است . این فرآیند ارتباطی بین صفحات ، می تواند در مکان های مختلفی بر روی وب مشاهده شود. شکل 3 ، یک نمونه Graph store شامل یک صفحه وب و ارتباط آن به دو صفحه وب را نشان می دهد.
 
 استفاده از گراف برای ارایه یک صفحه وب به همراه لینک به سایر صفحات
شکل 3 : استفاده از گراف برای ارایه یک صفحه وب به همراه لینک به دو صفحه دیگر

شکل 4 ، نحوه پیاده سازی گراف برای ارایه یک صفحه وب به همراه لینک به دو صفحه دیگر را نشان می دهد .
 
 نحوه پیاده سازی گراف برای ارایه یک صفحه وب به دو صفحه دیگر
شکل 4 : نحوه پیاده سازی گراف برای ارایه یک صفحه وب به همراه لینک به دو صفحه دیگر

همانگونه که در شکل 4 ملاحظه می شود، URL صفحه وب مبداء به عنوان یک Property URL ذخیره شده است و هر لینک ، بیانگر یک رابطه است که دارای خصلتی با نام : "points to " است .هر لینک از طریق خصلت فوق به  URL صفحه مقصد اشاره می کند . .مفهوم استفاده از URLs برای شناسایی گره ها جذاب است ، چراکه توسط انسان قابل خواندن است و ساختاری درون URL را ارایه می نماید. W3C این ساختار را به منظور ذخیره اطلاعات لینک های بین صفحات (همانند لینک بین اشیاء درون یک RDF برگرفته شده از  Resource Description Format که  در واقع یک مدل داده متادیتا می باشد) ، استاندارد کرده است.

مثال
در این بخش به کاربرد Graph store به منظور حل دو نمونه از مسایل کسب و کار اشاره ای مختصر خواهیم داشت .
  •  Link analysis: زمانی استفاده می شود که قصد جستجو و یافتن الگوها و ارتباطاتی را در مواردی نظیر شبکه های اجتماعی ، تلفن و یا رکوردهای ایمیل داشته باشیم.
  •  Integrating Linked data: به منظور کار با حجم بالایی از داده لینک شده باز (open Linked data) برای یکپارچه سازی بلادرنگ و ایجاد mashup بدون ذخیره داده استفاده می شود. Mashup ، یک صفحه وب و یا یک برنامه وب است که محتویات خود را از بیش از یک منبع دریافت و یک سرویس جدید را در قالب یک اینترفیس گرافیکی ارایه می نماید. مثلا می توان با ترکیب آدرس ها و تصاویر شعب یک شرکت بزرگ به همراه  google map ، یک map mashup را ایجاد کرد.
  Link analysis
 در برخی موارد ، پیمایش داده گراف بهترین روش برای حل یک مساله کسب و کار است . به عنوان نمونه می توان به شبکه های اجتماعی اشاره کرد . شکل 5 ، نمونه ای از  یک شبکه اجتماعی را نشان می دهد . در این شکل هر فرد به صورت یک دایره مشخص شده است و بین دو فرد در صورت وجود ارتباط ، یک لینک برقرار شده است.هر یک از افراد با توجه به تعداد ارتباطات با سایر افراد بر روی گراف نشان داده شده اند . در شکل فوق، وضعیت ارتباطی یک کاربر نسبت به همکاران سابق خود در شرکت یاهو( رنگ سبز) و تحلیل گران گوگل ( رنگ صورتی ) مشخص شده است .  همچنین ، وضعیت ارتباط وی با سایر همکاران و دوستان در شبکه اجتماعی LinkedIn ( رنگ آبی ) و هم کلاسی ها در دانشگاه کارنگی ملون( رنگ نارنجی) مشخص شده است .

 یک گراف شبکه اجتماعی
شکل 5 : یک گراف شبکه اجتماعی
 
به موازات این که به لیست دوستان خود افراد جدیدی را اضافه می کنید ، ممکن است به دنبال این موضوع باشید که آیا دوست مشترکی بین شما وجود دارد . در ابتدا لازم است ، لیستی از دوستان خود را داشته باشد و برای هر یک از آنها که در لیست شما می باشند ، لیست دوستان آنها را داشته باشید (friends-to-friends ) . فرض کنید بخواهیم چنین کاری را توسط یک بانک اطلاعاتی رابطه ای انجام دهیم ، پس از اولین مرحله  ، کارآیی سیستم به شدت افت پیدا خواهد کرد . انجام این نوع تحلیل ها به کمک یک سیستم مدیریت بانک اطلاعاتی رابطه ای می تواند خیلی کند باشد. در شبکه های اجتماعی ، شما می توانید جدولی با نام friends برای هر شخص با سه ستون ID نفر اول و ID نفر دوم و نوع ارتباط بین آنها ( خانوادگی ، دبیرستانی و ... ) بسازید . در ادامه می توان ، بر روی دو فیلد نفر اول و نفر دوم ایندکس ایجاد کرد تا یک RDBMS بتواند به سرعت لیست دوستان شما و لیست دوستان دوستان شما را در اختیار شما قرار دهد. ولی اگر بخواهیم به سراغ سطح بعدی برویم یک query دیگر لازم است . به موازات این که کار ساخت ارتباطات را ادامه می دهیم ، اندازه query نیز به سرعت رشد پیدا می کند. اگر ما دارای 100 دوست باشیم و هر یک دارای 100 دوست باشد ، query از نوع friends-of-friends و یا سطح دوم دوستان ، 000 ، 10 ( 100 * 100 ) سطر را برمی گرداند . همانگونه که حدس زده اید، انجام این نوع query در SQL پیچیده است . Graph stores این نوع عملیات را به مراتب سریعتر و با استفاده از روش هایی که عملیات ادغام و حذف گره های ناخواسته از حافظه را به دنبال دارد ، انجام می دهد. Graph stores دارای شفافیت و سرعت به مراتب بیشتری جهت انجام کارهایی نظیر تحلیل لینک ها است. آنها معمولا به حافظه RAM مناسبی نیاز دارند تا بتوانند تمامی لینک ها را در زمان تحلیل  در حافظه نگهداری نمایند .

 استفاده از گراف ها برای پردازش datasets عمومی
از Graph stores می توان جهت تحلیل داده یی که توسط سازمان شما تولید نشده است  نیز استفاده کرد . فرض کنید بخواهیم بر روی سه dataset مختلف که توسط سه سازمان مختلف تولید شده اند ، کار کنیم . این سازمان ها حتی ممکن است از وجود هم باخبر نباشند. شما چطور می توان dataset آنها را بطور اتوماتیک Join کرد تا اطلاعات مورد نیاز خود را کسب کرد ؟ استفاده از ابزارهایی که به آنها Linked open data یا LOD می گویند یکی از روش های موثر در این رابطه است . می توان LOD را به منزله یک روش یکپارچه سازی برای Join بین datasets مختلف جهت ایجاد برنامه های جدید در نظر گرفت . استراتژی های LOD برای هر فردی که کار تحقیقات و یا تحلیل را با استفاده از datasets عمومی انجام می دهد بسیار حائز اهیمت است . این تحقیقات می تواند شامل مواردی نظیر هدف گذاری بر روی مشتریان خاصی ، تجزیه و تحلیل رویکرد بازار ، تجزیه و تحلیل احساسات ، تحلیل متون و یا ایجاد سرویس های جدید اطلاعات باشد. ترکیب مجدد داده به اشکال جدید ، فرصت هایی را برای کسب و کارهای جدید فراهم می کند.به موازات رشد LOD ، فرصت های جدیدی برای سرمایه گذاری کسب و کار جدید فراهم می گردد که با ترکیب و غنی سازی این نوع اطلاعات محقق می گردد . با ادغام  LOD ،  مجموعه داده های جدیدی از طریق ترکیب اطلاعات دو و یا چندین dataset عمومی در دسترس ایجاد می گردد که دارای ساختار LOD نظیر RDF و URI می باشند. در شکل 6 ، نمونه هایی از سایت های LOD متداول که به آن دیاگرام LOD Cloud می گویند نشان داده شده است .

 یک ابر LOD
شکل 6 : یک ابر LOD (منبع : http://lod-cloud.net )

در مرکز دیاگرام ابری LOD ، سایت هایی وجود دارد که دارای تعداد زیادی dataset همه منظوره هستند .این سایت ها شامل  هاب سایت های LOD نظیر  DBPedia و یا Freebase می باشند . DBPedia ، وب سایتی است که تلاش می کند با برداشت حقایق  از ویکی پدیا آنها را به RDF تبدیل کند. در واقع DBpedia ماحصل یک تلاش گروهی با هدف استخراج اطلاعات از ویکی پدیا و ارایه آنها در وب با یک ساختار مشخص جهت اجرای query مورد نظر است . پس از یافتن سایتی که حاوی اطلاعات RDF است ، می توان به دو صورت مختلف آن را پردازش کرد :
  • دانلود تمامی فایل های داده RDF از سایت و بارگذاری آنها درون Graph store  . برای مجموعه های بزرگ RDF نظیر DBPedia که شامل میلیاردها ارتباط است این روش در عمل غیر ممکن است .
  • روش دوم که دارای کارآیی بیشتری است ، یافتن یک سرویس وب برای سایت RDF است که به آن SPARQL endpoint می گویند. این گونه سرویس های وب ، امکان اجرای SPARQL را فراهم می نمایند  . SPARQL ، یک زبان Query مبتنی بر RDF است که از آن برای بازیابی و پردازش داده ذخیره شده با قالب RDF استفاده می گردد.

 خلاصه
در این بخش با Graph stores به عنوان دومین  الگوی معماری داده NoSQL آشنا شدیم . در این مدل ، داده در مجموعه ای از گره ها ، روابط و خصلت ها ذخیره می شود. اجرای یک query بر روی یک Graph strore و پیمایش آن از مهمترین عملیات بر روی یک گراف است . این الگوی معماری داده در مواردی که روابط بین داده بسیار حیاتی می باشند ، مناسب است . سرعت بالای جستجو ، کار با مجموعه داده لینک شده عمومی از مزایای مهم این مدل محسوب می گردد. از معایب این مدل می توان به قابلیت اندک مقیاس پذیری آن اشاره کرد . این وضعیت زمانی محقق می شود که نتوان گراف را در حافظه RAM مستقر کرد .
Neo4J , AllegroGraph , Bigdata triple store , InfinitGraph و StartDog نمونه هایی از بانک های اطلاعاتی مبتنی بر گراف می باشند که می توان از آنها جهت ایجاد الگوی معماری داده گراف NoSQL استفاده کرد . در بخش سوم به بررسی Column family یا Bigtable ، سومین الگوی معماری داده NoSQL خواهیم پرداخت .