如何在Neo4j中实现嵌套树?

时间:2014-10-08 14:04:44

标签: neo4j graph-databases

我刚刚开始使用Neo4j和Graph数据库,并且想知道嵌套的分层树是否是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

据我所知,文章和评论都是节点。每条评论都会有亲子关系。对文章(1和5)进行所有直接评论都很容易。但是如何检索整个集合呢?

请原谅使用外行条款。我认为这样做更好,然后尝试使用适当的单词,同时让每个人感到困惑。

2 个答案:

答案 0 :(得分:7)

好吧,因为trees actually are graphs使用图数据库存储树似乎完全适合我。什么是最好的将取决于您的数据访问模式,但基本上树只是图形的专业化。

是的,在您的情况下,树中的"元素"将是节点,并且"嵌套"会是关系。所以,您可以在这里模拟您的示例:

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来连接事物。

现在,&#34;得到一切&#34;只是意味着遍历我们创建的所有:reply关系:

MATCH p=(a:Article {label: "Article"})<-[:reply*1..]-(otherThing) 
WITH nodes(p) as nodes
RETURN nodes[length(nodes)-2] as InResponseTo, 
       nodes[length(nodes)-1] as CommentOrReply;

此查询的作用是遍历任意数量的:reply链接(从根&#34开始;文章&#34;)。然后它只查看该路径中的节点,并返回最后一个项目(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"}   |
+-------------------------------------------------------------------------------------+

这就是你如何遍历整棵树。

编辑 - 为了它的价值,&#34;可变长度路径匹配&#34;,在上面的查询中只是这一位:<-[:reply*1..]-是我是图形数据库的三大卖点之一。正是这些图表数据库变得非常简单,大多数其他替代品如关系都会成为一种极其痛苦的运动。所以,如果你需要做那种事情(就像在这里,组装整个树),我会声称对图表数据库的争论是因为你在其基本力量领域中使用它。

答案 1 :(得分:0)

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