我有两个问题:
查询A
match
(r:report)-[:NEXTUPDATE*]->(u1:severity {what:'normal'})-[:NEXTUPDATE*]->(u2:severity {what: 'critical'}),
(r)-[:NEXTUPDATE*]->(:resolution)
return r, u1, u2
查询B
match
(r:report)-[:NEXTUPDATE*]->(u1:severity {what:'normal'})-[:NEXTUPDATE*]->(u2:severity {what: 'critical'})
where (r)-[:NEXTUPDATE*]->(:resolution)
return r, u1, u2
这些查询之间的唯一区别是,查询B使用了'其中'而不是用逗号来分隔这两种模式。
我曾假设他们会产生相同的结果,但他们不会。 查询A返回0行;查询B返回1212结果的预期结果。
This question并且它的回答让我相信,无论模式是在查询的match
还是where
部分,都没有区别。
显然,我一定是误解了一些事情,或者创造了一个角落案例。我对解释的最好尝试是两个模式在我的模型中采用相同的路径,如果match
部分中存在两个模式,这在某种程度上是一个问题。
这是对的吗?
答案 0 :(得分:2)
您的两个问题非常不同。您的第一个查询同时匹配两个内容,并且没有任何限制。你的第二个查询匹配一件事,然后用where条件过滤结果。
在您的第一个查询中,您要生成一个笛卡尔积,要求它匹配所有具有正常严重性的报告,然后是可变长度路径中的严重严重性。
(r:report)-[:NEXTUPDATE*]->(u1:severity {what:'normal'})-[:NEXTUPDATE*]->(u2:severity {what: 'critical'})
以及与分辨率为
的所有报告匹配的每一个 (r)-[:NEXTUPDATE*]->(:resolution)
因此,您将返回与第一部分匹配的行数乘以与第二部分匹配的行数。
在您的第二个查询中,您要求提供相同的报告,但也要求它具有解决方案的限制。
如果你想让第一个像第二个一样工作,你可以做这样的事情......
match (r:report)-[:NEXTUPDATE*]->(u1:severity {what:'normal'})-[:NEXTUPDATE*]->(u2:severity {what: 'critical'})
with r, u1, u2
match r-[:NEXTUPDATE*]->(:resolution)
return r, u1, u2