OrientDB – Graph ve NoSQL Çözümü
Populerliği günden güne artan Çizge (Graph) veritabanları dünyasında OrientDB yetenekleri ile öne çıkıyor. Piyasada en çok bilinen Neo4J’den farklı olarak, OrientDB açık kaynaklı. Ayrıca destek almak istediğinizde Orient Technologies firması tarafından desteklenen kurumsal bir sürümü de mevcut.
OrientDB aslında sadece bir Çizge veritabanı değil, aynı zamanda döküman tabanlı bir NoSQL veritabanı. Tinkerpop Gremlin dilini desteklemesi, ACID, Multi-Master replikasyon, REST api ve en önemlisi SQL desteği ile bize harikalar vaadediyor. OrientDB’yi sevmemizin bir başka nedeni de dağıtık çalışabilmek için arka tarafta Hazelcast’den faydalanması.
Bu yazımızda OrientDB’nin kurulumunu, örnek bir Çizge veri yapısı oluşturmayı ve bununla basit bir ürün öneri sistemi yapmayı işleyeceğiz.
OrientDB oldukça küçük bir boyuta sahip. Uygun sürümü indirip açmamız kurulum için yeterli:
wget --output-document orientdb-community-2.0.4.tar.gz "http://www.orientechnologies.com/download.php?file=orientdb-community-2.0.4.tar.gz&os=multi" tar xvf orientdb-community-2.0.4.tar.gz cd orientdb-community-2.0.4 bin/server.sh
Sunucu ilk seferinde ayağa kalkarken bize root şifresini soruyor. Bunu belirledikten sonra OrientDB’nin arayüzüne girebiliriz. Aslında konsol üzerinden de kullanılabilir ama OrientDB pek çok NoSQL’de eksik olan basit ama oldukça kullanışlı bir admin arayüzüne sahip. Bu arayüzden birçok işlemi gerçekleştirebilliyoruz. http://localhost:2480 üzerinden arayüzü açabiliriz. (Sizi ilk karşılayan ekran daki güneş manzarası da oldukça romantik)
Buradan yeni bir veritabanı oluşturmayı seçip ismini giriyoruz:
Girişi yaptıktan sonra karşımıza arayüz ekranı geliyor. Browse kısmında sorguları çalıştırabilir, Graph kısmında verileri görsel olarak inceleyebilirsiniz:
Örneğimizi gerçekleştirebilmek için Item ve User isimli iki sınıfa ihtiyacımız var. Burada Çizge veritabanında olduğumuz için veriler tablo değil sınıf olarak tanımlanıyor. Bu sınıflarda Vertex anlamına gelen V sınıfından türetiliyorlar. Vertex’ler arasındaki ilişkiler de Edge anlamına gelen E sınıfından türetiliyorlar.
Önce Item sınıfı ile başlıyoruz. Item nesnesini aşağıdaki komutla yaratıyoruz:
create class Item extends V
Ardından bu Item nesnesine id ve title isimli iki özellik ekliyoruz:
create property Item.id integer create property Item.title string
Sınıf tanımından sonra örnek olması için birkaç Item yaratalım:
create vertex Item set id = 1, title = 'iPhone 6' create vertex Item set id = 2, title = 'Samsung Galaxy S5' create vertex Item set id = 3, title = 'Universal Charger'
Örnek verileri arayüzden SQL ile sorgulayabiliriz:
User sınıfını da aynı şekilde tanımlayıp örnek kullanıcılar oluşturalım:
create class User extends V create property User.id integer create property User.name string create vertex User set id = 1, name = 'User 1' create vertex User set id = 2, name = 'User 2' create vertex User set id = 3, name = 'User 3'
Buraya kadar nesneler arasında herhangi bir ilişki kurmadık, çünkü daha ilişkinin tipini de oluşturmuş değiliz. User ve Item nesnesi arasında satın almayı simgeleyen Bought isimli bir ilişki olacak:
create class Bought extends E
Örnek nesne ilişkilerimiz de aşağıdaki şekilde olsun:
- User 1, iPhone, Samsung Galaxy S5 ve Universal Charger almış
- User 2, iPhone ve Universal Charger almış
- User 3 sadece iPhone almış
İlişkileri veriyapımıza bu şekilde ekliyoruz:
create edge Bought from (select from User where id = 1) to (select from Item where id = 1) create edge Bought from (select from User where id = 1) to (select from Item where id = 2) create edge Bought from (select from User where id = 1) to (select from Item where id = 3) create edge Bought from (select from User where id = 2) to (select from Item where id = 1) create edge Bought from (select from User where id = 2) to (select from Item where id = 3) create edge Bought from (select from User where id = 3) to (select from Item where id = 1)
İlişkileri de kurduğumuza göre, bunu arayüzden görsel olarak inceleyebiliriz:
Veriyapımız hazır olduğuna göre, iPhone alan bir kullanıcıya öneri yapmak istersek, iPhone ile beraber en çok alınan ürünlere ulaşmamız gerekir. Bunun için önce iPhone alan kullanıcılara ulaşmalıyız:
select expand(in('Bought')) from Item where id = 1
Bunun üzerine, iPhone alan kullanıcıların aldıkları tüm ürünlere ulaşmak istersek bir önceki sorguyu da kullanarak sorguyu genişletmemiz gerekir:
select expand(out('Bought')) from (select expand(in('Bought')) from Item where id = 1)
Son olarak da bu verileri gruplayıp sayısına göre sıralayıp, içlerinden de iPhone’ları elersek istediğimizi elde ediyoruz:
select id, title, count(*) as sold_count from (select expand(out('Bought')) from (select expand(in('Bought')) from Item where id = 1)) where id <> 1 group by id, title order by sold_count desc limit 10
Böylece iPhone alan bir kişiye Universal Charger önerebileceğimizi görüyoruz:
Bütün bunları yaparken Çizgi veritabanlarına özgü dilleri kullanmak yerine SQL kullanıyor olmak büyük bir avantaj. OrientDB barındırdığı özelliklerle ileride adını daha çok duyacağımız bir proje olacak.
Çizge veritabanları sosyal ağlarda “Tanıyor olabileceğiniz kişiler”, bankacılık sektöründe dolandırıcılıkların tespit edilmesi gibi konularda oldukça yaygın olarak kullanılıyor.
OrientDB ile ilgili detaylı bilgiye sitesinden ulaşabilirsiniz.
Cloudera Data Analyst Eğitimi Ankara Hadoop Nereden Başlamalıyım?
Great info. Thanks.
Çok teşekkürler, gerçekten nitelik bakımından çok değerli bir kaynak olmuş devveri.com. İlgiyle izlemeye devam ediyoruz.
Merhaba Hakan,
Bu sıralar, zaman serilerini efektif olarak saklayıp analiz edebileceğim NoSQL veritabanlarını inceliyorum. GraphDB leri kapsam dışı tutmuştum. Bu yazı vesilesi ile kapsama dahil ettim.
Teşekkürler.
OrientDB ile ilgili daha çok yazı görmek güzel olurdu.
hakan bey merhaba, orient db konusunda yapmak istedigim bir çalışma ile ilgili sizden yardımlarınızı talep ediyorum(ücreti mukabilinde).Mail adresimden bana ulaşirsanız çok sevinirim.iyi çalışmalar