Conditional SET inside ON MATCH of Cypher neo4j



Situation in neo4j/cypher.

我有两个节点代表一个人(标签(,节点之间的关系是友谊(标签(。友谊包含他们第一次见面,最后一次 相遇,以及他们一起做过的事情。

如果节点不存在,我想添加节点,如果关系也不存在,也将其添加到数据库中。

  • 如果友谊不存在,我会创建它并添加他们一起做的活动以及他们第一次见面时的活动。
  • 如果
  • 友谊已经存在,我会将活动添加到数组中(如果它不存在((我不希望重复活动(。还要更新他们上次见面的时间。

这是我想在密码中做的事情。我已经成功了大部分,但是我做错了什么。此外,如果我没记错的话,没有办法比较Cypher中的日期时间对象,所以我节省了Unix时间。

merge (p:Person {name:”Thomas”}) merge (p2:Person {name:”George”}) merge (p)-[r:FRIEND {}]-(p2)

在这里,我创造了不存在的东西。如果友谊存在与否怎么办?

on create set r.activities = [“eat”], r.firstMeet = 123456, r.lastMeet = 123456

on match set r.activities = r.activities + “play” where not “play” in r.activities, r.lastMeet = 456789 where r.lastMeet < 456789 

当然,playeat123456456789可以输入到某个项目中,这是一个查询示例。

问题是密码让我在与on matchset后对where克劳索有问题。也许这不是正确的方式。我搜索了很多,包括这个网站,但没有找到可以提供帮助的东西。

这样的事情应该可以工作:

WITH timestamp() AS datetime
MERGE (p:Person {name: $p1Name})
MERGE (p2:Person {name: $p2Name})
MERGE (p)-[r:FRIEND]-(p2)
ON CREATE SET r.activities = ['eat'], r.firstMeet = datetime, r.lastMeet = datetime
ON MATCH SET
r.activities = CASE WHEN $activity in r.activities
THEN r.activities
ELSE r.activities + $activity END,
r.lastMeet = datetime;

我假设您传入参数p1Namep2Nameactivity,并且可以使用当前纪元时间(以毫秒为单位,由timestamp()函数生成(作为您的会议时间。

最新更新