Neo4J:数据建模 - 创建太多关系

时间:2014-04-14 10:27:07

标签: neo4j cypher graph-databases

我正在研究一个用例,在这个

  • 有用户。
  • 有标签。
  • 用户与其他用户共享帖子(内容)。每个帖子都连接到多个标签。

考虑创建用户,标记和发布节点。

分享帖子时:

  • 在Post节点和用户节点之间添加关系(与谁共享帖子,最多可以有20个用户)。
  • 在帖子节点和帖子创建者之间添加关系。
  • 在Post节点和Tag节点之间添加关系(最多可以包含20个标签)

我认为以这种方式添加关系有助于按用户或标签检索帖子。

非常频繁地创建帖子。

我的担忧: 我觉得这种方法会为每个帖子创建大量数据(帖子节点以及与标签和其他用户的关系)。此外,认为数据将随着帖子的共享而快速增长,并认为每个帖子创建都是一项昂贵的操作。

你认为这种方法还不错还是有更好的方法?

2 个答案:

答案 0 :(得分:2)

需要注意的一个问题是,当你创建一个关系时,Neo4j会锁定两端的节点 http://neo4j.com/docs/stable/transactions-locking.html 这意味着在创建帖子并将其发送给20个用户和20个标签的事务期间,事务必须在每个用户和标记节点上获取写锁定。尝试将节点链接到任何节点的其他事务将阻塞,从而导致争用。由于许多锁是以非确定性顺序获取的,这有时会导致死锁,从而导致Neo4j抛出异常并中止事务。由于帖子是非常频繁地创建的,这可能会导致问题。 (我在类似的数据模型中遇到过这个问题。)

答案 1 :(得分:1)

通过有意义的关系将许多节点链接在一起是一个很好的设计,因为它充分发挥了neo4j的优势。如果您的应用程序需要知道这些关系,那么您的设计听起来像一个体面的。你还有其他选择;例如,如果您想知道帖子有哪些标签,您可以将标签存储为帖子上节点属性内的字符串数组。这样做的好处是可以很容易地维护单个帖子的标签。如果你想查询标记为"烹饪"的所有帖子,那将会有一个很大的缺点。它会慢得多,因为你必须搜索任何一个名为" tag"含有一定的价值。

您的疑虑"创建大量数据"和"创建后是一项昂贵的操作"非常一般。他们可能是有效的担忧。他们可能只是担心你不应该担心。鉴于您提供的信息,我无法告诉您。

一般而言,通过节点和关系进行建模是一种很好的方法,但是您需要充分明确您的应用程序需求,并且随着时间的推移,您的可扩展性需要为问题提供真正可靠的答案。这是正确的设计"?