在neo4j中存储数据的最佳实践

时间:2014-01-31 13:10:23

标签: neo4j neo4jphp

我正在使用neo4jphp开发论坛的web应用程序,其中多个用户将对相同主题发表评论,并且还可以评论评论(如嵌套评论)。

那么在neo4j中存储这些数据的最佳做法是什么?

我想到了以下选项:

  1. 为每个评论,子评论创建新节点,并在主题和评论与子评论之间创建关系

  2. 为每个主题创建节点,每个注释并在它们之间创建关系,并将所有注释作为属性添加到相同的注释节点。

  3. 我认为第一个选项更好,但我担心要创建的节点数量会随着主题数量和评论的增加而增加。

    当节点数量增加时,neo4j性能,效率是否会下降?

    我们应该为sql中的每个记录/行创建单独的节点吗?

    最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

我在trartsaris.gr完成了我的博客,完全使用php和Neo4j 2.0。经过大量的测试和思考未来后,我决定以你描述的第一种方式启用评论。这意味着在架构设计的最后,您的数据库应该如下所示

  

(m:发表“或主题”) - [:评论] - (n:评论) - [:SUB_COMMENT] - (s:SubComment)

所以我们有一个节点,它是Post或Topic,这个节点与Label有连接的节点:Comment和relationship:Comment和那些注释可以有Label的子注释:SUB_COMMENTS。您不必担心将要创建的节点数量以及如何获取它们,因为一切都足够快。您可以在this question上阅读我的答案。 让我们看看为什么我更喜欢第一种方式,而我正在考虑未来的潜在用例。你可以稍后再这样: 我是一位用户,我评论了另一位用户的主题评论。基于此操作,我可以在我的数据库中搜索此用户的相关主题,并提供进一步阅读的建议。

MATCH (n:User(ID))-[:WROTE_SUB_COMMENT]-(s:SubComment)-[:SUB_COMMENT]-(c:Comment)-[:COMMENT]-(p:Post)-[:WRITTEN_BY]-(k:User)-[:WRITTEN_BY]-(g:Post) WHERE blablabla RETURN g

以简化的方式,我们说我们要查找初始用户为其编写子注释的用户编写的所有帖子。这可能看起来有点令人困惑,但随着你越来越多地潜入Neo4j,你会发现一切都会变得越来越容易。 我希望这有点帮助。