不能在foreach中使用Merge来存在节点

时间:2015-11-01 13:29:52

标签: neo4j cypher

我期待他跟随查询以这种方式创建节点(仅在退出时)和给定源节点(1)和列表(2)之间的关系:

MERGE (p1:C9{userId: '1'}) WITH p1, [{userId:"2"}] AS users 
FOREACH (user IN users | MERGE 
((p1)-[r1:follow]->(:C9 {userId: user.userId})))

结果如下:

enter image description here

现在,如果我通过以这种方式切换节点ID再次执行此查询:

 MERGE (p1:C9{userId: '2'}) WITH p1, [{userId:"1"}] AS users 
    FOREACH (user IN users | MERGE 
    ((p1)-[r1:follow]->(:C9 {userId: user.userId})))

我们得到了这个:

enter image description here

neo4j 重复对我来说id = 1的节点。我希望它在现有节点的情况下合并。

我希望看到只有两个节点通过合并现有节点相互连接。

知道我应该修理什么吗?

谢谢, 射线。

2 个答案:

答案 0 :(得分:2)

当我可以使用FOREACH时,我通常会避免UNWIND,所以我会从这样的事情开始:

MERGE (p1:C9 {userId: '1'})
WITH p1, [{userId:"2"}] AS users 
UNWIND users AS user
MERGE (p1)-[r1:follow]->(:C9 {userId: user.userId})

有时您还希望将节点创建与关系创建分开。如果你同时做两件事,我认为Neo4j可以认为你想要一个节点(有属性)和关系的独特组合。

MERGE (p1:C9 {userId: '1'})
WITH p1, [{userId:"2"}] AS users 
UNWIND users AS user
MERGE (p2:C9 {userId: user.userId})
MERGE (p1)-[r1:follow]->(p2)

答案 1 :(得分:0)

您可以在MERGE中使用FOREACH

但是你必须理解MERGE的语义。它尝试MATCH完整模式,如果找不到它,它将完全CREATE该模式。

在您的情况下,您尝试在p1的上下文中找到模式而不是全局,如果没有找到,它将在p1的上下文中创建它。

因此,如果您将查询更改为:

MERGE (p1:C9{userId: '2'}) 
WITH p1, [{userId:"1"}] AS users 
FOREACH (user IN users | 
  MERGE (p2:C9 {userId: user.userId})
  MERGE (p1)-[r1:follow]->(p2)
)

即。首先创建p2,然后创建MERGE关系,它将起作用。