我期待他跟随查询以这种方式创建节点(仅在退出时)和给定源节点(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})))
结果如下:
现在,如果我通过以这种方式切换节点ID再次执行此查询:
MERGE (p1:C9{userId: '2'}) WITH p1, [{userId:"1"}] AS users
FOREACH (user IN users | MERGE
((p1)-[r1:follow]->(:C9 {userId: user.userId})))
我们得到了这个:
neo4j 重复对我来说id = 1的节点。我希望它在现有节点的情况下合并。
我希望看到只有两个节点通过合并现有节点相互连接。
知道我应该修理什么吗?
谢谢, 射线。
答案 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
关系,它将起作用。