在Neo4j中,当粒度级别可以无限制时,应该使用什么级别的特异性?

时间:2018-01-27 08:57:23

标签: neo4j data-modeling

使用图形数据库时最困难的事情是选择粒度级别。让我们说我有一个图表显示在一周中的某些日子发生的事情:垃圾日,周五墨西哥比克,周五BYOB等。

  • 我可以让每一天都成为一个节点(周一,周二,周三......),这样,查询特定的日子很快。
  • 我可以创建一个名为Day的节点,并使用星期几添加属性名称。这样,显示图表中的所有日子都很容易查询。

对自己思考,使节点非常具体是不好的,因为粒度没有限制。例如,星期六早上,晚上和晚上,或者更糟糕的是,每天每小时一个新节点。我也可以通过将星期六节点链接到"晚上"来使边缘成为粒度的一个组成部分。边缘到垃圾日节点。

我偶尔遇到类似的问题,例如;我应该根据一个人的全名创建一个新节点,还是一个名为" Person"有财产"名称"。然后我根据便利性制作特定或一般的节点,但我觉得可能有一些最佳实践或更高级别的原则我没有。我不清楚如何判断哪条路更好。

2 个答案:

答案 0 :(得分:4)

数据模型的粒度级别应该由您的查询要求驱动,而不是相反。那就是:在建模数据库时,你应该问自己:“我会对我的数据做什么样的查询?”。根据这个问题的答案,您将获得一个良好的起点,以制作具有适当粒度级别的良好模型。

在Rik Van Bruggen的书中学习Neo4j (您可以在this link下载)中,作者谈到了查询能力的设计图数据库:

  

与任何数据库管理系统一样,但可能更为如此   一个图形数据库管理系统,如Neo4j,您的查询将   驾驶你的模型。我们对此的意思是,就像它一样   您可能在过去使用过的任何类型的数据库   今天仍在使用,您需要做出具体的设计决策   基于具体的权衡取舍。因此,没有   在图形数据库中建模的一种完美方式,例如Neo4j。的它   将全部依赖于您想要询问的数据问题,以及   这将推动您的设计和模型。

那么,基于此,您的问题的答案 “当粒度级别可以无限制时应该使用什么级别的特异性?” 是:它取决于您的查询要求。首先考虑您将要执行的查询,然后再考虑数据模型。

我的建议是:让您的模型在开始时尽可能简单,并在需要时逐步进行更改。

答案 1 :(得分:2)

首先,我建议您考虑您要对数据执行的操作。你不使用图形数据库来存储数据,你也想用它做一些事情。所以你可能有一个特定的用例,比如寻路。在这种情况下,没有多少选项,但仍然有不同的方式来建模数据。在这种情况下,我将看看已经提供的算法,以及它们是否能够处理我想用它做的事情。所以我想说我想使用apoc.algo.aStar,因为它能够做我想做的事情。此时我限制自己,因为aStar只能处理关系上的权重,算法希望在节点上有坐标。这可能也是您想到的第一个架构,但我认为您可以了解它背后的想法。如果您的问题没有算法,那么您将自己制作算法。看看您拥有的选项,您通常只能使用某种方式对数据进行建模。

正如您已经说过的那样您处理数据的方式也会对查询某些事情的速度产生影响。例如,您为地图建模,因此您有一个A点和B点,您希望从A到B和B到A. neo4j中的问题是您没有双向边缘。所以你可以考虑添加2个边,从A到B,从B到A.不要这样做!性能将遭受很多遍历。

  
      
  • 我可以让每一天都成为一个节点(周一,周二,周三......),这样,查询特定的日子很快。
  •   
  • 我可以创建一个名为Day的节点,并使用星期几添加属性名称。这样,在图表中显示所有日子都很容易   查询。
  •   

问问自己为什么你有这个数据库以及你想用它做什么,不要忘记索引。您仍然可以创建索引以获得一些性能,这在第一个示例中仍然存在。还要避免添加冗余数据。例如,节点日连接到所有工作日。大家都知道星期五是一天。如果你从中受益,只考虑这样做。在对几个图形进行建模并为图形编写自己的算法之后,您将会感受到它。在某些时候,您将了解如何最好地为特定用例设计图表。 经验是设计图表的关键,了解您已经可以使用的算法的局限性以及您可以自己完成的事情。我希望这会有所帮助。