gpt4 book ai didi

neo4j - 密码查询 - 可选创建

转载 作者:行者123 更新时间:2023-12-01 10:47:56 25 4
gpt4 key购买 nike

我正在尝试创建一个类似社交网络的结构。我想创建一个帖子时间轴,看起来像这样

(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 语句这样的东西。

编辑:问题是:将这两种情况都包含在一个查询中是否更好,因为我知道“无帖子案例”只会出现一次,而所有其他情况都是“至少一个帖子”?

干杯

最佳答案

我在一些文章中看到了这种情况的解决方案。要对所有情况使用单个查询,您可以为帖子列表创建一个特殊的终止节点。一个没有帖子的人会是这样的:

(:Person)-[:POSTED]->(:PostListEnd)

现在在所有情况下您都可以运行查询:

MATCH (user:Person {id:#id})-[rel:POSTED]->(prev_post)
DELETE rel
CREATE (user)-[:POSTED]->(post:POST {post:"#post", created:timestamp()}),
(post)-[:PREV]->(prev_post);

请注意,没有为 prev_post 指定标签,因此它可以匹配 (:POST) 或 (:PostListEnd)。

运行查询后,拥有 1 个帖子的人将如下所示:

(:Person)-[:POSTED]->(:POST)-[:PREV]->(:PostListEnd)

由于 PostListEnd 节点没有自己的信息,您可以为所有用户使用同一个节点。

关于neo4j - 密码查询 - 可选创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23696594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com