知识库

重置查询基数

在查询执行时,它们会累积结果行。Cypher 对每行执行操作。当查询由完全独立的部分组成,彼此之间没有关系,并且您不想将单个查询拆分为多个查询时,有时需要一种方法将基数重置回 1 以避免多次执行操作。

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

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

CREATE (:Movie{title:'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'})