【问题标题】:Graph database modeling: multiple edges are better than single edges with properties?图数据库建模:多条边比具有属性的单条边好?
【发布时间】:2016-01-17 06:24:52
【问题描述】:

这适用于将映射元数据的项目。还有更多节点,但这个特定的节点在团队中引起了争论。

哪种模型会产生最佳的查询性能?还是没关系?

选项 1

权限元数据显式为节点之间的边。

选项 2

权限元数据位于边缘的属性中。

选项 3

???

【问题讨论】:

  • 其中一个答案是否回答了您的问题?你介意将它标记为已解决吗?如果没有,缺少什么?
  • 我将 Max´s 标记为答案。我们进行了基准测试,据我所知,这完全取决于您尝试回答的模型和问题。我们最终使用了这两种类型,无论哪种更容易编写。明天我们将展示一个小型的概念证明。 :-)

标签: database graph neo4j modeling arangodb


【解决方案1】:

作为 ArangoDB 的开发者之一,让我在这里为 ArangoDB 发表评论。

还有第三种可能性,即为不同的访问方法设置一个顶点集合和多个边集合。然后,您将“正式”拥有 3 个共享相同顶点集的图。

我希望这在性能上会更好,因为每种访问类型只需要处理一种类型的边缘并且访问会很快。

显然,这完全取决于您的查询。我的陈述适用于诸如“一个人可以更新的所有实体是什么?”之类的查询。或“谁可以选择这个实体?”。

我可以想象您的标准查询更多的是“此人可以删除该实体吗?”或“此人对该实体有哪些访问权限?”。

这两个问题对于建议的任何方法都可能无效,因为据我所知,所有这些问题都需要搜索,无论是在 Person 的传出边缘还是在 Entity 的传入边缘。

这里需要一种“以顶点为中心的索引”,即可以用于给定顶点的一组输出或输入边的索引。例如,如果您将使用您的选项 2(或者实际上是 1,这并不重要),并且在所有边上都有一个排序索引,该索引首先按 Person 排序,然后按 Entity 排序。然后是时间复杂度为 O(log(#edges)) 的查找,以查找从给定 Person 到给定 Entity 的(可能是单例的)边集。

我们 ArangoDB 目前正忙于添加此功能,该功能将出现在接下来的两个版本之一中。

【讨论】:

  • 嗯,我不确定我是否关注第三种可能性。想详细说明一下吗?关于1和2,选项2不会有很多开销,因为您必须将所有权限定义为所有边缘的真或假?
【解决方案2】:

我只能在这里为 Neo4j 说话:

我不知道这很重要,但绝对是基准!关系和属性都存储为链表,因此仍然需要遍历它们。但是,如果您在 PersonEntity 节点之间有更多的关系,那么将它们放在属性中就会变得更有吸引力。

我建议查看免费的 O'Reilly 书籍Graph Databases,以了解有关 Neo4j 内部结构的更多信息。但基准永远是黄金标准。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 2017-04-20
    • 2020-11-21
    • 1970-01-01
    • 2016-10-30
    相关资源
    最近更新 更多