user1879408
user1879408

Reputation: 2028

How to use Neo4J for temporary graph calculations?

I'm completely new to Neo4J and I am struggling with a design/architecture question.

Setup

I have a given Graph with different nodes. That could be the a company graph with customer, products, projects, sales and so on (like in the movie example https://neo4j.com/developer/get-started/). This graph can change from time to time.

In my use case I would like to take this graph, adapt it and test some scenarios. E. g. I would add a new product, define a new sales person with responsibilities or increase the price of a product. To the extended graph I will "ask questions" or in other words, I would use graph algorithms to extract information. The changes I made, shouldn't affect the original graph.

Requirements

Problem

On the one hand I do not wanna change the original graph, on the other I wanna add and change information temporarily for a specific user. Using a relational DB I would just point with an ID to the "static" part of the data or I would do the calculation in Code instead of SQL.

Questions

I am happy about all ideas, concepts and tricks! It's more about graph databases in general....Neo4J was so far my first choice.

Cheers Chris

Upvotes: 2

Views: 743

Answers (2)

Christophe Willemsen
Christophe Willemsen

Reputation: 20185

What about using feature flags in your graph by using different relationship types ?

For example, let's say you have a User that likes 10 movies in your original graph.

(user)-[:LIKES]->(movies)

Then for your experiments, you can have

(user)-[:LIKES_EXPERIMENT]->(othermovies)

This offers you the possibility to traverse the graph in the original way without loosing performance by just enforcing the relationship types. On the other hand it also offers you the possibility to use only the experiments or combining original data with experiments by specifying both relationship types in your traversals.

The same goes for properties, you could prefix properties with experiment_ for eg. And finally you could also play with different labels. There are tons of possibilities before having to use different graph data stores.

Another possibility is to use some kind of versioning like described here :

http://iansrobinson.com/2014/05/13/time-based-versioned-graphs/ But without the time factor.

There is also a nice plugin for it https://github.com/h-omer/neo4j-versioner-core

Upvotes: 3

Bruno Peres
Bruno Peres

Reputation: 16365

My suggestion is:

  1. Copy the data folder of the original database to a new location: sudo cp /path/to/original/data/folder ~/neo4j
  2. Run a Docker container mapping the copy of data folder as the container data folder.

Something like this:

docker run \
--publish=7474:7474 --publish=7687:7687 \
--volume=$HOME/neo4j/data:/data \
neo4j

You can specify another ports if :7474 and :7686 are being used.

  1. Work over this copy.

You can transform these instructions in a .sh file to automate the process.

Upvotes: 0

Related Questions