多个MATCH子句和Cypher查询中的逗号有什么区别?

时间:2015-09-23 14:47:38

标签: neo4j cypher

在Neo4j的Cypher查询语言中,一个MATCH子句紧跟另一个后面的区别是这样的:

MATCH (d:Document{document_ID:2})
MATCH (d)--(s:Sentence)
RETURN d,s

与同一个MATCH子句中的逗号分隔模式相比? E.g:

MATCH (d:Document{document_ID:2}),(d)--(s:Sentence)
RETURN d,s

在这个简单的例子中,结果是一样的。但是有没有“陷阱”?

5 个答案:

答案 0 :(得分:19)

存在差异:逗号分隔的匹配实际上被视为同一模式的一部分。因此,例如,保证每个关系在结果路径中只出现一次。

单独的MATCH是单独的操作,其路径不构成单个模式,并且没有这些保证。

答案 1 :(得分:3)

这些 之间没有区别,只要这些条款没有相互关联

如果你这样做了:

MATCH (a:Thing), (b:Thing) RETURN a, b;

这与:

相同
MATCH (a:Thing) MATCH (b:Thing) RETURN a, b;

因为(并且只是因为)ab是独立的。如果ab通过关系链接,则查询的含义可能会发生变化。

答案 2 :(得分:1)

我认为最好在存在差异的情况下举例说明。 假设我们有“ 电影”数据库,该数据库由官方Neo4j教程提供。 在:Person :Movie 节点之间共有10个:WROTE 关系

letters = ['A', 'B', 'C', 'D']

for ix, row in frame_2():
    for letter in letters:
        if frame_1[letter].values[0] != frame_2.loc[ix, letter]:
            frame_2.drop(ix, inplace=True)
            break

1)让我们尝试使用两个MATCH子句进行下一个查询:

MATCH (:Person)-[r:WROTE]->(:Movie) RETURN count(r); // returns 10

当然,您会在结果中看到10 * 10 = 100 条记录。

2)让我们尝试使用一个MATCH子句和两种模式进行查询:

MATCH (p:Person)-[:WROTE]->(m:Movie) MATCH (p2:Person)-[:WROTE]->(m2:Movie)
RETURN p.name, m.title, p2.name, m2.title;

现在,您将看到已返回 90 条记录。 这是因为在这种情况下, p = p2 m = m2 它们之间具有相同关系之外。

例如,在第一种情况下有一条记录(两个MATCH子句)

  

p.name m.title p2.name m2.title

     

“亚伦·索金”“一些好男人”“亚伦·索金”“一些好男人”

第二种情况下没有这样的记录(一种匹配,两种模式)

答案 3 :(得分:1)

以更通用的方式,“ 相同的关系在同一结果记录中不能多次返回。 ” [请参见1.5. Cypher Result Uniqueness in the Cypher manual]

MATCH-after-MATCH和具有逗号分隔模式的单个MATCH在逻辑上都应返回笛卡尔积。除以逗号分隔的模式外,我们必须排除那些我们已经为其添加关系的记录。

在安迪的回答中,这就是为什么我们在第二种情况下排除了同一部电影的重复的原因:因为每个单个MATCH的第二个表达式都使用与第一个表达式相同的:WROTE关系。

答案 4 :(得分:0)

如果查询的一部分包含多个断开连接的模式,这将在所有这些部分之间构建笛卡尔积。这可能会产生大量数据并减慢查询处理速度。虽然偶尔有意,但通常可以通过在不同部分之间添加关系或使用OPTIONAL MATCH(标识符为:(a))来重新制定避免使用此交叉产品的查询。 简而言之,他们在这两个查询中都没有差异,但是非常谨慎地使用它。