如何在Neo4j中实现嵌套树?

如何在Neo4j中实现嵌套树?,neo4j,graph-databases,Neo4j,Graph Databases,我刚刚开始学习Neo4j和图形数据库,想知道嵌套的层次结构树是否是Neo4j的一个好用例。一个常见的例子是一组嵌套的注释。例如: - Article - Comment 1 on Article - Comment 2 on Comment 1 - Comment 3 on Comment 1 - Comment 4 on Comment 3 - Comment 5 on Article CREATE (root:Article {label:

我刚刚开始学习Neo4j和图形数据库,想知道嵌套的层次结构树是否是Neo4j的一个好用例。一个常见的例子是一组嵌套的注释。例如:

 - Article
  - Comment 1 on Article
     - Comment 2 on Comment 1
     - Comment 3 on Comment 1
         - Comment 4 on Comment 3
  - Comment 5 on Article
CREATE (root:Article {label: "Article"}),
       (c1:Comment {label: "Comment 1"}),
       (c1a:Comment {label: "Comment 2 on comment 1"}),
       (c1b:Comment {label: "Comment 3 on comment 1"}),
       (c1b1:Comment {label: "Comment 4 on comment 3"}),
       (c2:Comment {label: "Comment 5 on article"}),
       (root)<-[:reply]-(c1),
       (c1)<-[:reply]-(c1a),
       (c1)<-[:reply]-(c1b),
       (c1b)<-[:reply]-(c1b1),
       (root)<-[:reply]-(c2);
据我所知,文章和评论都是节点。每个评论都有一个父子关系。获得对文章(1和5)的所有直接评论是很容易的。但是取回整套怎么样

请原谅使用外行术语。我认为这样做比试图使用合适的词来迷惑每个人要好。

好吧,因为使用图形数据库来存储树对我来说似乎完全合适。什么性能最好将取决于您的数据访问模式,但基本上树只是图形的一种特化

是的,在您的例子中,“树中的元素”是节点,“嵌套”是关系。下面是您如何模拟您的示例:

 - Article
  - Comment 1 on Article
     - Comment 2 on Comment 1
     - Comment 3 on Comment 1
         - Comment 4 on Comment 3
  - Comment 5 on Article
CREATE (root:Article {label: "Article"}),
       (c1:Comment {label: "Comment 1"}),
       (c1a:Comment {label: "Comment 2 on comment 1"}),
       (c1b:Comment {label: "Comment 3 on comment 1"}),
       (c1b1:Comment {label: "Comment 4 on comment 3"}),
       (c2:Comment {label: "Comment 5 on article"}),
       (root)<-[:reply]-(c1),
       (c1)<-[:reply]-(c1a),
       (c1)<-[:reply]-(c1b),
       (c1b)<-[:reply]-(c1b1),
       (root)<-[:reply]-(c2);
此查询所做的是遍历任意数量的
:reply
链接(从根“Article”开始)。然后它只查看该路径中的节点,并返回最后一项(
CommentOrReply
)及其响应内容(最后第二项)

结果如下所示:

+-------------------------------------------------------------------------------------+
| InResponseTo                             | CommentOrReply                           |
+-------------------------------------------------------------------------------------+
| Node[18]{label:"Article"}                | Node[19]{label:"Comment 1"}              |
| Node[19]{label:"Comment 1"}              | Node[20]{label:"Comment 2 on comment 1"} |
| Node[19]{label:"Comment 1"}              | Node[21]{label:"Comment 3 on comment 1"} |
| Node[21]{label:"Comment 3 on comment 1"} | Node[22]{label:"Comment 4 on comment 3"} |
| Node[18]{label:"Article"}                | Node[23]{label:"Comment 5 on article"}   |
+-------------------------------------------------------------------------------------+
这就是遍历整棵树的方法


<>强> >编辑< /强> -“可变长度路径匹配”,在上面的查询中只是这个位:<代码>

如果嵌套树是完全有向图并且没有循环(即有向无环图=DAG),那么你可以考虑关系数据库中的传递闭包方法。这些允许通过多个嵌套级别和多个交叉点的查找进行非常快速的查询。它们有n平方问题,因此有很多行,但是使用bigint索引查询运行得很快

如果您想了解更多关于树的用例,请查看这些:非常感谢您的精彩详细的回答!我正在试图弄清楚如何从这个结果中检索嵌套哈希,例如JSON。但这不是一个真正的数据库问题。。。一般来说,一切看起来都比使用MySQL时必须想到的嵌套集方法快得多;在mysql中,常见的模式是只有一个表用于连接到自身的节点-检查3-4之间的深度变得非常困难。顺便说一句,如果不需要在MATCH子句中进一步引用节点,可以使用()而不是(otherThing)。刚刚了解到这一点。请注意,对于根节点没有明确标签的用户,可以使用
WHERE NOT()-->(a)