neo4j Cypher:如何运行Cypher查询与多个更新

b0zn9rqh  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(174)

我想多次更新节点属性(节点)。密码查询是什么样子的?
例如,我们可以通过运行下面的cypher查询来单独更新节点属性

MATCH (a:Span {id:"A"})
SET a.name = "checkout";

MATCH (b:Span {id:"B"})
SET b.name = "login";

分开
但是有办法一起运行更新吗?我尽力了

MATCH (a:Span {id:"A"})
SET a.name = "checkout"
MATCH (b:Span {id:"B"})
SET b.name = "login";

Neo4j只是抛出“Neo。客户端错误。Statement.SyntaxError”,并且不起作用。

pvabu6sv

pvabu6sv1#

您的查询:

MATCH (a:Span {id:"A"})
SET a.name = "checkout"
MATCH (b:Span {id:"B"})
SET b.name = "login"

是不法律的的,因为像SET这样的“写”子句后面不能跟一个像MATCH这样的“读”子句,除非中间有一个WITH子句。
但是这个查询:

MATCH (a:Span {id:"A"})
SET a.name = "checkout"
WITH 0 AS ignored
MATCH (b:Span {id:"B"})
SET b.name = "login";

如果可以有多个“A”节点,则是无效的。例如,如果有50个“A”节点,则每个“B”节点将设置其name 50次。
为了避免多次为同一属性分配相同的值,可以使用聚合将N个“A”行减少到仅1行,然后再匹配“B”:

MATCH (a:Span {id:"A"})
SET a.name = "checkout"
WITH COUNT(*) AS ignored
MATCH (b:Span {id:"B"})
SET b.name = "login";

或者可以使用单元子查询,它“”不会更改封闭查询的行数。“例如,你可以这样做:

CALL {
  MATCH (a:Span {id:"A"})
  SET a.name = "checkout"
}
MATCH (a:Span {id:"B"})
SET a.name = "login";

相关问题