有没有人使用Neo4j节点ID作为大型属性集的其他数据库的外键?

时间:2013-03-20 15:07:11

标签: neo4j

我正在构建一个大型图形数据库,该数据库具有关于每个节点的大量元数据(每个节点有数千个属性)。我目前正在经历确定哪个元数据应该是Neo4j中的节点的过程,该节点应该成为节点的属性,并且应该位于单独的数据库中。

我的想法是以三种方式使用元数据:
1 - 如果属性在许多节点之间共享,那么为了使该属性成为它自己的节点并为该属性创建边缘。

2 - 如果属性对于遍历图形很重要,但不是“高度”共享,则将其添加为节点属性。 (如果需要,也可以在Neo4j中编入索引)

3 =如果元数据严格描述该节点,将其存储在单独的NoSQL数据库中,Neo4J节点ID成为另一个数据库的外键。

虽然使用图形数据库似乎是最有效的使用,但拥有不同的属性类型并在使用它之前必须确定它是哪种类型的属性似乎很痛苦。 (可能是一个属性查找键值存储)它也可能意味着当一个属性变得高度共享或需要进行有效遍历时,我需要一种简单的方法来将属性从3提升到2到1。

有没有人采用这种方法?分享的想法,还是要避免的事情?

1 个答案:

答案 0 :(得分:6)

永远不要在外部系统中存储Neo4j节点ID。节点id基本上是相应商店文件中的偏移量。如果删除节点,则在创建新节点时可能会重用其id。

正确的方法是将“好”标识符(例如uuid)作为节点属性并将其放入Neo4j的索引中。然后保存该uuid以存储在第三方系统中。

前段时间我创建了一个非托管扩展,为每个新节点添加了一个uuid,并阻止对这些uuid进行手动更改:https://github.com/sarmbruster/neo4j-uuid

更新(2013-08-21)

blogged about UUIDs with Neo4j