在Neo4j的Cypher查询语言中,一个MATCH子句紧跟另一个后面的区别是这样的:
MATCH (d:Document{document_ID:2})
MATCH (d)--(s:Sentence)
RETURN d,s
Run Code Online (Sandbox Code Playgroud)
与同一MATCH条款中的逗号分隔模式相比?例如:
MATCH (d:Document{document_ID:2}),(d)--(s:Sentence)
RETURN d,s
Run Code Online (Sandbox Code Playgroud)
在这个简单的例子中,结果是一样的.但是有没有"陷阱"?
Mic*_*ger 23
有区别:逗号分隔的匹配实际上被认为是同一模式的一部分.因此,例如,保证每个关系在结果路径中仅出现一次.
单独的MATCH是单独的操作,其路径不形成单个模式,并且没有这些保证.
我认为最好在有差异时提供一个例子来解释。假设我们有官方 Neo4j 教程提供的“电影”数据库。:Person和:Movie节点之间总共有 10 个:WROTE关系
MATCH (:Person)-[r:WROTE]->(:Movie) RETURN count(r); // returns 10
Run Code Online (Sandbox Code Playgroud)
1) 让我们用两个 MATCH 子句尝试下一个查询:
MATCH (p:Person)-[:WROTE]->(m:Movie) MATCH (p2:Person)-[:WROTE]->(m2:Movie)
RETURN p.name, m.title, p2.name, m2.title;
Run Code Online (Sandbox Code Playgroud)
当然你会在结果中看到 10*10 = 100条记录。
2) 让我们尝试使用一个 MATCH 子句和两种模式进行查询:
MATCH (p:Person)-[:WROTE]->(m:Movie), (p2:Person)-[:WROTE]->(m2:Movie)
RETURN p.name, m.title, p2.name, m2.title;
Run Code Online (Sandbox Code Playgroud)
现在您将看到返回了90条记录。这是因为在这种情况下,p = p2和m = m2 之间具有相同关系(:WROTE) 的记录被排除在外。
比如第一种情况下有一条记录(两个MATCH子句)
p.name m.title p2.name m2.title
《亚伦·索尔金》《几个好人》《亚伦·索尔金》《几个好人》
而在第二种情况下没有这样的记录(一个匹配,两个模式)
只要这些条款没有相互联系,它们之间就没有区别。
如果你这样做:
MATCH (a:Thing), (b:Thing) RETURN a, b;
Run Code Online (Sandbox Code Playgroud)
这与:
MATCH (a:Thing) MATCH (b:Thing) RETURN a, b;
Run Code Online (Sandbox Code Playgroud)
因为(并且仅因为)a和b是独立的。如果a和b由关系链接,则查询的含义可能会改变。
用更通用的方式来说,“同一关系不能在同一结果记录中多次返回。 ”[参见1.5。Cypher 手册中的 Cypher 结果唯一性]
MATCH-after-MATCH 和具有逗号分隔模式的单个 MATCH 在逻辑上都应返回笛卡尔积。除了逗号分隔模式外,我们必须排除那些已添加关系的记录。
在 Andy 的回答中,这就是为什么我们在第二种情况下排除同一部电影的重复:因为每个 MATCH 中的第二个表达式使用与第一个表达式相同的 :WROTE 关系。
| 归档时间: |
|
| 查看次数: |
8567 次 |
| 最近记录: |