图数据库的简单社交网络设计缺陷

Simple social network design flaw with graph database

我正在研究图形数据库和 Neo4j。按照建议,我尝试在白纸上绘制一个简单的社交网络图,在画了几张草图后,我在一些相似的点上停留了下来。

起初我设计了一个社交网络,其中 "user"s 可以 "like" "post"s。

(u1:User)-[:LIKED]->(p:Post)<-[:POSTED]-(u2:User)

现在我要通知user2点赞了,把这个画在白纸上

(u1:User)-[:LIKED]->(p:Post)<-[:POSTED]-(u2:User)
              |                            ^
              |__________[:NOTIFY]_________|

我不确定是否清楚,但我只是画了一个节点和另一个关系之间的关系,这对于图形数据库来说是不可能的,至少对于 Neo4j 是不可能的。所以我决定,Like 应该是一个节点而不是关系。然后我的图变成了这个

(u1:User)-[:CREATAD]->(l:Like)-[:BELONGS_TO]->(p:Post)<-[:POSTED]-(u2:User)
                          |                                           ^
                          |__________________[:NOTIFY]________________|

现在一切正常。然后我将评论功能作为关系添加到系统中,但是当涉及到通知时,它又变成了一个节点。当我添加 "Liking comments" 功能时也发生了同样的情况,"Likes to Comments" 起初看起来它们是关系,但当涉及通知时它们又变成了节点。

总的来说,在某些时候我发现自己在绘制一个节点和另一个关系之间的关系。我对此的解决方案感觉就像我正在将自然看起来像关系的实体变成节点。这让我想到我在决定什么应该是节点以及什么应该是关系时遇到了一些问题。

所以我的问题是,除了我之外,是否还有其他人陷入此 "relationship between a node and another relationship" 问题,如果是,您如何解决?

这完全取决于您的用例,在许多情况下,一个简单的关系就足够了,但是如果您想对那个实体或事实做更多的事情,您可以将它变成一个节点,通常它是一个节点实际上是领域中非常重要的概念。

在我们的数据建模 class 中有专门的章节,"Graph Databases" 书中也对此进行了详细讨论(您可以获取 free PDF here)。

有时,如果您不需要该细节,保持原始关系以便快速跨越该中间节点的快捷方式是有意义的。