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

时间:2016-06-06 15:43:10

标签: 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;

1 个答案:

答案 0 :(得分:1)

我相信我有一个答案,这取决于我设置为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;

不确定这是否是最好的方法,但它对我有用。我会稍微公开一下,看看是否有人有更好的答案。

一个负面的副作用是,如果我插入一些没有facebook_id的东西,它将需要一个单独的合并声明。