【问题标题】:Neo4J backed by MongoDB or just Neo4J由 MongoDB 支持的 Neo4J 或只是 Neo4J
【发布时间】:2016-09-09 16:41:49
【问题描述】:

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

例如

(人:name="Bill",age=29,id=1)

对比

(人:id=1, uuid="some-uuid")

我计划为数据提供一个 REST 接口,可能如下所示:

/user/{id}

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

    /user/{id}/friends:

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

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

所以我想我的问题是:将有关节点的数据全部存储在 Neo(性能等)中是否有不利的一面,因为这似乎更干净和简单。

谢谢,

【问题讨论】:

  • 您还存储了哪些其他数据?
  • 无论您是使用单个数据库还是采用 多语言持久性 方法并使用多个数据库,这确实没有正确的答案。这将取决于您的数据的具体形式,以及您希望如何利用每个数据库的优势。在您的示例中,尽管您同时使用两者,但您只是在 neo4j 中存储了一个 id,所以在这种情况下,您如何利用 Neo4j 的查询功能?

标签: mongodb neo4j


【解决方案1】:

这取决于数据的大小(结构)以及您将运行的查询类型。如果您在节点上存储大量数据,可能会对性能造成明显影响——但“巨大”很难用确切的数字来定义;) 需要考虑的一些准则/事项:

  • 您能否设想必须使用更多属性来运行查询以进行过滤 - 您想在查询中使用的任何内容都必须在图表中。那是您的财产的少数还是多数?就个人而言,如果我有 20% 的过滤器属性分布和 80% 仅在您找到节点后使用,那么我会考虑双存储(如果存在其他因素)。如果它是反向的(80% 用于查询,20% 没有)- 可能为简单起见,我会将所有内容存储在图表中。
  • 由于本机存储的实现方式,Neo 应该比使用大量小属性更好地处理较少数量的大属性。我已经做了一些粗略的测量,分别存储所有道具和每个属性的单个 json,导入大型 CSV 的速度要快几倍,没有测量读取,但我预计它也会受到影响。因此,如果你只有几处房产,你会比拥有大量房产并且想要将它们分开来更好
  • 您是否真正证明了对图形大小和速度要求的担忧。虽然在 mongo(或其他东西)中使用未使用的属性可能会更快,但如果差异是 - 比如说 - 典型查询的 100 毫秒与 200 毫秒,那么增加项目的复杂性可能不值得。

总体而言,您的问题肯定是有效的,而且我听说有些项目有人将一些数据移出图表。但是,我不会从这个开始——我会把所有东西都放在 neo4j 中,对你期望的查询和用例做一些基本的性能测试,只有当性能或存储证明是大小不可接受。

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

【讨论】:

    猜你喜欢
    • 2014-12-23
    • 2013-01-05
    • 2019-08-07
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    • 1970-01-01
    相关资源
    最近更新 更多