![精通Neo4j](https://wfqqreader-1252317822.image.myqcloud.com/cover/113/47216113/b_47216113.jpg)
3.3.8 MERGE语句
MERGE语句可以确保图数据库中存在某个特定的模式。如果该模式不存在,则创建它。
3.3.8.1 简介
MERGE或者匹配已存在的节点并绑定到它,或者创建新的节点然后绑定到它。它有点像MATCH和CREATE的组合。通过这种方式可以确保你指定的某个数据存在数据库中。例如,可以指定图中必须包含一个特定name的user节点。如果不存在特定name的user节点,那么就会创建一个。
当在整个模式上使用MERGE时,要么是整个模式匹配到,要么是整个模式被创建。MERGE不能部分地应用于模式,如果希望部分匹配,可以将模式拆分为多个MERGE语句。
MERGE图例如图3-11所示。
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P167_90523.jpg?sign=1738881750-iAjO0554wzylcCYzTvOmZnv8x7po5WTG-0-edae7809a52ddc1bfcc55a9c6af344c0)
图3-11 MERGE图例
3.3.8.2 MERGE节点
1.合并带标签的节点
下面的例子合并给定标签的节点。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P167_102680.jpg?sign=1738881750-UsSHI4rlWX3Bz58Tjoh8K9p4A3lwl5rG-0-d901a9a3ecb7fa97abc960b0b90ac8e4)
因为没有包含Critic标签的节点,所以在数据库创建了新节点。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P167_101750.jpg?sign=1738881750-mO6VcNcbtkaRQUtxCJBbiTHCUOqubhdx-0-2f04730df52f9c75dfe8fef2496bcbef)
2.合并带多个属性的单个节点
合并有多个属性但并不是所有属性都匹配到已存在节点的单个节点。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P167_102681.jpg?sign=1738881750-RPSoRyBjg4nciMFdBwZ8mZKLA7MYmehy-0-a79454870f8b2aae6a25f536961a5aa1)
在数据库创建了名为Charlie Sheen的新节点,因为没有匹配到所有属性都吻合的节点。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P167_101753.jpg?sign=1738881750-fHqIIJqdZTiYZNHjPCUqITaprx4tr0tW-0-9c3d4d1e221ca34bc0015ff4d5a289b5)
3.合并同时指定标签和属性的节点
合并单个节点,要求它的标签和属性都能匹配到已存在的节点。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P168_102682.jpg?sign=1738881750-BjygUnY6XD4ae2MCHNYN9SgzlUE59Cnc-0-f3ebae8ab16e2ca6e28af8d602264cfa)
匹配到Michael Douglas节点,同时返回它的name和bornIn属性。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P168_101756.jpg?sign=1738881750-EwfabCH918H5AxLbA2wplfFWzxBU4fTl-0-3ec50b4be4171d5e8190aaebe124c90d)
4.合并属性来自已存在节点的单个节点
当每个绑定节点的属性p来自一个节点集时,如果p存在重复,创建的时候只会创建一次。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P168_102683.jpg?sign=1738881750-ecrhrTSsEJLodLVRQAzCw0Dz5DRdKTLD-0-57ac39a9892da0ac211f687ac64e0de4)
本例中创建了三个City节点,它们的name属性分别为New York、Ohio和New Jersey。
注意:尽管MATCH匹配的结果总有三个节点的bornIn属性值都为New York,但只创建了一个New York节点。因为第一次匹配的时候,New York未匹配到,因此创建了一个。然后,新创建的New York被第二个和第三个匹配到了。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P168_101758.jpg?sign=1738881750-UF3iuJArg2kZyjJxSQDsBjqRK0wxOlKO-0-bb3419e7eb9fa4f3d05426e4d8d61c90)
3.3.8.3 MERGE在CREATE和MATCH中的使用
1.MERGE与CREATE搭配
检查节点是否存在,如果不存在,则创建它并设置属性。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P169_102685.jpg?sign=1738881750-CZoOJAuc0oLnpwmnHE29ALOAUteFg78h-0-7052aba931bf1821108625bb31b42447)
本查询创建了keanu节点,并将created属性设置为创建时的时间戳。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P169_101761.jpg?sign=1738881750-9Z4ni1w1REiy2PLOS7ZkC6YKdiyDZ9On-0-ffecb454fe8e04419492d277cb26aa94)
2.MERGE与MATCH搭配
匹配节点,并在找到的节点上设置属性。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P169_102686.jpg?sign=1738881750-qZQms4xPgrVJzeqtEWslj0OPXuzEW54H-0-47f361f0ec42dc73d663e870be88054c)
本查询找到所有的Person节点,并设置found属性为true,然后返回它们。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P169_101764.jpg?sign=1738881750-t3bO7R3ffLneTXWWfuctdB7lP4xWCY6u-0-72bdf8d3069ed590042762e442e8e271)
3.MERGE与CREATE和MATCH同时使用
检查节点是否存在,如果不存在,则创建它并设置属性。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P169_102687.jpg?sign=1738881750-pfuqFLNuMPd3j3OSPkeC3O0Qvdv0q1RU-0-74973fb7f93ad34d12cb0ab3b13d125c)
本查询创建keanu节点并设置created属性值为创建时的时间戳。如果keanu已经存在,将为它设置一个新属性lastSeen。也就是说,当keanu不存在时,创建后的keanu节点将没有lastSeen属性。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P170_101767.jpg?sign=1738881750-M7KRLindWdWlGmIZpXymWJQikp6HNwRt-0-a51a170beaa496dbff39ce2e376f2054)
4.利用MERGE和MATCH设置多属性
如果需要设置多个属性,将它们简单地以逗号分开即可。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P170_102689.jpg?sign=1738881750-ckkmC5grOMpo2MJQYaVf1UNKMrkNh8dL-0-552d89ef41ec06664ff0e38339e13be2)
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P170_101770.jpg?sign=1738881750-OENk7sbFsGVRsTv8esLZsJonstsGqp3v-0-e08762062ae7dff47a6fab86b61061b1)
3.3.8.4 MERGE关系
MERGE可用于匹配或者创建关系。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P170_102690.jpg?sign=1738881750-OxuDQMGzgMoHMRKTod2HqfNSkGpXI656-0-ecd2f1666c70e6284bc8aad13a325662)
因为Charlie Sheen参演了Wall Street,所以找到已存的关系并返回。
注意:使用MERGE去匹配或者创建关系时,必须至少指定一个绑定的节点。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P171_101772.jpg?sign=1738881750-Iq2DM6BZgQi9N9BxqVr46IEyq4QVZYXi-0-1dfdbf48eda9a7087036f28fbf09e4a5)
1.合并多个关系
当MERGE应用于整个模式时,要么全部匹配上,要么全部新创建。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P171_102691.jpg?sign=1738881750-oMNdW5WdM6aw5mlLu7M4jFmwTjzB5dAT-0-b8d7eccdea32a305535c5a9cffaea90f)
在本例中,Oliver Stone和Rob Reiner未一起工作过。当试图在其之间合并一个电影连接时,Neo4j不会使用任何已存在的电影,而是创建一个新的movie节点。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P171_101775.jpg?sign=1738881750-28wdzYktdM5OUXrX1OZWPRpHRgeQkLkD-0-4590b64e1c0a73b03e0adf6a8dca9978)
2.合并无方向关系
MERGE也可以用于合并无方向的关系。当创建关系时,它将选择一个任意的方向。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P171_102692.jpg?sign=1738881750-4Jjr2M53yADXdWRSefkAit2G0LLvaGbX-0-60d3251802383c9a74712ebd087c6c42)
因为Charlie Sheen和Oliver Stone相互不认识,所以MERGE查询将在他们之间创建一个KNOWS关系。创建的关系的方向是任意的。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P171_101778.jpg?sign=1738881750-W44XHdItvW6yVUlSimt9dtbHehyulS36-0-3ae4d35b82b009fdd4c49d8dcf46a97d)
3.合并已存在两节点之间的关系
MERGE可用于连接前面的MATCH和MERGE语句,在两个绑定的节点m和n上创建一个关系。m节点是MATCH语句返回的,而n节点是前面的MERGE语句创建或者匹配到的。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P172_102693.jpg?sign=1738881750-b64JUrfBI8P6JBDkVSTbxbCdwRcarmht-0-f60ffd072b605d18d69af21c93f5260d)
这个例子来自3.3.8节。第二个MERGE在每个人和他的bornIn属性对应的城市之间创建了一个BORN_IN关系。Charlie Sheen、Rob Reiner和Oliver Stone与同一个城市节点(New York)都有一个BORIN_IN关系。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P172_101781.jpg?sign=1738881750-TkcYplnhQbjeIzCKB9AFzyluvfRZqbQG-0-8910436a1fd328d4481ad3458ec44bac)
4.合并一个已存在节点和一个合并的节点之间的关系
MERGE能够同时创建一个新节点n和一个已存在节点m与n之间的关系。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P172_102694.jpg?sign=1738881750-p7ENNDi6HwX6auV7LFcxP7808XUTKb1M-0-691552ad310c6296a5acf9a626a09fb4)
在本例中,MERGE未匹配到,这里没有标签为Chauffeur的节点和HAS_CHAUFFUR关系。MERGE创建了5个带有Chauffeur标签的节点,每个节点的包含一个name属性,属性的值来自每个匹配到的Person节点的chauffeurName属性的值。MERGE同时还在每个Person节点与新创建的Chauffeur节点之间创建了一个HAS_CHAUFFEUR关系。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P172_101784.jpg?sign=1738881750-Utc8ZngJFFDBTuzbL7Dn7M4btOmHcmIu-0-a76492a20a6f92511b98aa13f48264b7)
3.3.8.5 用MERGE的唯一性约束
当使用的模式涉及唯一性约束时,Cypher可以通过MERGE来防止获取相冲突的结果。在这种情况下,至多有一个节点匹配该模式。例如,给定两个唯一性约束:Person(id)和:Person(ssn),如果存在两个不同的节点分别是id为12和ssn为437或者只有一个节点有其中一个属性,那么MERGE (n:Person {id: 12, ssn: 437})这样的查询将失败。
下面的例子分别在Person的name和role属性上创建一个唯一性约束。
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P173_102695.jpg?sign=1738881750-rLNTzK48jn6t8AztqIMIVrdCM1pEim5w-0-1b3c7c0be4e4bec0b1d46e48180103e9)
如果节点未找到,则使用唯一性约束创建该节点。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P173_102696.jpg?sign=1738881750-ypdJGvHBso077vz59a3p1eX8CjsLNW8k-0-5e93488676ef24a57cc8d638ded7968d)
本查询创建了laurence节点。如果laurence已经存在,MERGE则仅匹配已经存在的节点。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P173_102698.jpg?sign=1738881750-H4vCImJ9sE7XuY8kteCJDAnOnPPk9OkE-0-0ac591f6e3a959aa42ec00740a977e8a)
使用唯一性约束匹配已存在的节点。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P173_102697.jpg?sign=1738881750-iAd74laGXv1MRW09ETf04uCtgWFS0Cxa-0-4a8331e0dbbfa1af7c61893c375f8297)
oliver节点已经存在了,因此MERGE只是匹配它而不创建。
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P173_101790.jpg?sign=1738881750-PH1BlaOhW0sn9HZozvWx2c16nLlDAavw-0-d42e3e18a29a9dd67b85f73cf9cd692d)
1.唯一性约束与部分匹配
当只有部分匹配时,使用唯一性约束合并将失败。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P174_102699.jpg?sign=1738881750-GGTDAvNu1ARVnS7ESRUdfNMvVlp60zlu-0-b444f32d1e9375787edfdae1538aaba1)
这里有一个唯一匹配到的name为Michael Douglas的节点,但没有具有唯一的role属性为Gordon Gekko的节点,因此MERGE匹配失败。
错误消息:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P174_102699a.jpg?sign=1738881750-zH5xlOOGE6j1pgRoFnE6NE3ZoQvkcgx1-0-a814c27ef187f4cc5b8911b0e15e8fea)
2.唯一性约束与匹配冲突
当有匹配的冲突结果时,使用MERGE唯一性约束将失败。
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P174_102700.jpg?sign=1738881750-EDAV0qqoL7BoHi0Kqs8IYEEW2Ht1NQ73-0-274ed7182f2114b8427e0ccd72367f55)
错误消息:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P174_101796.jpg?sign=1738881750-49kLcF2ij4zdksTrE0SHbkVAApniNPD2-0-b4a843ea674fb15ee471d38cc952841f)
3.3.8.6 使用map参数
MERGE不支持像CREATE节点时那样使用map参数。要在MERGE中使用map参数,需要显式地使用希望用到的属性。如下例所示。
参数:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P174_102701.jpg?sign=1738881750-1fOvgDpQZAOGlVudLLgeG9DGmswcHm5W-0-e45b1893ffa551e77a7155c2d480ebf5)
查询:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P174_102702.jpg?sign=1738881750-1d1V71TawNawzL2Bi74HcJCrzleYgLAI-0-f00c085929c814d63fa302a5b6f619e0)
结果:
![](https://epubservercos.yuewen.com/84FE89/26581284601284906/epubprivate/OEBPS/Images/Figure-P174_101799.jpg?sign=1738881750-QM3XgtL2UvNrlqx5ZgmjErEo4gXWGWLK-0-0203932b9c4dff1a079716467241668a)