Neo4j 匹配... UPSERT 的合并密码语法正在返回(无行)

tec*_*rat 5 java neo4j graph-databases

我昨天刚开始使用 Neo4j 学习 GraphDB,现在,我想执行如下所示的 UPSERT 操作;

match (circle:Circle {id:3, cycleId:5})
merge (member1:Member {id:1}) -[invited:INVITED_TO_JOIN {c:circle, time:timestamp()}]-> (member2:Member {id:2})
return member1, member2, invited, circle
Run Code Online (Sandbox Code Playgroud)

根据此处的文档http://neo4j.com/docs/stable/query-merge.html,如果具有指定属性的节点不存在,则应创建节点和指定的关系,否则应进行更新对节点和关系执行。然而这并没有发生。我只收到这样的回复(no rows):见下文;

在此输入图像描述

有人可以指出我可能做得不正确吗?

编辑: 但我想动态 创建circle,member1它们的关系member2,而不用担心节点以前是否存在,但如果它们已经存在,只需相应地更新它们


编辑:在 @DaveBennet @cybersam 和 @MichaelHunger 的评论和建议后让自己更清楚

主要目标:)建立一种暗示member1邀请member2加入的关系circle3

  1. 如果节点/关系不存在,则创建它们
  2. 如果节点/关系存在则更新它们

在所有情况下,任何节点或关系都不应该重复

这应该不会像现在这样困难。我真的开始认为文档未能正确传达某些内容?

另请参阅此处:http ://neo4j.com/docs/stable/query-create-unique.html

让我困惑的是,为什么在/查询返回行之前必须有一个精确的节点匹配?这不会违背查询本身的目的吗?...尤其是在创建方面?match...mergematch...create unique

我什至创建了一个节点,如下所示

create (member:Member) return member
Run Code Online (Sandbox Code Playgroud)

然后尝试以下查询 - 完全清楚,到目前为止,member节点已经存在,但没有任何属性(例如,id如下所示)

match (member:Member {id:1})
create unique (member) -[memberOf:IS_MEMBER_OF {time:timestamp()}]-> (circle:Circle {id:3, cycleId:5, creator:member.id}) 
return member, circle, memberOf
Run Code Online (Sandbox Code Playgroud)

我相信这应该搜索 id = 1 的成员节点...这不会存在,所以它应该继续创建member具有其属性的新节点,加上定义的关系,加上任何其他所需的节点( s)。

令我惊讶的是,这仍然返回(没有行)。

因此,如果有人指出我实现既定目标,并向我清楚地解释为什么我所尝试的方法不起作用以及为什么提议的解决方案有效,我将不胜感激。

谢谢。

Mic*_*ger 2

您很可能希望通过邀请节点连接这两个成员。

match (circle:Circle {id:3, cycleId:5})
match (member1:Member {id:1})
match (member2:Member {id:2})
create (invite:Invite {time:timestamp()})-[:TO_CIRCLE]->(circle)
create (invite)-[:INVITED_BY]->(member1)
create (invite)-[:INVITED]->(member2)
return member1, member2, invite, circle;
Run Code Online (Sandbox Code Playgroud)

否则,如果你只是想记录事实:

match (circle:Circle {id:3, cycleId:5})
match (member1:Member {id:1})
match (member2:Member {id:2})
merge (member1)-[r:MEMBER]->(circle)
on create set r.since = timestamp(), r.by = member2.id
Run Code Online (Sandbox Code Playgroud)