neo4j不重用cypher create unique查询中的现有顶点

neo4j不重用cypher create unique查询中的现有顶点,neo4j,cypher,Neo4j,Cypher,neo4j图形的一部分表示对象、对象的值以及与这些值关联的属性。为了使用通用编程语法,我将保留以下结果: Object.Attribute = Value 其中,对象、属性和值都是节点,它们由值和属性关系链接,如下所示: Object-[:VALUE]->Value-[:ATTRIBUTE]->Attribute 为了用一个具体的例子来描述这一点,该代码的结果如下: Object.Colour = 'Red' 将作为: Object-[:VALUE]->(Value {

neo4j图形的一部分表示对象、对象的值以及与这些值关联的属性。为了使用通用编程语法,我将保留以下结果:

Object.Attribute = Value
其中,对象、属性和值都是节点,它们由值和属性关系链接,如下所示:

Object-[:VALUE]->Value-[:ATTRIBUTE]->Attribute
为了用一个具体的例子来描述这一点,该代码的结果如下:

Object.Colour = 'Red'
将作为:

Object-[:VALUE]->(Value { value:'Red' })-[:ATTRIBUTE]->(Attribute { name:'Colour' })
当我想要修改上面那样的持久化状态,并且希望重用现有的属性(理想情况下是值)节点时,就会出现问题——也就是说,我不希望属性{name:'color'}节点有多个实例,我希望有一个与每个值节点实例相关的实例

无论是否已经存在相同的节点,以下Cypher查询将继续并每次创建新的值和属性节点:

    start o=node(something)
    create unique o-[:VALUE]->(v {value:'Green'})-[:ATTRIBUTE]->(a {name:'Colour'})
    return v;
下面显然会回收值和属性节点,但当所需属性不存在时(即第一次使用时),当然不会起作用:

文档中的语句似乎不完全正确,我不明白为什么我的查询没有显示这种行为


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

第一个问题是,您正在属性图中构建属性图。这是可能的,但很尴尬,也不总是一个好的选择

你的例子是:

如果理解正确,您希望能够更改值节点并重新使用相同的属性节点,对吗

问题在于,在第二个查询中,您要求Cypher查找属性与图形中已有属性不同的值节点。Cypher找不到这样的节点,因此为您创建了一个节点。然后,它尝试从新创建的节点中查找传出属性关系,当然,它找不到任何传出属性关系。因此,它为您创建了新的关系和属性

如果要继续使用相同的属性节点,只需从值节点中忽略属性值,如下所示:

START  o=node(0) 
CREATE UNIQUE o-[:VALUE]->(v)-[:ATTRIBUTE]->(a {name:'Colour'}) 
SET    v.value = 'Green' 
RETURN v
这将找到属性节点的颜色,然后为您设置属性,而不是每次都创建新路径

有道理吗


Andrés

我想我真正的问题是:在执行“创建唯一节点”时,neo4j在哪里“搜索”现有节点;仅在当前图形中,或者它能够拾取与条件匹配的其他节点?它从您提供的信息中进行搜索-在这种情况下,只有
o
是已知的,因此用于查找匹配路径。在这种情况下,我想我了解其行为。如果create unique子句只能使用已连接到起始节点的节点和边,则它永远不会找到并重用断开连接的属性节点。
START  o=node(0) 
CREATE UNIQUE o-[:VALUE]->(v)-[:ATTRIBUTE]->(a {name:'Colour'}) 
SET    v.value = 'Green' 
RETURN v