繁体   English   中英

如何解释这个 Cypher 查询的执行路径?

[英]How to explain the execution path of this Cypher query?

想象下图:

在此处输入图片说明

这个查询:

MATCH(p:Person {id:1})
MATCH (p)-[:KNOWS]-(s)
CREATE (p)-[:LIVE_IN]->(:Place {name: 'Some Place'})

现在,为什么即使CREATE语句中不涉及s ,也会创建五个LIVE_IN , Place 文档中有什么地方可以解释这种行为吗?

注意:这与MERGECREATE无关,尽管MERGE可以解决它。

编辑:为了回应@Tomaz 的回答:我故意将MATCH (p)-[:KNOWS]-(s)放在查询中,我知道它将如何表现。 我要求找到解释。 例如,无论CREATE涉及的节点如何, CREATE是否都会针对匹配模式中的每个路径或行执行? 如果您有复杂的匹配模式,例如断开的图、树...等怎么办?

另请注意,关系KNOWS ( - vs -> ) 的方向将影响返回的行数 (9 vs 1),但无论方向如何, CREATE都会执行五次。

更新:

我添加了 3 个其他节点Office并发出以下查询:

MATCH(p:Person {id:1})
MATCH (p)-[:KNOWS]-(s)
MATCH (o:Office)
CREATE (p)-[:LOVE]->(:Place {name: 'Any Place'})

结果:已经创建了 15 个LOVE Place ,所以在我看来,cypher 在所有节点之间执行笛卡尔积

p指 1 个节点, s指 5 个节点, o指 3 个节点 => 1 * 5 * 3 = 15

但不幸的是,我无法确认这种形式的 Neo4j 文档。

这是因为 id 为 1 的 Person 有五个邻居。

在您的查询中,您从以下内容开始:

MATCH(p:Person {id:1})

这会生成一行,在其中找到您要查找的节点。 下一步是:

MATCH (p)-[:KNOWS]-(s)

此语句找到 5 个邻居,因此您的基数或行数增加到 5。 然后你为每一行运行一个 create 语句,它依次创建五个 Places。 例如,您可以在执行CREATE之前将基数降低回 1,并且您将只创建一个地方:

MATCH(p:Person {id:1})
MATCH (p)-[:KNOWS]-(s)
// aggregation reduces cardinality to 1
WITH p, collect(s) as neighbors
CREATE (p)-[:LIVE_IN]->(:Place {name: 'Some Place'})

在进行密码查询时,请始终牢记您正在操作的基数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM