问:如何在 Neo4j 的 MERGE 语句中包含 WHERE 子句

bas*_*ner 6 neo4j cypher

我有一个对象,它具有唯一但不是必需的属性,即 Facebook ID。如果我插入另一个具有相同名称的对象并且有一个没有 Facebook ID 的对象,那么我认为它们是相同的。如果有一个名称相同但 Facebook ID 不同的对象,那么我认为它们是不同的并创建一个新对象。

我已经尝试了基于 Cypher 文档的各种语句,但无法使它们中的任何一个成为有效的语法。

虽然这个例子无效,但我认为它说明了我正在尝试做的事情:

MERGE (t:Thing {name: 'My Not Always Unique Name'})
WHERE EXISTS(t.facebook_id) AND t.facebook_id <> '111111111'
ON CREATE SET t.name = 'My Not Always Unique Name', 
              t.facebook_id = '111111111', 
              t.another_property = 'blah'
ON MATCH SET t.another_property = 'blah'
RETURN t;
Run Code Online (Sandbox Code Playgroud)

bas*_*ner 5

我相信我对此有一个答案,这取决于我为 id 属性设置的 UUID。

OPTIONAL MATCH (t:Thing {name: 'My Not Always Unique Name'}) WHERE t.facebook_id IS NULL OR t.facebook_id = '1111111' 
WITH t 
MERGE (s:Thing {id: COALESCE(t.id, 'e8344f24-faff-443a-ac48-b757381eddb8')}) 
ON MATCH SET s.name = 'My Not Always Unique Name', s.facebook_id = '1111111'
ON CREATE SET s.name = 'My Not Always Unique Name', s.facebook_id = '1111111' RETURN s;
Run Code Online (Sandbox Code Playgroud)

不确定这是否是最好的方法,但它对我有用。我将把这个开放一点,看看是否有人有更好的答案。

一个负面影响是,如果我插入的内容没有 facebook_id,则需要单独的合并语句。