Czy dobrym pomysłem jest używanie MySQL i Neo4j razem?

Zrobię aplikację z wieloma podobnymi pozycjami (milionami) i chciałbym je przechowywać w bazie danych MySQL, ponieważ chciałbym zrobić dużo statystyk i wyszukać konkretne wartości dla konkretnych kolumn.

Ale jednocześnie będę przechowywać relacje między wszystkimi elementami, które są powiązane w wielu powiązanych strukturach typu binarnego drzewa (zamknięcie przechodnie), A bazy danych relacji nie są dobre w tego typu strukturach, więc chciałbym przechowywać wszystkie relacje w Neo4j, które mają dobrą wydajność dla tego rodzaju danych.

Mój plan polega na tym, aby wszystkie dane z wyjątkiem relacji w bazie danych MySQL i wszystkich relacji z item_id były przechowywane w bazie danych Neo4j. Kiedy chcę wyszukać drzewo, najpierw przeszukuję Neo4j dla wszystkich item_id: S w drzewie, a następnie przeszukuję bazę danych MySQL dla wszystkich określonych elementów w zapytaniu, które wyglądałoby jak:

SELECT * FROM items WHERE item_id = 45 OR item_id = 345435 OR item_id = 343 OR item_id = 78 OR item_id = 4522 OR item_id = 676 OR item_id = 443 OR item_id = 4255 OR item_id = 4345

to dobry pomysł, czy bardzo się mylę? nie używałem graph-baz danych wcześniej. Czy jest jakieś lepsze podejście do mojego problemu? Jak w tym przypadku będzie działać MySQL-query?

Author: Jonas, 2010-03-30

4 answers

Kilka myśli na ten temat:

Spróbowałbym modelować twój model domeny Neo4j, aby uwzględnić atrybuty każdego węzła w wykresie. Rozdzielając dane na dwa różne magazyny danych, możesz ograniczyć niektóre operacje, które chcesz wykonać.

Myślę, że chodzi o to, co będziesz robił ze swoim wykresem. Jeśli, na przykład, chcesz znaleźć wszystkie węzły podłączone do określonego węzła, którego atrybuty (np. nazwa, wiek.. cokolwiek) są pewne wartości, czy najpierw trzeba znaleźć poprawny identyfikator węzła w bazie danych MySQL, a następnie przejdź do Neo4j? To po prostu wydaje się powolne i zbyt skomplikowane, gdy można to wszystko zrobić w Neo4j. więc pytanie brzmi: czy potrzebujesz atrybutów węzła podczas przechodzenia grafu?

Czy Twoje dane się zmienią czy są statyczne? Posiadanie dwóch oddzielnych magazynów danych skomplikuje sprawę.

Podczas gdy generowanie statystyk za pomocą bazy danych MySQL może być łatwiejsze niż robienie wszystkiego w Neo4j, kod wymagany do przemierzania wykresu znalezienie wszystkich węzłów spełniających określone kryteria nie jest zbyt trudne. To, czym są te statystyki, powinno napędzać twoje rozwiązanie.

Nie mogę skomentować wydajności zapytania MySQL, aby wybrać identyfikatory węzłów. Myślę, że sprowadza się to do tego, ile węzłów trzeba będzie wybrać i strategii indeksowania. Zgadzam się co do strony wydajności, jeśli chodzi o przemierzanie wykresu.

To jest dobry artykuł na ten temat: MySQL vs. Neo4j na wykresie wielkoskalowym Traversal i w tym przypadku, kiedy mówią Duże, oznaczają tylko milion wierzchołków/węzłów i cztery miliony krawędzi. Więc nie był to nawet szczególnie gęsty Wykres.

 26
Author: Binary Nerd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-26 13:25:54

Relacyjne bazy danych mogą obsługiwać struktury grafów. Niektóre z nich mogą nawet obsługiwać je umiarkowanie elegancko (tak elegancko, jak robi się to w relacyjnej bazie danych!).

Kluczem do ogólnej obsługi grafów w relacyjnych bazach danych jest recursive common table expression (rcte), które zasadniczo pozwala iteracyjnie (nie rekurencyjnie, pomimo nazwy) rozszerzać Zapytanie o zestaw wierszy, łącząc zapytanie, które wybiera główny zestaw wierszy i zapytanie, które definiuje sąsiadów wierszy wybrane do tej pory. Składnia jest trochę niezgrabna, ale jest ogólna i potężna.

RCT są obsługiwane w PostgreSQL, Firebird, SQL Server i najwyraźniej w DB2. Oracle ma inną, ale równoważną konstrukcję; czytałem, że najnowsze wersje obsługują odpowiednie RCT. MySQL nie obsługuje RCTEs. Jeśli nie jesteś przywiązany do MySQL, zachęcam cię do rozważenia korzystania z PostgreSQL, który jest w zasadzie dużo lepszą bazą danych.

Jednak wygląda na to, że nie musisz wspierać ogólne wykresy, tylko drzewa. W takim przypadku dostępne są bardziej szczegółowe opcje.

Jeden z nich to klasyczne, ale raczej zaklinające umysł zestawy zagnieżdżone.

Prostszym jest przechowywanie ścieżki z każdym wierszem: jest to ciąg znaków, który reprezentuje pozycję wiersza w drzewie i ma właściwość, że ścieżka dla węzła jest prefiksem ścieżki dla dowolnego podnodu, co pozwala bardzo efektywnie wykonywać różne zapytania dotyczące przodka ("is node A A child of node B?", "co to jest węzeł A i najniższy wspólny przodek węzła B?", itp.). Na przykład można zbudować ścieżkę dla wiersza, przechodząc drzewo od korzenia i łącząc identyfikatory wierszy napotkanych po drodze z ukośnikami. Jest to proste do skonstruowania, ale dba o utrzymanie, jeśli zmienisz układ drzewa. W kolumnie path możesz ograniczyć zapytanie do danego drzewa po prostu dodając and path like '23/%', gdzie 23 jest identyfikatorem korzenia.

Tak więc, chociaż baza danych Wykresów jest prawdopodobnie najlepszym sposobem na przechowywanie i odpytywanie danych Wykresów, to nie jest jedyną opcją i sugerowałbym rozważenie zalet korzystania z jednego z zalet posiadania wszystkich danych w jednej bazie danych.

 9
Author: Tom Anderson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-08 17:47:02

Jestem głównie z Binary Nerd w tym, ale chciałbym dodać odmianę. Możesz przechowywać dane na żywo w Neo4j, a następnie wyodrębnić dane potrzebne do statystyk/raportowania i umieścić w MySQL. Dla wyszukiwań wybrałbym integrację Neo4j-Lucene jeśli pasuje do Twoich potrzeb.

 5
Author: nawroth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-30 08:30:06

Możesz poprawić zapytanie używając IN:

SELECT *
FROM items
WHERE item_id IN (45, 345435, 343, 78, 4522, 676, 443, 4255, 4345)
Nie jest też do końca prawdą, że relacyjne bazy danych źle przechowują struktury drzewiaste. Z pewnością MySQL brakuje pewnych funkcjonalności, które by to ułatwiły, ale większość innych baz danych dobrze go obsługuje. Oracle ma CONNECT BY. Większość popularnych RDBMS ma jakąś formę rekurencyjnych zapytań - MySQL jest znaczącym wyjątkiem. Może mógłbyś rzucić okiem na PostgreSQL i sprawdzić, czy spełnia Twoje potrzeby?
 4
Author: Mark Byers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-29 23:29:29