我最近接触了图形数据库的世界。对于像我这样的老关系狗来说,这是一个非常有趣的范式转变。
也是最近,我一直在修补 liquibase,它是管理数据库的一个非常好的工具。
所以,两个世界发生了碰撞,我只是想知道是否有任何工具可以对图形数据库进行类似 liquibase 的更改管理。我对neo4j
和特别感兴趣orientdb
。
我最近接触了图形数据库的世界。对于像我这样的老关系狗来说,这是一个非常有趣的范式转变。
也是最近,我一直在修补 liquibase,它是管理数据库的一个非常好的工具。
所以,两个世界发生了碰撞,我只是想知道是否有任何工具可以对图形数据库进行类似 liquibase 的更改管理。我对neo4j
和特别感兴趣orientdb
。
Liquigraph现在存在,虽然还很新,但作者非常乐于接受反馈并积极致力于该项目。
Pramod Sadalage 和 Martin Fowler 在 2003 年发表的关于进化数据库设计的有影响力的文章对我如何管理数据库中的模式更改产生了重大影响。我继续在 Java 和 .NET 生态系统中使用DbDeploy和 DbDeploy.net,现在使用ActiveRecord 迁移。如果你觉得 liquibase 很有趣,我建议你看看这些工具。
Neo4j.rb 文档讨论了针对 Neo4j的这些类型的迁移。
我个人没有使用工具来管理 Neo4j 中的迁移,但我编写了迁移脚本,这些脚本完成了重命名属性、更改边缘标签或创建索引等操作。作为一个示例用例,下面是 Gremlin Groovy 脚本的一个片段,我用来重新映射存储在 Neo4j 图中的一些外键并更新索引:
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()
}
从 Neo4j 版本 1.8 开始,有一个 PropertyContainer 可用于图元数据。使用这个容器来更新“schema_version”属性会很简单。代码看起来像:
EmbeddedGraphDatabase db = new EmbeddedGraphDatabase(dbFilename);
Transaction tx = db.beginTx();
PropertyContainer properties = db.getNodeManager().getGraphProperties();
properties.setProperty("schema_version", 3);
tx.success();
tx.finish();
就个人而言,我会对基于 TinkerPop API 的东西更感兴趣。我认为这个 API 被多个不同的数据库支持,这就是它的设计目的。我希望能够定义我的顶点标签、边缘标签、属性、索引等——而不是试图与为关系数据库设计的(伟大的)技术保持一致。
Objectivity/DB 是一个面向对象/图形数据库,具有称为“Schema Evolution”的功能。此功能允许您创建架构、加载数据、更改架构以及加载更多数据。您可以根据需要多次更改架构。我们的客户已经部署了操作系统,并且已经更改了数百次架构,而无需重新加载数据。
模式演变功能使用模式“形状”的概念,其中每个形状都存储在模式目录中,每个对象都有一个形状 ID。从磁盘读取对象时,形状 id 用于从目录中查找模式形状。然后,如果目录形状不是该架构类型的“最新”形状,则实际对象数据会即时“进化”以匹配该对象类型的最新形状。这使得操作系统不必仅仅因为有人想要一个额外的属性就重新加载 PB 级数据库。
有许多类型的模式更改是允许的,添加、删除、重新键入属性,但有一些模式更改是不允许的,因为它们会在功能上破坏数据和/或模式。
免责声明:我受雇于 Objective, Inc.