我可以计算通过特定路径连接到其他节点的节点数吗?
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 │
└──────┴─────────┘
你好,我有 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 │
└──────┴─────────┘