2012-03-07 15 views
11

Mi sto preparando per iniziare un progetto in cui creerò un motore di raccomandazione per i ristoranti. Sono stato waffling tra neo4j (grafico db) e mongodb (documento db). i miei nodi/documenti saranno cose come ristorante e persona. so che vorrò dei bordi, qualcosa come persona-> mi piace-> ristorante, o persona-> ate_at-> ristorante. la mia domanda principale, tuttavia, sarà quella di trovare ristoranti entro X miglia dalla posizione Y.neo4j vs mongodb per ricerca spaziale

se ho 20 ristoranti entro X miglia da Y, ma non collegati da alcun bordo, come sarà neo4j in grado di gestire la query spaziale ? so con mongodb posso indicizzare su lat/long e interrogare tutti i tipi di ristoranti. neo4j offre la stessa funzionalità in un grafico disconnesso?

quando si tratta di rispondere a domande come "quali ristoranti mangiano i miei amici più spesso?", È neo4j (grafico db) la strada da percorrere? o mongodb (documento db) mi fornirà funzionalità simili?

risposta

7

Non sono così familiare con Neo4J Spatial ma sembrerebbe che MongoDB sia per lo meno un buon compromesso in quanto è il database utilizzato da Foursquare esattamente con lo scopo che descrivi. L'indicizzazione geografica di MongoDB è estremamente veloce e si adatta bene.

+0

D'accordo, non guardare oltre. MongoDB è la soluzione perfetta per le tue esigenze. Ora basta mescolarlo con Node.JS e si dispone di una soluzione ultrarapida e scalabile – psousa

+0

grazie ragazzi - ora pianifico di implementare mongodb per questa soluzione, che è ciò che inizialmente volevo fare a causa dell'indicizzazione spaziale e di numerose API. – drizkol

10

Neo4j Spatial introduce un indice spaziale RTree (o altro mezzo) che fa parte del grafico stesso. Ciò significa che anche le entità di dominio disconnesse verranno trovate tramite la ricerca spaziale, se le indicizzate (cioè le relazioni collegheranno l'indice spaziale ai ristoranti). Inoltre, questo è abbastanza flessibile da poter combinare la ricerca BBox Raw in RTree con altre cose come controllare le categorie dei ristoranti nello stesso go, dato che puoi saltare e nelle diverse parti del grafico.

In questo modo, Neo4j spaziale sostiene la gamma completa di funzionalità di ricerca che ci si aspetterebbe formare una topologia completa, come le ricerche combinate e ricerche sui poligoni con fori ecc

Essere consapevoli che Neo4j spaziale è a 0.7, quindi sii gentile e chiedi al http://groups.google.com/group/neo4j/about :)

1

Un'altra possibile soluzione è usare CouchBase. Utilizza anche un modello di documento, anche se devi essere molto più a tuo agio con MapReduce per le query. In questo momento ha migliori capacità spaziali grazie a MongoDB, ma potrebbe cambiare nel tempo.

Consiglio a parte, concordo sul fatto che le due scelte che hai dato a Mongo soddisferanno le tue esigenze e probabilmente saranno più appropriate per le tue domande spaziali.

0

Neo4j geospatial non si adatta bene. Ho creato uno strato geospaziale in neo4j e ho aggiunto nodi a questo livello. Oltre i 10.000 nodi l'aggiunta di nodi al livello diventa molto lenta anche quando si utilizza neo4j2.0

D'altro canto, la geo-localizzazione di mongodb funziona in modo molto più rapido ed è più scalabile.