2013-05-07 12 views
6

Obecnie bardzo dużo eksperymentuję, a jedną z rzeczy, które chciałem zrobić, jest połączenie dwóch popularnych baz danych NoSQL, a mianowicie Neo4j i MongoDB. Po prostu dlatego, że czuję, że doskonale się uzupełniają. Pierwszorzędni obywatele w Neo4j, relacje, są dokładnie tym, czego brakuje w MongoDB, podczas gdy MongoDb pozwala mi nie umieszczać dużych ilości danych w moich właściwościach węzła.Łączenie Neo4J i MongoDB: Konsystencja

Próbuję połączyć te dwie aplikacje w języku Java, używając powiązania REST Java Neo4j i sterownika Java w MongoDB. Wszystkie moje domeny mają niepowtarzalny identyfikator, który przechowuję w obu bazach danych. Pozostałe dane są przechowywane w MongoDB, a relacje między nimi są przechowywane w Neo4J. Na przykład obie bazy zawierają identyfikator użytkownika, MongoDB zawiera informacje o profilu, a Neo4J zawiera relacje przyjaźni. Z niestandardową warstwą dostępu do danych, którą napisałem, działa dokładnie tak, jak tego chcę. I jest szybki.

ALE ... Kiedy chcę utworzyć użytkownika, muszę utworzyć zarówno węzeł w Neo4j, jak i dokument w MongoDB. Niekoniecznie problem, z wyjątkiem tego, że Neo4j jest transakcyjny, a MongoDB nie. Gdyby obie transakcje były transakcyjne, po prostu wycofywałbym obie transakcje, gdy jedna z nich zawiedzie. Ale ponieważ MongoDB nie jest transakcyjne, nie mogę tego zrobić.

W jaki sposób zapewnić, że ilekroć utworzę użytkownika, zarówno węzeł, jak i dokument zostaną utworzone, lub żaden z nich. Nie chcę skończyć z grupą dokumentów, które nie mają pasującego węzła.

Co więcej, nie tylko chcę, aby moja połączona interakcja z bazą danych była zgodna z ACID, ale chcę, aby była bezpieczna dla wątków. Zarówno usługa GraphDatabaseService, jak i MongoClient/DB są dostarczane z wersji singleton.

Znalazłem coś na temat tworzenia "Dokumentów transakcyjnych" w MongoDB, ale naprawdę nie podoba mi się to podejście. Chciałbym czegoś ładnego i czystego, jak konfiguracja neo4j beginTx, tx.success, tx.failure, tx.finish. Idealnie, coś, co mogę zaimplementować w tym samym bloku try/catch/finally.

Czy powinienem zamienić się na CouchDB, który wydaje się być transakcyjny?

Edit: Po kilku dalszych badań, wywołał za komentarz, zdałem sobie sprawę, że CouchDB nie nadaje się również do moich potrzeb. Aby wyjaśnić, część Neo4j jest osadzona w kamieniu. Baza danych magazynu dokumentów nie jest tak długa, jak ma bibliotekę Java.

+0

Gdzie widzisz transakcje w CouchDb? Mongodb nie ma transakcji (według projektu). Wygląda na to, że chcesz nie tylko transakcji, ale także transakcji rozproszonych. Musisz użyć bazy danych z transakcjami lub zbudować proces, który czyści nieaktualne/odłączone dane. – WiredPrairie

+0

Moja zła. Nie byłem dobrze poinformowany. Czytałem trochę o Couch DB, ale z fragmentów informacji błędnie potrąciłem, że mieli transakcje ACID. I tak, szukam transakcji rozproszonych. –

Odpowiedz

11

Pieter-Jan,

jeśli jesteś w stanie wykorzystać Neo4j 2.0 można wdrożyć schematu Indeksu Provider (co jest bardzo łatwe), który tworzy swoje dokumenty transakcyjnie w MongoDB.

Ponieważ Neo4j sprawia, że ​​dostawcy indeksów są transakcyjne (od samego początku), zrobiliśmy to z Lucene i jest też jeden dla Redis (musi zostać zaktualizowany). Ale z Neo4j 2.0 jest znacznie łatwiej, jeśli chcesz, możesz sprawdzić moją implementację dla MapDB. (https://github.com/jexp/neo4j-mapdb-index)

+0

Nice! Prawie czuć się chytrze za proponowanie innej technologii. ;-) – tstorms

+1

A-W-E-S-O-M-E! Dlatego tak bardzo lubię Neo4j. Kiedy nie możesz go znaleźć w dokumentacji, zawsze jest jakiś sprytny gość, który ma rozwiązanie. Wielkie dzięki! –

+0

Ok, więc pracuję nad tym i chcę tylko sprawdzić, czy idę w dobrym kierunku z tym. Zamiast faktycznie indeksować węzeł, po prostu upewniam się, że kiedykolwiek węzeł jest "indeksowany", faktycznie dzieje się tak, że dokument jest tworzony w kolekcji. Wymuszałem także unikalność, aby nie można było mieć dwóch dokumentów dla pojedynczego węzła. Teraz, aby dodać informacje do tych dokumentów, mogę po prostu użyć zapytania Mongo, aby znaleźć i edytować dokument, prawda? –

2

Chociaż jestem wielkim fanem obu technologii, myślę, że lepszym rozwiązaniem dla Ciebie może być OrientDB. Jest to wykres (jako Neo4) i dokument (jako MongoDB) w jednej bazie danych i obsługuje transakcje ACID. Brzmi jak idealne dopasowanie do twoich potrzeb.

+2

Część Neo4j jest w kamieniu Obawiam się z różnych powodów, które obejmują niektóre poza moją "jurysdykcję". Ale mam też pewne wątpliwości co do OrientDB. Wygląda na to, że starają się być dobrzy we wszystkim. I niestety, nie znalazłem jeszcze produktu, który by to wypróbował i odniósł sukces. Może się mylę, ale wątpię, że OrientDB może dostarczyć produkt, który może konkurować z najlepszymi uczniami zarówno w klasie Graph DB, jak i klasie Document Store. Ale oczywiście, że mogę być po prostu cyniczny ... I tak jak ty, jestem także fanem: D –