Neo4j cypher与创建对象属性不匹配时合并

时间:2014-08-14 11:59:29

标签: neo4j cypher

我想知道是否有其他方法可以做到这一点,因为当我尝试使用对象设置一组属性时,它显然无效。

一个例子是我创建了一个参考节点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

1 个答案:

答案 0 :(得分:2)

我想我只是理解了这里发生了什么,这个操作的创建阶段不会设置uuid,因此第二次将再次创建它。所以它好像:

on create set t = { params }

清除合并中定义的属性:

merge (t:Test {uuid: '123'})-[:...

这里的uuid被on create摧毁了。

解决方法是在params对象中定义它。