在Neo4j中创建独特的结构,它们具有属于另一个结构的节点

Ște*_*alu 5 graph neo4j cypher data-structures

假设我们有n个带有label的节点:Test和一个名为type的唯一属性.

UNWIND[{ type:"a" }, { type:"b" }, { type:"c" }, { type:"d" }] AS x
MERGE (t:Test { type: x.type })
RETURN t
Run Code Online (Sandbox Code Playgroud)

看起来像这样

基础结构

现在让我们介绍一个标签节点:Collection.此节点的目的是与:Test节点具有唯一的关系模式.

MATCH (a:Test { type:"a" }),(b:Test { type:"b" })
CREATE UNIQUE (x:Collection)-[:HAS]->(a),(x:Collection)-[:HAS]->(b)
Return *
Run Code Online (Sandbox Code Playgroud)

第一个系列

当我尝试创建另一个独特的结构(如前一个结构)但是有一些共同的节点时,我面临的问题就开始了.

MATCH (a:Test { type:"a" })
CREATE UNIQUE (x:Collection)-[:HAS]->(a)
RETURN *
Run Code Online (Sandbox Code Playgroud)

预期的结果是标签的另一个节点:Collection被创建并链接到:Test {type:"a"}但实际结果是它匹配先前的数据结构并返回而不是创建新的数据结构.

第二集

预期结果应该有2 :Collection节点,一个链接到type:"a",另一个链接到type:"a"输入:"b".

预期结果

任何输入类型的输入将非常感激:D

Mar*_*sse 2

来自neo4j 文档CREATE UNIQUE

\n\n
\n

CREATE UNIQUE 位于 MATCH 和 CREATE\xe2\x80\x89\xe2\x80\x94\xe2\x80\x89 的中间,它会匹配它能匹配的内容,并创建缺少的内容。CREATE UNIQUE 总是会对图进行尽可能少的更改,如果它可以使用现有图的一部分,那么它就会这样做。

\n
\n\n

您添加Collection没有任何属性的节点。我想如果CREATE UNIQUE找到一个Collection节点,它就会使用它。这就是CREATE UNIQUE应该如何工作。

\n\n

因此,如果您想要一个Collection与某些链接相关的新内容Test节点的新节点,您可以向该节点添加一些独特的属性:

\n\n
MATCH (a:Test { type:"a" })\nCREATE UNIQUE (x:Collection {key: \'unique value\'})-[:HAS]->(a)\nRETURN *\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者在单独的步骤中创建它:

\n\n
MATCH (a:Test { type:"a" })\nCREATE (x:Collection)\nCREATE (x)-[:HAS]->(a)\nRETURN *\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者使用MERGE代替CREATE UNIQUE.

\n