2013-03-12 10 views
5

Chciałbym reprezentować miliony produktów należących do jednej lub więcej z kilkudziesięciu kategorii.Projekt kategorii w Neo4j, relacje węzła głównego i relacje z indeksowanymi węzłami

mam zamiar kilka podejść:

  1. indeksowanych Kategoria węzłów - tworzenie węzłów dla każdej kategorii i generują auto_index na CATEGORY_NAME. Następnie utwórz relacje "isCategoryOf" między każdym z moich węzłów produktów i ich węzłami kategorii.

  2. Indywidualne typy relacji kategorii - Utwórz odpowiednie "isCategoryGames", "isCategoryFood", "isCategoryLifestyle", itp. ... relacje między produktami a węzłem głównym.

  3. Przechowywanie kategorii jako właściwość jednego typu relacji - Utwórz relacje wartości "isCategory" między węzłami prduct i węzłem głównym i zapisz odpowiednie typy kategorii we właściwości relacji, np. relacja "isCategory" {categoryName: "food"}

Które z tych podejść jest najbardziej wydajne i/lub skalowalne. Czy istnieją ograniczenia lub konsekwencje wydajności związane z tym, że prawie każdy węzeł w bazie danych łączy się z węzłem głównym?

Odpowiedz

4

Po podłączeniu milionów węzłów do węzła głównego, tworzysz węzeł nadrzędny supernode. This can be problematic.

Ogólna koncepcja Opcji 1 pokazuje obietnicę. Jeśli modelujesz jedzenie, możesz mieć węzły z właściwością nazwy, taką jak "Orzechy", "Produkty mleczne", "Desery", "Produkuj" i właściwość typu "Kategoria". Będziesz wtedy mieć inne węzły z właściwością nazwy, taką jak "Cherry Cheesecake" z wyjściowymi "kategoriami" krawędzi do "Dairy Products" i "Desserts" węzłów.

To, czy ta struktura będzie wystarczająco wydajna, zależy od zapytań. Jeśli masz szerokie kategorie, takie jak "jedzenie", możesz skończyć z supernodą, a następnie wykonasz liniowy skan połączonych węzłów, aby znaleźć węzeł z daną właściwością. Skanowanie liniowe tysięcy rzeczy może być wystarczająco szybkie dla twoich celów, ale skanowanie ponad 1M rzeczy może nie być.

Aby się tego dowiedzieć, zaleca się utworzenie szybkiego prototypu, w którym generowane są losowe węzły produktów i kategorii, a następnie podłącz każdy węzeł produktu do losowej liczby węzłów kategorii. Indeksowanie nazwy produktu i kategorii według nazwy pomoże ci znaleźć poszczególne produkty lub kategorie, ale to są ruchy, które spowodują problemy z wydajnością, jeśli trafisz na supernody. Eksperymentuj z kilkoma przeszukiwaniami Gremlina lub zapytaniami Cyphera, które Twoim zdaniem mogą być najbardziej problematyczne. Spróbuj zwiększyć liczbę węzłów z 1K, 10K, 100K i 1M przy proporcjonalnej liczbie krawędzi. W jaki sposób zmieniają się Twoje czasy przejścia/zapytania?