我正在尝试建立一个类似于社交网络的结构。我想创建一个像这样的帖子时间表
(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);
假设用户尚未创建post,则此查询将失败。因此,我试图在一个更新查询中包括这两种情况(用户没有帖子/用户至少有一个帖子)(我想在"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 )来避免两次使用foreach循环(查询看起来有点复杂,而且我知道循环只运行1次)?
然而,这是唯一的解决办法,我可以想出后,这是如此的帖子。我在在较老的职位上上读到,没有“if-语句”这样的东西。
编辑:问题是:在一个查询中包含这两种情况是否更好,因为我知道“非post情况”只会发生一次,而且所有其他情况都是“至少一个帖子”?
干杯
发布于 2015-05-06 12:59:53
我在一些文章中看到了这种情况的解决方案。若要对所有情况使用单个查询,可以为posts列表创建一个特殊的终止节点。一个没有职位的人应该是:
(: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
指定了no标签,因此它可以匹配(:POST)或(:PostListEnd)。
运行查询后,拥有1个post的人将类似于:
(:Person)-:POSTED->(:POST)-:PREV->(:PostListEnd)
因为PostListEnd节点没有自己的信息,所以您可以为所有用户提供相同的一个节点。
发布于 2014-05-16 18:27:34
我也看不出比使用FOREACH
更好的解决方案。
但是,我认为我可以使您的查询更加高效。我的解决方案本质上将2 FOREACH
测试合并为1,因为prev_post
和rel
必须都是NULL
或非NULL
。它还结合了CREATE
和MERGE
(至少应该是一个CREATE
)。
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)
)
发布于 2017-10-18 22:28:31
在Neo4j v3.2Developer手册中,它指定了如何从本质上创建一个由多个节点属性组成的复合键在这个链接上。
CREATE CONSTRAINT ON (n:Person) ASSERT (n.firstname, n.surname) IS NODE KEY
但是,这只适用于企业版,而不是社区。
https://stackoverflow.com/questions/23696594
复制相似问题