在Neo4j的Cypher查询语言中,一个MATCH子句紧接着另一个MATCH子句的写法有何不同:
MATCH (d:Document{document_ID:2})
MATCH (d)--(s:Sentence)
RETURN d,s
与同一MATCH子句中的逗号分隔模式相比怎么样?例如:
MATCH (d:Document{document_ID:2}),(d)--(s:Sentence)
RETURN d,s
在这个简单的例子中,结果是相同的。但是是否存在任何“陷阱”?
有一个区别:逗号分隔的匹配实际上被视为同一模式的一部分。因此,保证每个关系在生成的路径中只出现一次。
独立的 MATCH是不同的操作,它们的路径不能形成单一的模式,并且没有这些保证。
我认为举例说明会更好一些,这样可以更清晰地展示差异。 比如我们有一个"电影"数据库,它是由Neo4j官方教程提供的。 总共有10个:WROTE关系,连接了:Person和:Movie节点。
MATCH (:Person)-[r:WROTE]->(:Movie) RETURN count(r); // returns 10
1) 让我们尝试使用两个MATCH子句来执行下一个查询:
MATCH (p:Person)-[:WROTE]->(m:Movie) MATCH (p2:Person)-[:WROTE]->(m2:Movie)
RETURN p.name, m.title, p2.name, m2.title;
当然您将在结果中看到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;
现在你会看到返回了90 条记录。 这是因为在这种情况下,当p = p2并且m = m2且它们之间的关系 (:WROTE) 相同时,这些记录将被排除。
例如,在第一种情况(两个MATCH子句)中有一条记录:
p.name m.title p2.name m2.title
"Aaron Sorkin" "A Few Good Men" "Aaron Sorkin" "A Few Good Men"
而在第二种情况(一个MATCH,两个模式)中则没有这样的记录:
MATCH (a:Thing), (b:Thing) RETURN a, b;
这与以下内容相同:
MATCH (a:Thing) MATCH (b:Thing) RETURN a, b;
因为(仅因为)a
和b
是独立的。如果a
和b
之间存在关联,那么查询的含义可能会发生改变。
MATCH p1=(v:player)-[e1]->(n)
MATCH p2=(n:team)<-[e2]-(m)
WHERE e1=e2
RETURN e1,e2,p1,p2