图形数据库建模:多边缘优于具有属性的单边缘?

时间:2015-10-19 01:45:50

标签: database graph neo4j modeling arangodb

这适用于将映射元数据的项目。有更多的节点,但这个特殊的节点成为团队中的争论。

哪种模式会产生最佳查询效果?或者没关系?

选项1

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

选项2

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

选项3

???

Graph Modeling of Metadata: Which one is better?

2 个答案:

答案 0 :(得分:6)

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

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

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

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

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

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

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

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

答案 1 :(得分:1)

我只能在这里代表Neo4j:

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

我建议您查看免费的O' Reilly图书Graph Databases,详细了解Neo4j的内部结构。但基准测试永远是黄金标准。