【问题标题】:MongoDB vs Neo4j queryMongoDB vs Neo4j 查询
【发布时间】:2017-07-01 20:08:13
【问题描述】:

我正在比较两个 NOSQL DBMS:MongoDB 与 Neo4j。 在这些数据库中,我有一些足球队的通用名称、官方名称、国家、体育场、制服、ecc...
在 MongoDB 中,uniform 属性是一个包含制服颜色的数组。
在 Neo4j 中,每种颜色都是具有色调属性的节点。 UNIFORM 是将团队与统一颜色联系起来的弧线。
我对他们两个都进行了相同的查询,我想评估性能:查询是找到所有具有统一绿色调的团队的 common_name。

现在,我可以说这个查询在 Neo4j 中比在 MongoDB 中更有效吗? 我认为在 MongoDB 中我必须为每个文档扫描数组统一。相反,在 Neo4j 中,我必须访问图表。我无法在 MongoDB 中使用 cursor.explain("executionStats") 来查看 executionTimeMillis,因为在我的数据库中文档太少,但在 Neo4j 中查询需要 25 毫秒。

【问题讨论】:

    标签: mongodb neo4j nosql


    【解决方案1】:

    您当然应该有更多的文档要测试。但有几点:

    首先,如果你还没有,你应该在 Neo4j 中有一个索引。

    CREATE INDEX ON :colour(tone)
    

    这应该允许 Neo4j 找到您正在寻找的节点,然后快速浏览到适当的 Team 节点。顺便说一下,Neo4j 标签的标准是 UpperCaseFirstCamelCase。见:http://nigelsmall.com/zen

    其次,这是一个小例子,说明了为什么很难比较具有不同范式的数据库。在 MongoDB 中,您将颜色(或颜色;)表示为属性,但在 Neo4j 中,您将其表示为单独的节点。这与在 MongoDB 中拥有一个实体而在 Neo4j 中拥有两个实体并不完全相同。在 Neo4j 中,您还可以在 Team 节点上使用属性,然后将索引放在那里。

    问题是 MongoDB 没有连接/关系的概念。因此,如果您尝试使用 colours 表,那么您将在使用 Mongo 时遇到更多困难。我建议有一个更大的域模型,至少跨越 5-10 个实体,以便您可以更好地进行比较。您应该特别注意您可能希望跨实体查询/聚合的方式。

    如果您希望帮助您更好地了解如何在 Neo4j 中建模,现在有一个公共用户的 Slack 小组,其中有一个建模频道可以帮助您解决这些问题。

    【讨论】:

    • 很好的答案。因此,例如,我可以将具有不同 MongoDB 集合的规范化模型与 Neo4j 的弧进行比较。在这种情况下,由于 MongoDB 中不存在 join,我必须对不同的集合进行更多查询。相反,在 Neo4j 中,我必须以比 MongoDB 更高效的方式访问图表。对吗?
    • 是的,没错。如果您有索引来查找起始节点,那么 Neo4j 可以非常有效地探索图的局部空间的相当大一部分(即通过关系从一个节点遍历到另一个节点)。在 Mongo 中,您需要查询一个集合,获取结果,然后查询您需要的下一组数据,依此类推。在这种情况下,甚至 SQL 也更好;)
    • 完美,非常感谢。我打算用这种方式比较 Neo4j 和 MongoDB。
    • 太好了,再一次,随时加入 Slack 小组!那里有很多人很乐意回答您的问题(即使这意味着我无法获得 StackOverflow 积分;)
    猜你喜欢
    • 2014-12-29
    • 2012-11-29
    • 2012-11-29
    • 1970-01-01
    • 2018-04-07
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多