知识库

重置查询基数

随着查询的执行,它们会构建结果行。Cypher 按行执行操作。当一个查询由完全独立、互不相关的部分组成,并且您不想将单个查询拆分为多个查询时,有时需要一种方法将基数重置回 1,以避免多次执行某个操作。

例如,使用电影图谱,让我们编写一个查询来标记演员,然后创建一个新的 :Movie 节点。

MATCH (p:Person)
WHERE (p)-[:ACTED_IN]->(:Movie)
SET p:Actor

CREATE (:Movie{title:'The Animatrix'})

当在单个查询中运行时,您会看到创建了多个“The Animatrix”节点,而不仅仅是一个。这是因为 CREATE 子句按行执行,在 CREATE 执行之前,我们为每个 :Actor 都有一行。

尽管您可以通过使用 MERGE 而不是 CREATE 来避免额外的节点创建,但您仍然需要为每行执行多个冗余的 MERGE 操作付出代价,这些数据库命中是完全不必要的。

若要在查询的下一部分之前将基数重置回 1,您需要对某个任意值使用 WITH DISTINCT

MATCH (p:Person)
WHERE (p)-[:ACTED_IN]->(:Movie)
SET p:Actor

WITH DISTINCT 1 AS ignored
CREATE (:Movie{title:'The Animatrix'})
© . All rights reserved.