DevVeri.com

Boğulacaksan büyük veride boğul!

OrientDB – Graph ve NoSQL Çözümü

orientdb_logo1Populerliğ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)

Screen Shot 2015-03-06 at 00.10.05

Buradan yeni bir veritabanı oluşturmayı seçip ismini giriyoruz:

Screen Shot 2015-03-06 at 00.11.21

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:

Screen Shot 2015-03-06 at 00.11.50

Ö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:

Screen Shot 2015-03-06 at 00.15.21

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:

Screen Shot 2015-03-06 at 00.19.44

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:

Screen Shot 2015-03-06 at 00.20.32

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.

, , , ,

5 thoughts on “OrientDB – Graph ve NoSQL Çözümü

  • Shappy dedi ki:

    Great info. Thanks.

  • Ömer dedi ki:

    Çok teşekkürler, gerçekten nitelik bakımından çok değerli bir kaynak olmuş devveri.com. İlgiyle izlemeye devam ediyoruz.

  • Hakan Sarıbıyık dedi ki:

    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.

  • cwofa dedi ki:

    OrientDB ile ilgili daha çok yazı görmek güzel olurdu.

  • burak dedi ki:

    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

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.