geri

Bir Neo4j denemesi: Twitter takipçi grafı

02/05/2012

Neo4j ile ilk karşılaşmam 2009 yılında olmuştu. O sıralar -henüz badem bıyıklılarla dolmamış en bir bilimsel ve teknolojik kurumumuzda- çeşitli veritabanlarına ait kullanım istatistiklerini saklamak üzere embed edilebilir bir veritabanı arıyordum. Bu süreçte bir hafta kadar bir süre Neo4j'e şans versem de gerek disk alanı, gerekse performans sorunları yüzünden BerkeleyDB'ye geçiş yapmıştım. Şimdi dönüp baktığımda asıl sorunun bir graf(Türkçe karşılığı çizge olarak geçiyor ama benim kulağıma pek aşina gelmedi. Bilen birileri beni düzeltirse sevinirim.) veritabanının ne amaçla kullanılacağını o zamanlar bilmeyen bende olduğunu düşünüyorum.

Geçen zaman içerisinde Neo4j büyük bir gelişme gösterdi ve yaygınlaştı. Ben de bu popüler veritabanını tekrar kurcalamak istedim. Örnek uygulamamda kendi Twitter takipçilerimden başlayarak bir takipçi grafı oluşturmaya karar verdim. Uygulama benim takipçilerimi çekecek ve ve aramızda FOLLOWS ilişkisi ile Neo4j veritabanına kaydedecek. Daha sonra takipçilerimin takipçilerini çekecek ve aynı işlemi veritabanında olmayan kişi kalmayana dek devam ettirecek.

İşe önce Neo4j'i indirerek başladım. Konsol aracılığıyla sunucuyu herhangi bir sorunla karşılaşmadan başlattım. neo4j-shell ile sunucuya bağlanıp komutları biraz kurcaladım. Daha sonra dokümantasyonda gezerken Neo4j'in bir REST API sağladığını fark ettim. Benzer bir REST API'yi Twitter da sağladığı için uygulamayı bu API'leri kullanarak JavaScript ile geliştirmeye karar verdim.

Twitter, istenilen kullanıcının takipçilerinin ID listesini döndüren bir API sunuyor.

http://api.twitter.com/1/followers/ids.json?user_id=...

Belki tek sıkıntı saatte 150 sorgu sınırının olması. Yazdığım kod bu API aracılığıyla her bir kullanıcının takipçilerini çekiyor ve createNode fonksiyonu ile Neo4j içinde her bir kullanıcı için bir düğüm oluşturuyor. Kullanıcıların tekrarlanmasını engellemek için Neo4j'in unique indexlerinden faydalandım. İndexlenmek istenen veri ilk kez indexleniyorsa API'nin kendisi otomatik olarak bir düğüm oluşturuyor. Aksi halde yeni düğüm oluşturulmuyor. 7474. portta çalışan bir Neo4j sunucusu olduğunu varsayan kodu aşağıda paylaşıyorum.

Mevcut kod kullanıcıların yalnızca ID'lerini çekiyor. Tüm graf oluştuktan sonra ayrı bir kodun bu ID'lere ait ayrıntıları çekip düğümleri güncellemesini planlıyorum. Böylece aynı anda en çok 100 kullanıcının ayrıntılarını döndürebilen Twitter API'sini de etkin kullanmış olacağım.

Elde bu graf olduktan sonra iki düğüm arasındaki en kısa yolu hesaplamak Neo4j ile oldukça kolay. Ayrıca graf, centrality açısından da kolayca incelenebilecektir diye tahmin ediyorum.

Follow me on Twitter