2013-05-07 20 views
6

Attualmente sto sperimentando molto, e una delle cose che volevo fare è combinare due popolari database NoSQL, vale a dire Neo4j e MongoDB. Semplicemente perché sento che si completano perfettamente a vicenda. I cittadini di prima classe in Neo4j, le relazioni, sono esattamente ciò che manca in MongoDB, mentre MongoDb mi consente di non inserire grandi quantità di dati nelle mie proprietà del nodo.Combinazione di Neo4J e MongoDB: coerenza

Quindi sto cercando di combinare i due in un'applicazione Java, utilizzando il binding REST Java Neo4j e il driver Java MongoDB. Tutte le mie entità di dominio hanno un identificatore univoco che memorizzo in entrambi i database. Gli altri dati sono memorizzati in MongoDB e le relazioni tra entità sono memorizzate in Neo4J. Ad esempio, entrambi i database contengono un ID utente, MongoDB contiene le informazioni del profilo e Neo4J contiene relazioni di amicizia. Con il livello di accesso ai dati personalizzato che ho scritto, funziona esattamente come lo voglio io. Ed è veloce.

MA ... Quando voglio creare un utente, ho bisogno di creare sia un nodo in Neo4j sia un documento in MongoDB. Non necessariamente un problema, tranne che Neo4j è transazionale e MongoDB no. Se entrambi fossero transazionali, ripristinerei entrambe le transazioni quando uno di questi fallisce. Ma dal momento che MongoDB non è transazionale, non posso farlo.

Come faccio a garantire che ogni volta che creo un utente, vengono creati sia un nodo che un documento o nessuno di entrambi. Non voglio finire con un sacco di documenti che non hanno un nodo corrispondente.

Oltre a ciò, non solo voglio che la mia interazione di database combinata sia compatibile con ACID, voglio anche che sia protetta da thread. Sia GraphDatabaseService che MongoClient/DB sono forniti da singleton.

Ho trovato qualcosa sulla creazione di "Documenti di transazione" in MongoDB, ma a me non piace questo approccio. Vorrei qualcosa di carino e pulito come il sistema neo4j startTx, tx.success, tx.failure, tx.finish. Idealmente, qualcosa che posso implementare nello stesso try/catch/finally block.

Devo forse passare a CouchDB, che sembra essere transazionale?

Modifica: Dopo qualche altra ricerca, scatenata da un commento, ho capito che CouchDB non è adatto alle mie esigenze specifiche. Per chiarire, la parte di Neo4j è scolpita nella pietra. Il database del Document Store non è lungo quanto ha una libreria Java.

+0

Dove vedi le transazioni in CouchDb? Mongodb non ha transazioni (in base alla progettazione). Sembra che tu voglia non solo le transazioni, ma anche le transazioni distribuite. È necessario utilizzare un DB con transazioni o creare un processo che cancella i dati obsoleti/scollegati. – WiredPrairie

+0

Il mio male. Non ero ben informato. Stavo leggendo un po 'su Couch DB ma dalle informazioni e bit, ho dedotto ingiustamente che avevano transazioni ACID. E sì, sto cercando transazioni distribuite. –

risposta

11

Pieter-Jan,

se si è in grado di utilizzare Neo4j 2.0 è possibile implementare uno schema-Index-Provider (che è davvero facile) che crea i documenti mediante transazioni in MongoDB.

Poiché Neo4j rende transazionali i suoi fornitori di indici (dall'inizio), lo abbiamo fatto con Lucene e ce n'è uno anche per Redis (deve essere aggiornato). Ma è molto più semplice con Neo4j 2.0, se vuoi puoi controllare la mia implementazione per MapDB. (https://github.com/jexp/neo4j-mapdb-index)

+0

Bello! Quasi si sentono in colpa per aver proposto un'altra tecnologia. ;-) – tstorms

+1

A-W-E-S-O-M-E! Questo è il motivo per cui mi piace così tanto Neo4j. Quando non riesci a trovarlo nella documentazione, c'è sempre un tizio intelligente che ha una soluzione. Grazie mille! –

+0

Ok, quindi ho lavorato su questo, e voglio solo verificare se sto andando nella giusta direzione con questo. Invece di indicizzare effettivamente un nodo, mi limito ad assicurarmi che ogni volta che un nodo viene "indicizzato", ciò che effettivamente accade è che un documento viene creato nella raccolta. Ho anche forzato l'unicità in modo da non poter avere due documenti per un singolo nodo. Ora, per aggiungere informazioni a quei documenti, posso semplicemente usare una query Mongo per trovare il documento e modificarlo, giusto? –

2

Anche se sono un grande fan di entrambe le tecnologie, penso che un'opzione migliore per voi potrebbe essere OrientDB. È un database (come Neo4) e documenta (come MongoDB) in un database e supporta le transazioni ACID. Sembra una corrispondenza perfetta per le tue esigenze.

+2

La parte di Neo4j è scolpita nella pietra. Ho paura per vari motivi, che includono alcuni oltre la mia "giurisdizione". Ma ho anche dei dubbi su OrientDB. Sembra che provino ad essere bravi in ​​tutto. E sfortunatamente, devo ancora trovare un prodotto che ci abbia provato e ci sia riuscito. Potrei sbagliarmi qui, ma in qualche modo dubito che OrientDB possa fornire un prodotto che possa competere con i migliori studenti sia nella classe Graph DB che nella classe Document Store. Ma ovviamente potrei essere solo io ad essere cinico ... E come te, sono anche un po 'fan: D –