我昨天刚开始用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
根据此处的文档 http://neo4j.com/docs/stable/query-merge.html如果具有指定属性的节点 circle 不存在,则应创建节点和指定的关系,否则,应对节点和关系执行更新。然而这并没有发生。我只收到一个回复 (no rows)
.见下文;
有人可以指出我可能做错了什么吗?
编辑:但我想创建 circle
, member1
和 member2
和他们的关系 无需担心节点以前是否存在,但如果它们已经存在,只需相应地更新它们
编辑:在@DaveBennet @cybersam 和@MichaelHunger 的评论和建议之后让自己更清楚
(主要目标:) 建立一种暗示 member1
的关系已邀请member2
加盟circle3
- 如果节点/关系不存在,则创建它们
- 如果节点/关系存在则更新它们
在所有情况下,任何节点或关系都不应重复
这不应该像事实证明的那样困难。我真的开始认为文档未能适当传达某些内容?
另见此处:http://neo4j.com/docs/stable/query-create-unique.html
令我困惑的是,为什么必须在match...merge
之前有一个精确的节点-匹配?/match...create unique
查询可以返回行?这不会违背查询本身的目的吗?...尤其是在创建方面?
我什至创建了一个节点如下
create (member:Member) return member
然后尝试以下查询 - 完全清楚现在,一个 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
我相信这应该搜索一个 id = 1 的成员节点...这不存在,所以它应该继续创建新的 member
节点及其属性,加上定义的关系,再加上任何其他所需的节点。
令我惊讶的是,这仍然返回(没有行)。
因此,如果有人指出我要实现既定目标,请向我清楚地解释为什么我尝试的方法行不通,以及为什么建议的解决方案行得通,我将不胜感激。
谢谢。
最佳答案
您很可能想通过邀请节点连接这两个成员。
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;
否则如果你只想记录事实:
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
关于java - Neo4j 匹配...UPSERT 的合并密码语法正在返回(无行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34658644/