منبع اصلی نوشتار زیر در این لینک قرار دارد

اندر مزایای پایگاه داده های گراف محور و OrientDB

در روز های اخیر کاری داشتم که نیاز داشتم یکسری اطلاعات رو که باهم ارتباط دارند مدل کنم.بعد از کلی تفکر تونستم اونارو روی گراف وزن دار جهت دار مدل کنم.بعد اومدم توی برنامه ازش استفاده کنم.از قبل میدونم که گراف رو میتونم روی ماتریس مجاورت مدل کرد تا راحت تر ذخیره کنم ولی وقتی دقت کردم دیدم که از نظر حجم اطلاعات و سرعت بازیابی به مشکلات زیادی میخورم.همون موقع بود که یادم افتاد برای ذخیره اطلاعات به اشکال غیر مرسوم میتونم از NoSQL ها استفاده کنم.

حالا NoSQL ها چی هستند؟ در واقع چیز خاصی نیستند، به پایگاه داده هایی میگن که طی یک جنبش بزرگ به وجود اومدن  تا محدودیت های پایگاه داده های رابطه ای رو بردارند. راستش با گفتن خوب نمیتونید متوجه بشید و بیاد خودتون یکبار امتحانشون بکنید تا معنی واقعی محدودیت پایگاه داده های رابطه ای رو متوجه بشید.

خلاصه اینکه یک نوع از این پایگاه داده های جدید هم پایگاه داده های گراف محور یا Graph Based هستند.از معروف ترین این دیتابیس ها میشه به NEO4j اشاره کرد. ولی خب دیتابیس هایی هم هستند که از چند نوع از ساختار های NoSQL پشتیبانی میکنند مثل OrientDB که هم از حالت گراف پشتیبانی میکند و هم از سند-گرا که یکی دیگر از ساختار های NoSQL است.

خلاصه این که برای کار خودم از پایگاه داده OrientDB استفاده کردم تا گراف رو داخلش ذخیره کنم.خب قبل از این من توی C# به MS-SQL و توی PHP به MySql متصل شده بودم و باهاشون کار کرده بودم.ولی خب تا حالا با Java به هیج دیتابیسی وصل نشده بودم. پس این کار برای من دوتا جنبه تازه داشت. اول اینکه برای اولین بار داشتم توی جاوا به پایگاه داده متصل میشدم و دوم اینکه اولین تجربه من با دیتابیس OrientDB و در کل یکی از زیر شاخه های جنبش NoSQL بود.

خب اولین کاری که باید میکردم ساختن یک دیتابیس محلی در آدرسی هست که خودم میخوام تا برنامه بتونه باهاش در ارتباط باشه.

orientdb> CREATE DATABASE PLOCAL:/home/aslan/myDB

فقط برنامه برای کار کردن به چند تا از کتابخانه های OrientDB نیاز داره که توی پوشه /lib خود دیتابیس میتونید پیداشون کنید.

خب من به این فایل ها برای کتابخانه نیاز دارم و اونارو به اپلیکیشن خودم اضافه میکنم.

blueprints-core-*.java
orientdb-client-*.java
orientdb-core-*.java
orientdb-graphdb-*.java
concurrentlinkedhashmap-lru-*.java

خب حالا بریم سر برنامه. اول از هر چیزی من نیاز دارم تا ایمپورتشون کنم:

import com.tinkerpop.blueprints.Edge;
import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.blueprints.impls.orient.OrientGraph;

حالا دیگه تمام چیزی که نیاز دارم این یک خط کده تا کل گراف رو وارد آبجکت graph بکنم:

OrientGraph graph = new OrientGraph("plocal:./myDB");

همچنین باید هروقت کارم با دیتابیس تموم شد متود shutdown رو از گرافم اجرا کنم تا ارتباط قطع بشه.خب پس به صورت اصولی تر میام از ساختار try finally استفاده میکنم.

try {

...

} finally {
    graph.shutdown();
}

حالا میتونم داخل بخش try کد های مربوط به کار کردن با گرافم رو بنویسم. تقریبا کاری دیگه نمونده.

به مثال های زیر در کار با گراف دقت کنید تا دیگه من شرح ندم:

//ساخت یک راس جدید
Vertex x = graph.addVertex(null);
Vertex y = graph.addVertex(null);

//دادن ویژگی name به این راس
x.setProperty("name", "Node 1");

//افزودن یک یال بین x و y
Edge eLives = graph.addEdge(null, x, y, "relation");

//حرکت روی راس های گراف با استفاده از for
for(Vertex v : graph.getVertices()){
    ...
}

// حرکت روی یال ها با استفاده از حلقه for
for(Edge v : graph.getEdges()){
    ...
}

از نکات خیلی جالبش اینه که نیاز به sync کردن نیست و هر کاری میکنید مستقیما توی پایگاه داده اعمال میشه.همچنین OrientDB از زبانی شبیه به SQL برای Query های خودش استفاده میکنه که بیشتر فقط زمانی که میخوایم بر اساس یک الگوی خاص دنبال یک چیزی بگردی ازش استفاده میکنیم. برای استفاده از اون هم میتونید به صورت زیر استفاده کنید:

String Query = "SELECT EXPAND( OUT('bough') ) FROM Customer WHERE name='Jay'";
for (Vertex v : (Iterable<Vertex>) graph.command(new OCommandSQL(Query)).execute()) {
    System.out.println("- Bought: " + v);
}

سعی کردم اینجا خیلی خلاصه به اصول کلی اشاره بکنم. اگه میخواستید بیشتر مطالعه کنید یا مثلا توی زبان های دیگه از این دیتابیس استفاده کنید میتونید به مستندات خودشون مراجعه کنید که آدرسشو اینجا میگذارم:

http://orientdb.com/docs/master/index.html



برچسب ها : , ,