【发布时间】:2012-06-28 15:26:35
【问题描述】:
我使用 Neo4j 已经有一段时间了,并且使用 Neo4j 启动并运行了一个应用程序,它的所有工作都非常好,Neo4j 在解决这个问题方面真的很酷,但我现在需要扩展应用程序并拥有一直试图实现。 Neo4j 中的数据键值列表,我不确定最好的方法。
我有一个列表,该列表的长度约为 700 万个元素,因此仅将整个列表存储在内存中并自己管理它有点长。我对此进行了测试,它会消耗 3Gb。
我的选择是:
- (a) Neo4j 只是不适合这项工作的工具,我应该使用实际的键值数据存储。这样做有点不利,因为我必须为这个数据列表引入另一个数据存储。
- (b) 使用 Neo4j,通过为每个键值创建一个节点,将键和值设置为节点上的属性,但是除了有一个索引将这些节点组合在一起之外没有任何关系,从而暴露了键的键-value 作为索引上的键。
- (c) 创建单个节点并将所有键值作为属性保存,这感觉不对,因为在获取节点时会将整个内容加载到内存中,然后我必须在属性中搜索我有兴趣,还不如自己管理列表。
- (d) 键是实际指向两个节点的两部分键,因此创建关系并将值设置为关系上的属性。我开始走这条路,但是在查找特定键/值时,它并不简单快速,所以放弃了。
选项“a”或“b”感觉不错。
任何意见,将不胜感激。
示例场景
我们有节点 A 和节点 B,这两个节点之间存在关系。 节点都具有“foo”的属性,其中 foo 具有一定的价值。 在此示例中,节点 A 具有 foo=X,节点 B 具有 foo=Y
然后我们有这个 K/V 列表。其中一个 K/V 是 Key:X+Y=Value:Z 因此,最初的想法是在节点 A 和节点 B 之间创建另一个关系,并在持有 Z 的关系上存储一个属性。然后在 'foo' 上创建一个索引,并在新关系上创建一个关系 idx。
当给定 Key X+Y 时获取值。 查找逻辑将是获取节点 A(来自 X)和节点 B(来自 y),然后遍历节点 A 关系到节点 B 查找这种新的关系类型。 虽然这会起作用,但我不喜欢我必须查找与节点之间的所有关系以查找特定类型的事实,这是低效的。尤其是当有许多不同类型的关系时。
所以结论是选择“A”或“B”,或者我正在尝试对 Neo 做一些不切实际的事情。
【问题讨论】: