cypher将节点组分配给关系

时间:2015-11-16 13:47:03

标签: neo4j cypher relationship

我正在使用分配到网格位置的用户

(User)-[:PICK_UP]->(Grid)

使用查询

 MATCH (u:User)-[:PICK_UP]->(g:Grid)-[:TO]-(g2:Grid)<-[:PICK_UP]-(u2:User) 
    RETURN g,g2,u,u2 

我有结果enter image description here

在图像中,我有两组节点,表示网格及其与用户的邻居(红色节点)。我想“分组”/创建Spot节点附近用户之间的关系。

E.g。与第一组:网格34,40,41,用户1,4,5,9。我想在我的查询中对用户进行分组,这样我就可以得到结果[user1,u4,u5,u9]然后我可以将这些用户分配给Spot,就像这样

enter image description here

有什么建议吗? 谢谢!!

1 个答案:

答案 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节点。

使用该节点,它通过TOPICK_UP关系找到六跳内的所有MERGE个节点。这应该给予组中的所有用户(我们的代表网格的用户以及其他网格的用户)。

然后Spot从每个用户到Button的关系都很简单。

相关问题