我可以计算通过特定路径连接到其他节点的节点数吗?

Can I count the number of nodes that are connected to other nodes via specific paths?

你好,我有 Post 个节点,可以通过 REPLY_TO 关系回复这些 Post

像这样: MATCH (p2:Post)-[r:REPLY_TO]->(p:Post)

我想做的是计算总共有多少回复,目前最大深度是 4 个嵌套回复,并且可以有很多回复相同 post,例如:

Post5 -[]-> Post4 -[]-> Post3 -[]-> Post2 -[]-> Post1

Post7 -[]-> Post6 -[]-> Post2 -[]-> Post1

Post8 -[]-> Post1

我不知道如何统计所有 post 回复一个 post。任何的想法?我从这个开始并尝试将 count 更改为 size 并使用 collect,我只是不知道我需要在这里寻找什么!

WITH collect(p2) as post2_count, p2
MATCH (p3:Post)-[r3:REPLY_TO]->(p2)
WITH collect(p3) as post3_count, p3, post2_count
RETURN p2_count, count(post3_count)

上面只有2层深,但在那里不起作用,所以我没有扩展到4层。

提前致谢!

对于这样的事情,你可以使用pattern comprehensions。顺便说一句,这是一个很好的例子,说明了为什么图数据库如此有用,因为它们允许寻找可变长度的路径!

对于这张图

可以使用此密码创建:

CREATE (_241:`Post` { `name`: 'A' }) CREATE (_242:`Post` { `name`: 'B' }) CREATE (_243:`Post` { `name`: 'C' }) CREATE (_244:`Post` { `name`: 'D' }) CREATE (_245:`Post` { `name`: 'E' }) CREATE (_242)-[:`REPLY_TO` {}]->(_241) CREATE (_243)-[:`REPLY_TO` {}]->(_242) CREATE (_244)-[:`REPLY_TO` {}]->(_242) CREATE (_245)-[:`REPLY_TO` {}]->(_244) 

此查询 returns 所有(间接)直接回复(是的,简短而简单):

MATCH (p:Post)
RETURN p.name as post,    
       SIZE([(p)<-[:REPLY_TO*]-(reply:Post) | reply]) AS replies

returns 这个结果:

╒══════╤═════════╕
│"post"│"replies"│
╞══════╪═════════╡
│"A"   │4        │
├──────┼─────────┤
│"B"   │3        │
├──────┼─────────┤
│"C"   │0        │
├──────┼─────────┤
│"D"   │1        │
├──────┼─────────┤
│"E"   │0        │
└──────┴─────────┘

如果您只想要直接回复:

MATCH (p:Post)
RETURN p.name as post,    
       SIZE([(p)<-[:REPLY_TO]-(reply:Post) | reply ]) AS replies

您只需删除可变长度指示器*

╒══════╤═════════╕
│"post"│"replies"│
╞══════╪═════════╡
│"A"   │1        │
├──────┼─────────┤
│"B"   │2        │
├──────┼─────────┤
│"C"   │0        │
├──────┼─────────┤
│"D"   │1        │
├──────┼─────────┤
│"E"   │0        │
└──────┴─────────┘