Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Change management for graph databases?

I've been recently exposed to the world of graph databases. Its quite an interesting paradigm shift for an old relational dog like me.

Also quite recently, I've been tinkering with liquibase and its been quite a neat tool in managing databases.

So, two worlds collide and I was just wondering if there are any tools out there that take on liquibase-like change management for graph databases. I'm especially interested in neo4j and orientdb.

like image 861
critium Avatar asked Mar 09 '13 16:03

critium


2 Answers

Liquigraph exists now and although still quite new, the author is very receptive to feedback and is actively working on the project.

like image 172
Matt Byrne Avatar answered Sep 28 '22 03:09

Matt Byrne


Pramod Sadalage and Martin Fowler's influential article from 2003 on Evolutionary Database Design had a big impact on how I approached managing schema changes in a database. I went on to use DbDeploy and DbDeploy.net in Java and .NET ecosystems, and now use ActiveRecord migrations. If you find liquibase interesting, I recommend taking a look at these tools.

The Neo4j.rb documentation discusses these kinds of migrations against Neo4j.

I personally haven't used a tool to manage migrations in Neo4j, but I've written migration scripts that have done things like rename properties, change edge labels, or create indexes. As an example use case, here's a snippet from a Gremlin Groovy script I used to remap some foreign keys stored in a Neo4j graph and update an index:

try {
  projects.each { node ->
    old_id = node.ref_id
    new_id = old_to_new_ids[old_id]
    index.remove('project', old_id, node)
    node.ref_id = new_id
    index.put('project', new_id, node)
  }
} catch (Throwable e) {
  println(e)
} finally {
  g.shutdown()
}

As of Neo4j version 1.8, there is a PropertyContainer that can be used for graph metadata. It would be simple to use this container to update a 'schema_version' property. The code would look something like:

EmbeddedGraphDatabase db = new EmbeddedGraphDatabase(dbFilename);        
Transaction tx = db.beginTx();
PropertyContainer properties = db.getNodeManager().getGraphProperties();
properties.setProperty("schema_version", 3);
tx.success();
tx.finish();
like image 30
Bobby Norton Avatar answered Sep 28 '22 03:09

Bobby Norton