我有一个具有唯一但不是必需属性的对象,即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;
答案 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的东西,它将需要一个单独的合并声明。