Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Neo4j instead of relational database

I am implementing a sinatra/rails based web portal that might eventually have few many:many relationships between tables/models. This is a one man team and part time but real world app.

I discussed my entity with someone and was advised to try neo4j. Coming from real 'non-sexy' enterprise world, my inclination is to use relational db until it stops scaling or becomes a nightmare because of sharding etc and then think about anything else.

HOWEVER,

  • I am using postgres for the first time in this project along with datamapper and its taking me time to get started very fast
  • I am just trying out few things and building more use cases so I consitently have to update my schema (prototyping idea and feedback from beta) . I wont have to do this in neo4j (except changing my queries)
  • Seems like its very easy to setup search using neo4j . But Postgres can do full text search as well.
  • Postgres recently announced support for json and javascript. Wondering if I should just stick with PG and invest more time learning PG (which has a good community) instead neo4j.

Looking for usecases where neo4j is better, especially at protyping/initial phase of a project. I understand if the website grows I might end up having multiple persistent technologies like s3, relational (PG), mongo etc.

Also it would be good to know how it plays out with Rails/Ruby ecosystem.


Update1:

I got a lot of good answers and seems like the right thing to do is stick with Postgres for now (especially since I deploy to heroku)

However the idea of being schema-less is tempting. Basically I am thinking of a approach where you don't define a datamodel until you have say 100-150 users and you have yourself figured out a good schema (business use cases) for your product , while you are just demoing the concept and getting feedback with limited signups. Then one can decide a schema and start with relational.

Would be nice to know if there are easy to use schema/less persistence option (based on ease to use/setup for new user) that might give up say scaling etc.

like image 973
codeObserver Avatar asked Jun 07 '13 05:06

codeObserver


People also ask

Is Neo4j relational database?

Neo4j is a property graph, and has the following characteristics: It contains nodes and relationships. Nodes contain properties (key-value pairs) Relationships are named and directed, and always have a start and end node.

Is Neo4j a non relational database?

1. Neo4j : It is most famous graph database management system and it is also NoSQL database system which is developed by Neo4j, Inc. It is different from Mysql or MongoDB as it has its features that makes it special compared to other Database Management System.

When should someone use a graph database over a relational database?

The relational focus is between the columns of data tables, not data points. Both databases make adding new data easy. The flexibility of a graph database enables the ability to add new nodes and relationships between nodes, making it reliable for real-time data.

Can graph database replace Rdbms?

Graph Databases will replace RDBMS technologies.


3 Answers

Graph databases should be considered if you have a really chaotic data model. They were needed to express highly complex relationships between entities. To do that, they store relationships at the data level whereas RDBMS use a declarative approach. Storing relationships only makes sense if these relationships are very different, otherwise you'll just end up duplicating data over and over, taking a lot of space for nothing. To require such variety in relationships you'd have to handle huge amount of data. This is where graph databases shines because instand of doing tons of joins, they just pick a record and follow his relationships. To support my statement : you'll notice that every use cases on Neo4j's website are dealing with very complex data.

In brief, if you don't feel concerned with what I said above, I think you should use another technology. If this is just about scaling, schemalessness or starting fast a project, then look at other NoSQL solutions (more specifically, either column or document oriented databases). Otherwise you should stick with PostgreSQL. You could also, like you said, consider polyglot persistence,

About your update, you might consider hStore. I think it fits your requirements. It's a PostgreSQL module which also works on Heroku.

like image 88
LMeyer Avatar answered Sep 22 '22 21:09

LMeyer


I don't think I agree that you should only use a graph database when your data model is very complex. I'm sure they could handle a simple data model/relationships as well.

If you have no prior experience with Neo4j or Postgres, then most likely both with take quite a bit of time to learn well.

Some things to keep in mind when picking:

  1. It's not just about development against a database technology. You should consider deployment as well. How easy is it to deploy and scale Postgres/Neo4j?

  2. Consider the community and tools around each technology. Is there a data mapper for Neo4j like there is for Postgres?

  3. Consider that the data models are considerably different between the two. If you can already think relationally, then I'd probably stick with Postgres. If you go with Neo4j you're going to be making a lot of mistakes for several months with your data models.

  4. Over time I've learned to keep it simple when I can. Postgres might be the boring choice compared to Neo4j, but boring doesn't keep you up at night. =)

Also I never see anyone mention it, but you should look at Riak (http://basho.com/riak/) too. It's a document database that also provides relationships (links) between objects. Not as mature as a graph database, but it can connect a few entities quickly.

like image 24
ryan1234 Avatar answered Sep 21 '22 21:09

ryan1234


The most appropriate choice depends on what problem you are trying to solve.

If you just have a few many to many tables, a relational database can be fine. In general, there is better OR-mapper support for relational databases, as they are much older and have a standardized interface and row-column structure. They also have been improved on for a long time, so they are stable and optimized for what they are doing.

A graph database is better if e.g. your problem is more about the connections between entities, especially if you need higher distance connections, like "detect cycles (of unspecified length)", some "what do friends-of-a-friend like". Things like that get unwieldy when restricted to SQL joins. A problem specific language like cypher in case of Neo4j makes that much more concise. On the downside, there are mappers between graph dbs and objects, but not for every framework and language under the sun.

I recently implemented a system prototype using neo4j and it was very useful to be able to talk about the structure and connections of our data and be able to model that one to one in the data storage. Also, adding other connections between data points was easy, neo4j being a schemaless storage. We ended up switching to mongodb due to troubles with write performance, but I don't think we could have finished the prototype with that in the same time.

Other NoSQL datastores like document based, column, key-value also cover specific usecases. Polyglot persistence is definitively something to look at, so keep your choice of backend reasonably separated from your business logic, to allow you to change your technology later if you learned something new.

like image 44
Thomas Fenzl Avatar answered Sep 19 '22 21:09

Thomas Fenzl