知识库

重置查询基数(cardinality)

当查询执行时,它们会累积结果行。Cypher 对每一行执行操作。当一个查询由完全独立、相互无关的部分组成且你不想将单个查询拆分为多个查询时,有时需要一种方式将基数重置为 1,以避免对同一操作执行多次。

例如,使用 Movies 图,我们编写一个查询为演员添加标签,然后创建一个新的 :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'})
© . This site is unofficial and not affiliated with Neo4j, Inc.