Neo4j Cypher查询链接列表以有条件地创建最新的\u回复,而不是将最新的\u回复修改为下一个\u回复

Neo4j Cypher查询链接列表以有条件地创建最新的\u回复,而不是将最新的\u回复修改为下一个\u回复,neo4j,cypher,Neo4j,Cypher,我有一个链接列表,上面是一篇帖子的回复,如下所示: 列表中的“第一个”回复具有要发布的最新回复关系,后续回复具有下一个回复关系。用于获取上述图形的查询: MATCH (p:Post {id: $postId})-[:NEWEST_REPLY|NEXT_REPLY*]->(r:Reply) return p, r 我想创建一个密码查询 创建回复,并在没有回复或 创建回复,删除当前最新的回复关系,创建上一个最新回复的下一个回复关系,以及新回复的最新回复关系 本声明: MATCH (p:P

我有一个链接列表,上面是一篇帖子的回复,如下所示:

列表中的“第一个”回复具有要发布的最新回复关系,后续回复具有下一个回复关系。用于获取上述图形的查询:

MATCH (p:Post {id: $postId})-[:NEWEST_REPLY|NEXT_REPLY*]->(r:Reply) 
return p, r
我想创建一个密码查询

  • 创建回复,并在没有回复或
  • 创建回复,删除当前最新的回复关系,创建上一个最新回复的下一个回复关系,以及新回复的最新回复关系
  • 本声明:

    MATCH (p:Post {id: $postId})-[rel:NEWEST_REPLY]->(previousNewestReply:Reply)
    DELETE rel
    CREATE (r:Reply { id: apoc.create.uuid(), body: $body, createdAt: datetime(), updatedAt: datetime() })
    WITH r, p, previousNewestReply
    MATCH (u:User)
    WHERE u.id = $userId 
    CREATE (r)<-[:WROTE]-(u)
    CREATE (r)<-[:NEWEST_REPLY]-(p)
    CREATE (r)-[:NEXT_REPLY]->(previousNewestReply)
    RETURN u, p
    
    并遇到以下语法错误:

    Invalid input 'r': expected whitespace, comment, '{', node labels, MapLiteral, a parameter, a parameter (old syntax), a relationship pattern, '(', '.', '[', '^', '*', '/', '%', '+', '-', "=~", IN, STARTS, ENDS, CONTAINS, IS, '=', '~', "<>", "!=", '<', '>', "<=", ">=", AND, XOR, OR, WHEN, ELSE or END (line 4, column 24 (offset: 145))
    "WHEN true  THEN DELETE rel CREATE (r:Reply { id: apoc.create.uuid(), body: "new with CASE1", createdAt: datetime(), updatedAt: datetime() }) WITH r, p, replies MATCH (u:User) WHERE u.id = "e14d409e-d970-4c5c-9cc7-3b224c774835" CREATE (r)<-[:WROTE]-(u) CREATE (r)<-[:NEWEST_REPLY]-(p) CREATE (r)-[:NEXT_REPLY]->(replies)"
    
    无效输入“r”:应为空白、注释“{”、节点标签、MapLiteral、参数、参数(旧语法)、关系模式“(”、“[”、“^”、“*”、“/”、“%”、“+”、“-”、“=”、IN、Start、ENDS、CONTAINS、IS、“=”、“!=”、“、“、”、“=”、XOR、或、WHEN、ELSE或END(第4行,第24列(偏移量:145))
    
    如果为true,则删除rel CREATE(r:Reply{id:apoc.CREATE.uuid(),body:“new with CASE1”,createdAt:datetime(),updatedAt:datetime()),其中r,p,Reply匹配(u:User),其中u.id=“e14d409e-d970-4c5c-9cc7-3b224c774835”CREATE(r)您可以这样做来删除任何现有的
    [:最新的回复]
    rels:

    MATCH (p:Post {id: $postId})
    OPTIONAL MATCH (p)-[rel:NEWEST_REPLY]->(previousNewestReply:Reply)
    WITH p,previousNewestReply,
    // create a collection of size 1 or 0
         CASE WHEN NOT rel IS NULL THEN [rel] ELSE [] END AS toBeDeleted
    
    // loop through the collection
    FOREACH( tbd IN toBeDeleted | DELETE tbd )
    
    
    WITH p,previousNewestReply
    .....
    
    [更新]

    此查询适用于您:

    MATCH (p:Post), (u:User)
    WHERE p.id = $postId AND u.id = $userId
    OPTIONAL MATCH (p)-[rel:NEWEST_REPLY]->(prevNewest:Reply)
    CREATE (u)-[:WROTE]->(r:Reply {id: apoc.create.uuid(), body: "foo", createdAt: datetime(), updatedAt: datetime()})<-[:NEWEST_REPLY]-(p)
    FOREACH(_ IN CASE WHEN rel IS NOT NULL THEN [1] END | DELETE rel CREATE (r)-[:NEXT_REPLY]->(prevNewest))
    
    匹配(p:Post),(u:User)
    其中p.id=$postId和u.id=$userId
    可选匹配(p)-[rel:latest\u REPLY]->(prevlatest:REPLY)
    CREATE(u)-[:writed]->(r:Reply{id:apoc.CREATE.uuid(),body:“foo”,createdAt:datetime(),updatedAt:datetime()})(preventest))
    

    我假设
    postId
    userId
    被传递为。此外,您应该在
    :Post(di)
    :User(id)上创建
    加快查询速度。

    谢谢,这很有帮助,但我的想法是,应该总是只有一个最新的回复。对我来说,更大的问题是做一个关于rel是否存在的案例。我用我的进度更新了原来的问题,目前我的案例主要停留在语法错误上。我想我想做的是对于一个案例来说太复杂了。当回复已经存在时,这种方法非常有效,但当没有prevNewest时仍然会失败:“未能创建关系`UNNAMED364
    ,缺少节点
    prevNewest`。如果您更愿意忽略缺少关系节点的行,请在neo4j.conf中设置'cypher.lenient\u create\u relationship=true'“在这一点上,这就是诀窍:匹配(p:Post),(u:User),其中p.id=$postId和u.id=$userId可选匹配(p)-[rel:latest_REPLY]>(prevlatest:REPLY)CREATE(u)-[:writed]>(r:REPLY{id:apoc.CREATE.uuid(),body:“foo”,createdAt:datetime(),updatedAt:datetime())(prevlatest))
    MATCH (p:Post), (u:User)
    WHERE p.id = $postId AND u.id = $userId
    OPTIONAL MATCH (p)-[rel:NEWEST_REPLY]->(prevNewest:Reply)
    CREATE (u)-[:WROTE]->(r:Reply {id: apoc.create.uuid(), body: "foo", createdAt: datetime(), updatedAt: datetime()})<-[:NEWEST_REPLY]-(p)
    FOREACH(_ IN CASE WHEN rel IS NOT NULL THEN [1] END | DELETE rel CREATE (r)-[:NEXT_REPLY]->(prevNewest))