[英]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
? 文档中有什么地方可以解释这种行为吗?
注意:这与MERGE
与CREATE
无关,尽管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.