【发布时间】:2017-10-19 06:28:31
【问题描述】:
我正在尝试创建一个类似社交网络的结构。 我想创建一个看起来像这样的帖子时间线
(user:Person)-[:POSTED]->(p1:POST)-[:PREV]->[p2:POST]...
我的问题如下。 假设用户的帖子已经存在,我可以通过执行以下密码查询来创建新帖子
MATCH (user:Person {id:#id})-[rel:POSTED]->(prev_post:POST)
DELETE rel
CREATE (user)-[:POSTED]->(post:POST {post:"#post", created:timestamp()}),
(post)-[:PREV]->(prev_post);
假设用户尚未创建帖子,则此查询失败。所以我试图以某种方式在一个更新查询中包含这两种情况(用户没有帖子/用户至少有一个帖子)(我想在“帖子时间线”中插入一个新帖子)
MATCH (user:Person {id:"#id"})
OPTIONAL MATCH (user)-[rel:POSTED]->(prev_post:POST)
CREATE (post:POST {post:"#post2", created:timestamp()})
FOREACH (o IN CASE WHEN rel IS NOT NULL THEN [rel] ELSE [] END |
DELETE rel
)
FOREACH (o IN CASE WHEN prev_post IS NOT NULL THEN [prev_post] ELSE [] END |
CREATE (post)-[:PREV]->(o)
)
MERGE (user)-[:POSTED]->(post)
是否有任何类型的 if 语句(或某种类型的 CREATE IF NOT NULL)来避免使用 foreach 循环两次(查询看起来有点复杂,我知道循环只会运行 1 次)? .
但是,这是我在研究this SO post 后能想到的唯一解决方案。我读到 in an older post 没有 if 语句这样的东西。
编辑:问题是:将这两种情况都包含在一个查询中是否更好,因为我知道“无帖子案例”只会发生一次,而所有其他案例都是“至少一个帖子”?
干杯
【问题讨论】: