我想知道是否有其他方法可以做到这一点,因为当我尝试使用对象设置一组属性时,它显然无效。
一个例子是我创建了一个参考节点create (t:Reference {name: 'reference'})
。
然后我接收了一些属性,我想在一个与Reference
节点有关系的节点中设置这些属性。
match (ref:Reference)
where ref.name = 'reference'
with ref
merge (t:Test {uuid: '123'})-[:merge_test]->(ref)
on create set t = {name1: 'a name', name2: 'another name'}, t.created = timestamp(), t.updated = timestamp()
on match set t.updated = timestamp()
return t
你会认为运行上面的cypher 2次,第一次会创建它,第二次只会更新t:Test的updated
属性,但事实并非如此,每次都会创建一个新的,好像合并从未检测到uuid
匹配。
我已从t = {name1: 'a name', name2: 'another name'}
中移除了on create
,它按预期工作,即第二次运行将更新updated
属性,而不是创建新的{{1}节点。 IE:
:Test
但这对我没有用,因为我在我的收藏中收到了一组没有时间戳的混合属性,并希望用t = {my_main_properties}集合设置它。
想知道这是Cypher的一个错误,还是我完全错过了文档中的内容?如果要么是一种解决方法?
使用Neo4j 2.1.3
答案 0 :(得分:2)
我想我只是理解了这里发生了什么,这个操作的创建阶段不会设置uuid,因此第二次将再次创建它。所以它好像:
on create set t = { params }
清除合并中定义的属性:
merge (t:Test {uuid: '123'})-[:...
这里的uuid被on create摧毁了。
解决方法是在params
对象中定义它。