Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 密码查询-可选创建_Neo4j_Cypher - Fatal编程技术网

Neo4j 密码查询-可选创建

Neo4j 密码查询-可选创建,neo4j,cypher,Neo4j,Cypher,我正在尝试创建一个类似社交网络的结构。 我想创建一个帖子的时间线,如下所示 (用户:个人)-[:发布]->(p1:POST)-[:上一篇]->[p2:POST] 我的问题如下。 假设一个用户的帖子已经存在,我可以通过执行以下cypher查询来创建一个新帖子 MATCH (user:Person {id:#id})-[rel:POSTED]->(prev_post:POST) DELETE rel CREATE (user)-[:POSTED]->(post:POST {post:"#

我正在尝试创建一个类似社交网络的结构。 我想创建一个帖子的时间线,如下所示

(用户:个人)-[:发布]->(p1:POST)-[:上一篇]->[p2:POST]

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

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);
假设用户尚未创建帖子,此查询将失败。所以我尝试在一个更新查询中包含这两种情况(用户没有帖子/用户至少有一篇帖子)(我想在“帖子时间线”中插入一篇新帖子)

是否有任何类型的if语句(或某种类型的CREATE if NOT NULL)可以避免两次使用foreach循环(查询看起来有点复杂,我知道循环只运行一次)

然而,这是我学习后能想出的唯一解决办法。我读到没有if语句这样的东西

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

干杯

我认为,“案例”与“如果”的说法非常接近

考虑到您的范围可能有限,FOREACH可能还不错。但我认为将查询一分为二并没有什么特别的缺点,特别是为了保持其可读性,并且考虑到操作相当小


只有我的两分钱。

我也没有看到比使用
FOREACH
更好的解决方案

不过,我想我可以让您的查询更有效率。我的解决方案基本上将2个
FOREACH
测试合并为1个,因为
prev\u post
rel
必须同时为
NULL
或同时为非
NULL
。它还结合了
CREATE
MERGE
(无论如何,这应该是
CREATE


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

(: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\u post
指定标签,因此它可以匹配(:post)或(:PostListEnd)

运行查询后,拥有1个职位的人员将如下所示:

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


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

在Neo4j v3.2开发者手册中,它指定了如何创建基本上由多个节点属性组成的复合键:

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

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)
)
MATCH (user:Person {id:#id})-[rel:POSTED]->(prev_post)
DELETE rel
CREATE (user)-[:POSTED]->(post:POST {post:"#post", created:timestamp()}),
       (post)-[:PREV]->(prev_post);
CREATE CONSTRAINT ON (n:Person) ASSERT (n.firstname, n.surname) IS NODE KEY