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))