2016-03-22 16 views
1

Uygulamamızda ağaç benzeri bir yapı oluşturan öğeler var.Etkinlik, özet akışlarıyla beslenir

(c:card)-[:child]->(subcard:card)-[:child]->(subsubcard:card) ... etc

bir operasyon (herhangi bir düzeyde) bir kartta yapılır her zaman, biz onu kaydetmek istiyorum: Sen aşağıdaki gibi bir desen olabilir. Olası bazı olaylar şunlardır:

  • bir kartın başlık Bob
  • bir yorum Kate Joe
  • bir kartın durumunu bahsederek eklendi tarafından onaylanan
için bekleyen değiştirildi güncellendi

Bağlantılı liste yaklaşımı popüler gözüküyor, ancak gerçekleştirmek istediğimiz sorgular dikkate alındığında, bizim için en iyisi olup olmadığından emin değilim.

  • olayın zamanına göre sıralanmış, belirli bir kart VE çocuk kartları ile ilişkili aktivite Tümü (temelde tüm bu birleştirmek istiyorum: Burada

    ana sorguları yayınını olacak olan

    : aktivite
  • zamana göre sıralı belirli bir kişiyle ilişkili aktivitenin Tüm Bunun üzerine

aşağıdaki gibi filtreler eklemek istiyorum) birlikte beslemeleri kişi tarafından

  • Filtre kartlar çok sık yeniden düzenlenebilir dikkat etmek de önemlidir süre

tarafından

  • Filtre içeriyordu. Başka bir deyişle, ebeveynler değişebilir.

    Böyle bir şeyi en iyi nasıl modellemeye ilişkin herhangi bir fikir var mı? Teşekkürler!

  • cevap

    0

    Birkaç öneri var, ancak bunları karşılaştırmayı öneririm.

    Java API'lerini (belki de Neo4j için yönetilmeyen bir uzantı aracılığıyla) kullanabiliyorsanız, bağlantılı liste yaklaşımı iyi olabilir. Listedeki en yeni etkinlik, karta eklenmiş olan (ve esasen liste olayların satırın başına geldiği tarihe göre sıralanmıştır), eğer zamana göre filtreleme yapıyorsanız, bir belirtilen süreden daha erken olan etkinlik.

    Olayları doğrudan karta eklemek, sizi süpernodes/yoğun düğümlerle sorunlara sokma potansiyeline sahiptir. Yine de, Cypher için sorgulamak en basit olurdu. Sorun şu ki, Cypher filtrelemeden önce hepsine bakacaktır. Olayların tarih/saatini düğümün ((:Card)-[:HAS_EVENT]->(:Event) veya (:Event)-[:PERFORMED_BY]->(:Person)) ilişkilerine yerleştirerek, olayın tarih/saatini olay düğümüne yerleştirmenin yanı sıra sorguların performansını da artırabilirsiniz. Daha sonra sorguladığınızda, ilişkilere göre filtreleyebilirsiniz, böylece düğümlere geçmek gerekmez.

    olursa olsun, muhtemelen şöyle sorgu kırmak için yararlı olacaktır:

    MATCH (c:Card {uuid: 'id_here')-[:child*0..]->(child:Card) 
    WITH child 
    MATCH (child)-[:HAS_EVENT]->(event:Event) 
    

    Ben MATCH o değerlendirmek gerekir yolları az permütasyon sahip edeceğini anlamına geleceğini düşünüyorum . aralık endeksler göre sıralama izin Neo4j mu)

    +0

    Teşekkür Brian :);.

    Diğerleri Gerçekten sadece onlar hakkında okumak, bizzat süper düğümler ele hiç benim şüpheli tavsiyelerini tamamlamak için bekliyoruz? Örneğin, etkinlik düğümleri zaman damgaları olsaydı, 1. belirli bir zaman aralığı içinde kalan ve 2. çocuğa ait olan etkinlikleri verimli bir şekilde sorgulayabilir miyim? –

    +0

    Neo4j, aralıklarda daha hızlı sorgulama yapmak için indeksleri kullanabilir (2.3'den başlayarak). Hile, başlamak için en sınırlayıcı yer olduğunu belirleyebildiğinden emin olmaktır. Etkinlik tarihlerine göre filtrelemenin size daha küçük bir başlangıç ​​noktası vereceğini düşünüyorsanız, bunun yerine "OLUŞTURMA" olayları ile başlayabilirsiniz. –