Neo4j 计算所有邻居的关系';邻居

Neo4j 计算所有邻居的关系';邻居,neo4j,Neo4j,假设我有一个名为User的节点,它与另一个用户有“喜欢”的关系 (u1)-[:Likes]->(u2) 然后我有下面的图表: 用户1喜欢4个用户:2、3、4、5 用户2喜欢用户4、1、3、5 用户3喜欢用户4、1、5 用户4喜欢用户1、2、3 用户5喜欢用户4、2、1 对于用户1,我想找出他的邻居和他的邻居拥有的边的总数,而不计算返回给用户1的边。所以应该是: 用户2:3条边(4、3、5) 用户3:2条边(4,5) 用户4:2条边(2,3) 用户5:2条边(4,2) 因此,查询应该返回4

假设我有一个名为User的节点,它与另一个用户有“喜欢”的关系

(u1)-[:Likes]->(u2)

然后我有下面的图表:

  • 用户1喜欢4个用户:2、3、4、5
  • 用户2喜欢用户4、1、3、5
  • 用户3喜欢用户4、1、5
  • 用户4喜欢用户1、2、3
  • 用户5喜欢用户4、2、1
对于用户1,我想找出他的邻居和他的邻居拥有的边的总数,而不计算返回给用户1的边。所以应该是:

  • 用户2:3条边(4、3、5)
  • 用户3:2条边(4,5)
  • 用户4:2条边(2,3)
  • 用户5:2条边(4,2)
因此,查询应该返回4(邻居数)和9(邻居的边数)

我不知道如何为每个邻居都做这个计数器,我尝试在用户1上添加一个属性并将其用作acummulator,但效果不是很好。(我宁愿在用户1上不创建新属性的情况下进行此操作)

匹配(u1)-[r:Likes]->(u2)
其中u1.id=1
设置u1.n_边=0
对于u1,COLLECT(DISTINCT(u2.id))作为邻居,COUNT(DISTINCT(u2))作为k
把邻居放松一下
匹配(u3:User{id:n})-[r:Likes]->(u4)
其中u4 u1
对于u1,相邻的k,计数(不同的(u4))作为cnt
设置u1.n_边=u1.n_边+cnt
返回k,u1.n_边

这应该为u1的每个邻居返回一行,其中包含其邻居计数,不包括u1:

MATCH (u1:User) WHERE u1.name = "User 1"
MATCH (u1)-[:LIKES]->(n:User)
MATCH (n)-[:LIKES]->(o) WHERE id(o) <> id(u1)
RETURN n.name, count(*) AS neighbors_excluding_u1

谢谢威廉,这真的很有帮助。
MATCH (u1:User) WHERE u1.name = "User 1"
MATCH (u1)-[:LIKES]->(n:User)
MATCH (n)-[:LIKES]->(o) WHERE id(o) <> id(u1)
RETURN n.name, count(*) AS neighbors_excluding_u1
MATCH (u1:User) WHERE u1.name = "User 1"
WITH (u1)-[:LIKES]->(n:User)
WITH count(*) AS n_neighbors, u1
MATCH (u1)-[:LIKES]->(o:User)-[:LIKES]-(fof:User)
RETURN n_neighbors, count(*) AS fof_rel_count