Neo4j删除重复数据并添加新节点-查询之间的差异

nzkunb0c  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(200)

我正在学习课程Graph Data Modeling Fundamentals
在此部分Adding Language nodes中,他们使用此查询从节点中删除langue属性,并创建一个新节点和Movies的关系

MATCH (m:Movie)
UNWIND m.languages AS language
WITH  language, collect(m) AS movies
MERGE (l:Language {name:language})
WITH l, movies
UNWIND movies AS m
WITH l,m
MERGE (m)-[:IN_LANGUAGE]->(l);
MATCH (m:Movie)
SET m.languages = null

我不明白为什么他们有collect(m) AS movies,然后又有UNWIND movies AS m。我将他们的查询修改为下面的查询,结果是相同的:

MATCH (m:Movie)
UNWIND m.languages AS language
WITH  language, m
MERGE (l:Language {name:language})
WITH l, m
MERGE (m)-[:IN_LANGUAGE]->(l);
MATCH (m:Movie)
SET m.languages = null

执行上有什么区别吗?

7jmck4yq

7jmck4yq1#

是的。当您移除以收集每种语言的影片时,您会执行Merge陈述式来建立语言节点一次以上。两部影片(例如movieA和movieB)可以有相同的语言(例如泰米尔语)。如果没有collect,您会执行MERGE(l:Language {name:'Tamil'})两次,但如果是collect movies,您只会执行一次,因为language:泰米尔语和电影:(movie 1,movie 2)仅在一行中。

With collect:
Language  collect(m) as movies 
Tamil     [MovieA, MovieB]

Without collect:
Language  m
Tamil     MovieA
Tamil     MovieB

虽然合并不会创建另一个Language节点(如果存在),这没有什么坏处,但它更注重效率,因为您执行的合并语句更少。

相关问题