这适用于将映射元数据的项目。有更多的节点,但这个特殊的节点成为团队中的争论。
哪种模式会产生最佳查询效果?或者没关系?
选项1
权限元数据显式为节点之间的边缘。
选项2
权限元数据位于边缘属性内。
选项3
???
答案 0 :(得分:6)
让我在这里评论ArangoDB,作为其开发者之一。
还有第三种可能性,即为不同的访问方法设置单个顶点集合和多个边集合。然后,您将“正式”拥有3个共享相同顶点集的图形。
我希望这在性能上更好,因为每种访问类型只需要处理单一类型的边缘,访问速度会很快。
显然这一切都取决于你的疑问。我的陈述适用于诸如“一个人可以更新的所有实体是什么?”之类的查询。或“谁可以选择这个实体?”。
我可以想象你的标准查询更多“这个人可以删除该实体吗?”或“此人对该实体拥有哪些访问权限?”。
对于所提出的任何方法,这两个问题可能效率不高,因为据我所知,所有这些问题都需要搜索,无论是在Person的传出边缘还是在Entity的传入边缘。
这里需要的是一种“顶点中心索引”,它是一个可用于给定顶点的输出或输入边缘集合的索引。例如,如果你使用你的选项2(或者实际上是1,这并不重要),并且在所有边上都有一个排序索引,首先由Person排序,然后由实体排序。然后是时间复杂度为O(log(#edges))的查找,以查找从给定Person到给定实体的(可能是单例)边集。
我们ArangoDB目前正忙于添加此功能,该功能将出现在接下来的两个版本之一中。
答案 1 :(得分:1)
我只能在这里代表Neo4j:
我不知道这会很重要,但绝对是基准!关系和属性都存储为链表,因此仍需要遍历它们。但是如果Person
和Entity
节点之间存在更多关系,那么将它们放入属性就会变得更具吸引力。
我建议您查看免费的O' Reilly图书Graph Databases,详细了解Neo4j的内部结构。但基准测试永远是黄金标准。