2016-05-13 43 views
1

我正在构建一个非常适合图形数据库的应用程序,并决定使用Neo4J。我有两个想法:是否在Neo4J节点上存储关于特定节点的数据,或者只是引用mongo db中的项目。Neo4J由MongoDB或Neo4J支持

例如

(联系人:NAME = “条例”,年龄= 29,ID = 1)< -neo

(联系人:ID = 1,UUID = “一些的UUID”)< - 新 {UUID: “一些的UUID” NAME = “条例”,年龄= 29} < - 蒙戈

我计划有一个REST接口,这可能看起来像数据:

/user/{id}

  • (neo)我会通过neo中的id查找个人用户。
  • (neo + mongo)我会在mongo中找到用户(不需要触摸neo)。

    /user/{id}/friends

  • (新)查找用户的所有朋友和加载节点

  • (新+蒙戈)查找用户的所有朋友们的ID和然后查询蒙戈的数据

所以我想我的问题是:是否有一个存储我的数据有关节点的所有Neo(性能等),因为这看起来更干净和简单。

感谢,

+0

您还存储了哪些其他数据? – manonthemat

+0

无论您使用单个数据库还是采用* polyglot持久性*方法并使用多个数据库,都无法正确回答此问题。这将取决于数据的特定形式,以及如何利用每个数据库的优势。在你的例子中,尽管你同时使用了两个,但你只能在neo4j中存储一个id,所以在那种情况下,你甚至如何利用Neo4j的查询功能? –

回答

2

这取决于你的数据的大小(结构),什么类型的查询,你会运行。有可能观察到的性能损失,如果你存储在节点上的数据量巨大 - 但“庞大”难以确切数字来定义;)是一些指导方针/事情要考虑:

  • 你能想象有运行使用更多属性进行过滤的查询 - 您想在查询中使用的任何内容必须位于图中。你的属性是少数还是多数?就个人而言,如果我有过滤器的20%属性的分配,并且只有当您找到节点时才使用80%的属性,那么我会考虑双存储(如果存在其他因素)。如果它是相反的(80%用于查询,20%不用) - 可能为了简单起见,我会将所有内容存储在一张图中。
  • 由于实施本地存储的方式,Neo应该比大量小型属性更少数量的大型属性更好地工作。我已经做了一些粗略的测量,将单个json的所有道具分别存储到每个属性中,并且导入大量CSV的速度要快几倍,但没有测量读数,但我预计它也会受到影响。所以,如果你只有几个属性,你会变得更好,如果你有他们的负载,并且你想保持它们分开
  • 你是否图形大小和速度的要求实际上证明担心它。 mongo(或其他)中未使用的属性可能会更快,如果差异是 - 例如 - 典型查询中的100ms与200ms之间的差异,则可能不值得增加项目的复杂性。

总的来说,你的问题肯定是有效的,有些项目我听说有人将一些数据从图中移出。然而,我不会从这一开始 - 我将所有内容都放入neo4j中,首先对查询和用例进行基本的性能测试,然后将结果重构为mongo,但前提是性能或存储大小是不可接受的。

P.S.我还应该提到,如果假设你对读取操作很聪明,你可能会在写入时看到这一点。如果您设法让阅读查询以只返回特定属性(而不是完整节点)的形式出现,那么无论多少属性“附加”,阅读都不会受到影响。换句话说,如果用户拥有大量属性并且只对名称感兴趣,那么执行RETURN user.name将比RETURN用户快得多。

0

记得我几年前在伦敦的图形连接有趣的演示文稿。阿迪达斯全球实际上使用neo4j作为元数据存储。我觉得莉莉已经给出了很好的答案。也许我可以补充一件事。

我确实认为neo的家伙做得非常出色,而且您应该获得企业版的许可证。但是:如果你不在那里,你将不得不使用社区版。这意味着你将没有高可用性群集。当然,您可以设置多个实例并将它们放在负载平衡器后面。但是,如果您将neo用作主数据存储区,则意味着您必须进行写入操作。这种情况会非常快速地变得非常糟糕。

如果您需要使用社区版本(暂时),并且希望能够进行扩展,那么您只会停留在只读数据库和批处理过程中。 (请注意,批量导入器速度非常快,但确实需要Java)。

如果您可以使用企业比您可以做(近)实时更新。你可以使用neo4j作为主数据存储。

但我不会这样做。这是我的个人建议。使用neo4j来处理它的好处。不要将其用作主数据存储。 Neo4j未针对数据存储进行优化。无论您是使用MySQL,MongoDB还是Hadoop。他们每个人都参与neo4j没有(也可能不应该)关心自己的功能。 neo4j也很依赖RAM。我希望neo尽可能高效地使用可用内存。

最后但并非最不重要。 Neo4j非常好地解决了预定义的问题。这意味着您的数据通常是在域问题之后建模的,您需要快速,实时地回答问题。但所需的模型可能根本不代表您的数据结构。你可能想要考虑的东西。 :-)