neo4j不会在cypher中重用现有的顶点来创建唯一的查询

时间:2012-11-27 11:43:14

标签: neo4j cypher

我的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"的声明似乎并不完全正确,我不明白为什么我的查询没有表现出这种行为。

如何获得后一个查询的“回收”效果,并在需要时按需创建属性(和值)?

1 个答案:

答案 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属性节点,然后为您设置属性,而不是每次都创建新路径。

有道理吗?

安德烈斯