"匹配模式1,模式2和#34;之间的语义差异并匹配"匹配pattern1其中pattern2"

时间:2015-05-24 15:37:56

标签: neo4j cypher

我有两个问题:

查询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部分中存在两个模式,这在某种程度上是一个问题。

这是对的吗?

1 个答案:

答案 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