由MongoDB或Neo4J支持的Neo4J

时间:2016-05-13 13:01:37

标签: mongodb neo4j

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

e.g。

(人:姓名="比尔",年龄= 29,身份= 1)< -neo

VS

(人:id = 1,uuid =" some-uuid")< - neo {uuid:" some-uuid",name =" Bill",age = 29}< - mongo

我计划为数据建立一个REST接口,如下所示:

/user/{id}

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

    /user/{id}/friends

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

  • (neo + mongo)找到用户的所有朋友获取Id,然后查询mongo获取数据

所以我想我的问题是:在Neo(性能等等)中存储关于节点的数据是否存在缺点,因为这看起来更简洁一些。

谢谢,

1 个答案:

答案 0 :(得分:3)

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

  • 您是否可以设想必须使用更多属性来运行查询以进行过滤 - 您要在查询中使用的任何内容都必须位于图表中。这是您的少数或大多数财产?就个人而言,如果我为过滤器分配了20%的属性,而只有在找到节点后才使用80%,那么我会考虑双重存储(如果存在其他因素)。如果它是反向的(80%用于查询,20%不用) - 可能为了简单起见,我将所有内容存储在图表中。
  • 由于本机存储的实现方式,Neo应该在较大数量的较大属性上比大量小属性更好地工作。我已经完成了一些粗略的测量,分别存储了所有道具的单个json与每个属性相比,导入大型CSV的速度提高了几倍,还没有测量读数,但我希望它也是影响。所以,如果你只有几个属性,那么你会比你有很多属性更好,并且你想让它们分开。
  • 你的图表尺寸和速度要求是否真的值得担心它。虽然在mongo(或其他东西)中使用未使用的属性可能会更快,但如果在典型查询中差异为 - 例如 - 100ms vs 200ms,则可能不值得增加项目的复杂性。

总的来说,你的问题肯定是有效的,有些项目让我听到人们将一些数据移出图表。但是,我不会从这开始 - 我将所有内容都放入neo4j开始,对查询和用例进行一些基本的性能测试,并将事情重构为mongo,但事实证明性能或存储大小是不可接受的。

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