neo4j,在论坛结构中,如何找到每个 post 得到了多少响应(包括 child 的 child...)

neo4j, in a forum structure, how to find how many response each post got (including child of child...)

我正在编写一个程序来分析论坛中的 post。
将论坛主题加载到 neo4j DB
后 我正在尝试 "Rank" posts 他们得到的回复数量

回复 包括直接回复以及每个直接回复的整个 sub-tree。
这个想法是计算树下的所有 children(树是一棵简单的树 没有任何循环

每个post都是一个neo4j节点

# Create MSG nodes:
statement = "CREATE (c:MSG {id:{N}, title:{T}}) RETURN c"
for msg in msgs:
    graph.cypher.execute(statement, {"N": msg[0], "T": msg[1]})

表示 post 的节点是对另一个 post 的响应,与他的 parent 有关系 r:CHILD_OF节点。
根节点不会有 r:CHILD_OF 关系,但会有一个“0”作为它们的 parent ID

|parent id | msg id | Rank | List of all responses
+----------+--------+------+----------------------
|0         | 1051   | 3    | (1054, 1056, 1060)
|1051      | 1054   | 0    |
|1051      | 1056   | 1    | (1060)
|1056      | 1060   | 0    |
|0         | 1052   | 0    |

在此table、

我需要得到可以创建这个排名的密码
但是不知道怎么写。
该项目在 python 中,我正在使用 python 2.7、py2neo 2.0.3、neo4j 2.1.6

这应该 return 树中所有不同的 children:

MATCH (message:MSG {id: {message_id}})<-[:CHILD_OF*0..]-(child:MSG)
RETURN DISTINCT child

如果你想要计数,你可以RETURN COUNT(DISTINCT child)

此查询应该 return 一个与您的 table 相似的结果集(但没有第一列):

MATCH (m:MSG)
OPTIONAL MATCH (c:MSG)-[:CHILD_OF*1..]->(m)
WITH m, COLLECT(DISTINCT c.id) AS childMsgIds
RETURN m.id AS `msg id`, LENGTH(childMsgIds) AS Rank, childMsgIds AS `List of all responses`

这符合您的需求吗?