在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
在这个简单的例子中,结果是一样的。但是有没有“陷阱”?
答案 0 :(得分:19)
存在差异:逗号分隔的匹配实际上被视为同一模式的一部分。因此,例如,保证每个关系在结果路径中只出现一次。
单独的MATCH是单独的操作,其路径不构成单个模式,并且没有这些保证。
答案 1 :(得分:3)
这些 之间没有区别,只要这些条款没有相互关联 。
如果你这样做了:
MATCH (a:Thing), (b:Thing) RETURN a, b;
这与:
相同MATCH (a:Thing) MATCH (b:Thing) RETURN a, b;
因为(并且只是因为)a
和b
是独立的。如果a
和b
通过关系链接,则查询的含义可能会发生变化。
答案 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))来重新制定避免使用此交叉产品的查询。 简而言之,他们在这两个查询中都没有差异,但是非常谨慎地使用它。