我正在使用分配到网格位置的用户
(User)-[:PICK_UP]->(Grid)
使用查询
MATCH (u:User)-[:PICK_UP]->(g:Grid)-[:TO]-(g2:Grid)<-[:PICK_UP]-(u2:User)
RETURN g,g2,u,u2
在图像中,我有两组节点,表示网格及其与用户的邻居(红色节点)。我想“分组”/创建Spot节点附近用户之间的关系。
E.g。与第一组:网格34,40,41,用户1,4,5,9。我想在我的查询中对用户进行分组,这样我就可以得到结果[user1,u4,u5,u9]然后我可以将这些用户分配给Spot,就像这样
有什么建议吗? 谢谢!!
答案 0 :(得分:0)
要记住的是,(u:User)-[:PICK_UP]->(g:Grid)-[:TO]-(g2:Grid)<-[:PICK_UP]-(u2:User)
与特定路径匹配,当您在图形显示中看到两个组时,实际上存在重叠路径。在表格模式下查看结果可能会有所帮助。
所以回答你的问题!首先,这是一个棘手的问题,但真的很酷。我想我有一个很好的解决方案:
MATCH path=(grid:Grid)-[:TO]-(other_grid:Grid)
WITH CASE WHEN ID(grid) < ID(other_grid) THEN ID(other_grid) ELSE ID(grid) END AS id_to_reject
WITH collect(DISTINCT id_to_reject) AS ids_to_reject
MATCH (grid:Grid)
WHERE NOT(ID(grid) IN ids_to_reject)
CREATE (spot:Spot)
WITH grid, spot
MATCH (grid)-[:TO|PICK_UP*1..6]-(user:User)
MERGE (user)-[:AT_SPOT]->(spot)
查询首先要做的是比较彼此相关的所有Grid
个节点。对于这些对中的每一对,它都传递给ID()
节点的Grid
,该节点更大。因此,不在列表中的ID
是组中最小的Grid
,并且可以充当该组的代表。对于这些代表性Spot
节点中的每一个,我们创建一个User
节点。
使用该节点,它通过TO
和PICK_UP
关系找到六跳内的所有MERGE
个节点。这应该给予组中的所有用户(我们的代表网格的用户以及其他网格的用户)。
然后Spot
从每个用户到Button
的关系都很简单。