首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Cypher查询-可选的创建

Cypher查询-可选的创建
EN

Stack Overflow用户
提问于 2014-05-16 13:38:15
回答 4查看 1.2K关注 0票数 3

我正在尝试建立一个类似于社交网络的结构。我想创建一个像这样的帖子时间表

(user:Person)-:POSTED->(p1:POST)-:PREV->p2:POST...

我的问题如下。假设用户的帖子已经存在,我可以通过执行以下密码查询来创建一个新的帖子

代码语言:javascript
运行
复制
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);

假设用户尚未创建post,则此查询将失败。因此,我试图在一个更新查询中包括这两种情况(用户没有帖子/用户至少有一个帖子)(我想在"post时间线“中插入一个新的帖子)。

代码语言:javascript
运行
复制
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 )来避免两次使用foreach循环(查询看起来有点复杂,而且我知道循环只运行1次)?

然而,这是唯一的解决办法,我可以想出后,这是如此的帖子。我在在较老的职位上上读到,没有“if-语句”这样的东西。

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

干杯

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-05-06 12:59:53

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

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

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

代码语言:javascript
运行
复制
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指定了no标签,因此它可以匹配(:POST)或(:PostListEnd)。

运行查询后,拥有1个post的人将类似于:

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

因为PostListEnd节点没有自己的信息,所以您可以为所有用户提供相同的一个节点。

票数 2
EN

Stack Overflow用户

发布于 2014-05-16 18:27:34

我也看不出比使用FOREACH更好的解决方案。

但是,我认为我可以使您的查询更加高效。我的解决方案本质上将2 FOREACH测试合并为1,因为prev_postrel必须都是NULL或非NULL。它还结合了CREATEMERGE (至少应该是一个CREATE )。

代码语言:javascript
运行
复制
MATCH (user:Person {id:"#id"})
OPTIONAL MATCH (user)-[rel:POSTED]->(prev_post:POST)
CREATE (user)-[:POSTED]->(post:POST {post:"#post2", created:timestamp()})
FOREACH (o IN CASE WHEN prev_post IS NOT NULL THEN [prev_post] ELSE [] END |
  DELETE rel
  CREATE (post)-[:PREV]->(o)
)
票数 2
EN

Stack Overflow用户

发布于 2017-10-18 22:28:31

在Neo4j v3.2Developer手册中,它指定了如何从本质上创建一个由多个节点属性组成的复合键在这个链接上

代码语言:javascript
运行
复制
CREATE CONSTRAINT ON (n:Person) ASSERT (n.firstname, n.surname) IS NODE KEY

但是,这只适用于企业版,而不是社区。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23696594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档