2015-10-19 28 views
2

这是用于映射元数据的项目。还有更多的节点,但是这个特定的节点成了团队中的一场辩论。图形数据库建模:多条边比单边具有更好的属性?

哪个模型会产生最佳的查询性能?或者没关系?

选项1

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

选项2

权限元数据是所述边缘的特性的内部。

选项3

???

Graph Modeling of Metadata: Which one is better?

+0

做了答案之一回答你的问题?你介意把它标记为已解决吗?如果没有,缺少什么? – dothebart

+1

我标记Max's作为答案。我们做了基准测试,并且据我所知,这一切都取决于您尝试回答的模型和问题。 我们结束了使用这两种类型,无论哪个证明更容易编写。我们明天将展示一个小概念证明。 :-) – Ricardo

回答

6

让我ArangoDB这里发表评论,是它的开发者之一。

还有第三个可能性,即具有对不同的访问方法的单个顶点集合和多个边缘集合。然后你会“正式”得到3个共享相同顶点集的图。

我希望这是更好的性能,因为每次访问类型将只需要处理一个单一类型的边缘和接入的是快。

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

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

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

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

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

1

我只能在这里Neo4j的说话:

我不知道它会多大关系,但绝对标杆!关系和属性都存储为链接列表,所以它仍然需要遍历它们。但是如果你在PersonEntity节点之间有更多的关系,那么把它们放在属性中就会变得更有吸引力。

我建议检查出的免费O'Reilly出版Graph Databases了解更多有关的Neo4j的内部。但基准将始终是黄金标准。