我的neo4j图的一部分表示对象,它们的值以及与这些值相关联的属性。要使用通用编程语法,我会坚持以下结果:
Object.Attribute = Value
其中Object,Attribute和Value都是节点,它们通过VALUE和ATTRIBUTE关系链接,如下所示:
Object-[:VALUE]->Value-[:ATTRIBUTE]->Attribute
使用特定示例来描述此代码的结果:
Object.Colour = 'Red'
将保持为:
Object-[:VALUE]->(Value { value:'Red' })-[:ATTRIBUTE]->(Attribute { name:'Colour' })
当我想要像上面那样修改持久化状态时,会出现问题,我希望重新使用现有的Attribute(和理想情况下,Value)节点 - 也就是说,我不想要要拥有Attribute {name:'Color'}节点的多个实例,我希望有一个与每个Value节点实例相关的实例。
以下Cypher查询将继续每次创建新的Value和Attribute节点,无论是否已存在相同的节点:
start o=node(something)
create unique o-[:VALUE]->(v {value:'Green'})-[:ATTRIBUTE]->(a {name:'Colour'})
return v;
以下显然会回收Value和Attribute节点,但当所需的Attribute不存在时(即第一次使用它)当然不会起作用:
start o=node(something), a=node(something)
create unique o-[:VALUE]->(v {value:'Green'})-[:ATTRIBUTE]->a
where a.name = 'Colour'
return v;
文档中"create unique will always make the least change possible to the graph — if it can use parts of the existing graph, it will"的声明似乎并不完全正确,我不明白为什么我的查询没有表现出这种行为。
如何获得后一个查询的“回收”效果,并在需要时按需创建属性(和值)?
答案 0 :(得分:0)
第一个问题是您正在构建属性图中的属性图。这是可能的,但很尴尬,并不总是一个好的选择。
你的例子: http://console.neo4j.org/r/evl77k
如果理解正确,您希望能够更改值节点并重新使用相同的属性节点,对吗?
问题在于,在第二个查询中,您要求Cypher找到具有与图表中已有属性不同的属性的值节点。 Cypher找不到这样的节点,因此为您创建一个节点。然后它尝试从新创建的节点中找到传出的ATTRIBUTE关系,当然它没有找到任何关系。所以它为你创造了一个新的关系和属性。
如果要继续使用相同的属性节点,只需省略值节点中的属性值,如下所示:
START o=node(0)
CREATE UNIQUE o-[:VALUE]->(v)-[:ATTRIBUTE]->(a {name:'Colour'})
SET v.value = 'Green'
RETURN v
这将找到Color属性节点,然后为您设置属性,而不是每次都创建新路径。
有道理吗?
安德烈斯