首页 > 解决方案 > Cypher neo4j 的 ON MATCH 内的条件 SET

问题描述

neo4j / cypher 中的情况。

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

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

这是我想用密码做的事情。我已经成功了大部分,但是我做错了。此外,如果我没记错的话,没有办法在 Cypher 中比较 datetime 对象,所以我正在保存Unix time

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 

当然eat,,,。play_ 可以在某个项目中输入,这是一个查询示例。123456456789

问题是密码使我对wherewith 之后的分句set产生了问题on match。也许这不是正确的方法。我搜索了很多,包括这个网站,但没有找到可以帮助的东西。

标签: neo4jcypher

解决方案


像这样的东西应该工作:

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()函数生成)作为您的会议时间。


推荐阅读