neo4j - 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
_ 可以在某个项目中输入,这是一个查询示例。123456
456789
问题是密码使我对where
with 之后的分句set
产生了问题on match
。也许这不是正确的方法。我搜索了很多,包括这个网站,但没有找到可以帮助的东西。
解决方案
像这样的东西应该工作:
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;
我假设您传入参数 p1Name
、p2Name
和activity
,并且可以使用当前纪元时间(以毫秒为单位,由timestamp()
函数生成)作为您的会议时间。
推荐阅读
- python - 矩阵上的这些索引操作如何在 python 中工作?
- python - sendpfast scapy 发送欺骗的 udp
- javascript - 为什么我的 React 删除函数“删除”了错误的对象?
- sql-server - 如何列出打开的 sql server 连接并关闭特定的连接
- python - 如何将python代码块粘贴到HTML页面
- html - 我仅将浮动应用于容器内的一个元素,但 CSS 应用于所有元素?
- python - 如何找到矩阵python中元素的最小总和
- javascript - 如何使用charts.js在折线图中绘制单个值?
- reactjs - 如何在 ReactJS 中的“antd”表单中设置表单项的引用?
- google-cloud-platform - 如何在 asia-east1 位置对 BigQuery 表分配列级限制