我正在尝试按照此处的推荐使用 Neo/Cypher 创建链表结构:创建时CYPHER存储相同标签的节点关系顺序 https://stackoverflow.com/questions/33263822/cypher-store-order-of-node-relationships-of-the-same-label-when-i-create/33267061#33267061
(p:Parent)-[r1:PARENTID_RELTYPE]->(c1:Child)-[r2:PARENTID_RELTYPE]->(c2:Child)-[r3:PARENTID_RELTYPE]->(c3:Child)
但我无法理解所需事件序列的语法,以便将新节点转移到结构上或用不同的节点替换特定索引。
我感到困惑的是我需要添加新节点并修复使旧节点仍然位于链表结构内的结构的部分。源自父节点的每种类型 (PARENTID_RELTYPE) 应该只有一个关系;但每个父母可能存在多种不同类型的关系。子节点可以在 LinkedList 中多次出现,并且子节点可以在多个父节点的 LinkedList 中或在同一父节点但不同关系类型的 LinkedList 中出现。
因此,当我尝试取消转换时,可能会发生以下三种情况之一:
不存在通过 PARENTID_RELTYPE 链接到父级的现有子级
已经存在一个通过 PARENTID_RELTYPE 链接到父节点的子节点
已经存在一个通过 PARENTID_RELTYPE 链接到父级的子节点,并且该子节点只是我试图取消转换到链表结构的子节点的副本(在这种情况下,预期结果是在链表的零索引和第一个索引)。
上面提到的答案网址极大地帮助我理解如何在 Neo/Cypher 中读取链表结构,但由于在 cypher 中处理条件的替代方式,我无法理解如何写入该结构(以及删除从他的结构)。
以下是我最初的尝试,但我对需要语法做什么感到有些困惑。
MATCH (a:%s {id: {_parentnodeid}}), (b:%s {id: {_id}})
MERGE a-[relold:%s]->b
ON CREATE
SET relold.metadata = {_metaData}
ON MATCH
...
我非常感谢您提供的帮助。
[更新]
在以下查询中,为了简单起见,我假装:
- 我们发现
Parent
按名称感兴趣的节点。
- 当前兴趣的关系类型是
Foo
.
一般注意事项:
- The
OPTIONAL MATCH
子句查找应在插入的子项之后的同级(如果有)。
- The
FOREACH
子句负责将该同级(如果有)链接到要插入的子级,然后删除与该同级的过时关系。
-
To unshift the Child
有一个id
of 123
就在之后Parent
node:
MATCH (p:Parent {name:"Fred"})
OPTIONAL MATCH (p)-[r:Foo]->(c:Child)
WITH p, r, COLLECT(c) AS cs
MERGE (cNew:Child {id:123})
CREATE (p)-[rNew:Foo]->(cNew)
FOREACH (x IN cs |
CREATE (cNew)-[:Foo]->(x)
DELETE r)
RETURN p, rNew, cNew;
-
To insert the Child
节点有一个id
of 123
在索引 4 处(即,使其成为第五个子元素):
MATCH (p:Parent {name:"Fred"})
MATCH (p)-[:Foo*3]->()-[r:Foo]->(c:Child)
OPTIONAL MATCH (c)-[r1:Foo]->(c1:Child)
WITH c, r1, COLLECT(c1) AS c1s
MERGE (cNew:Child {id:123})
CREATE (c)-[rNew:Foo]->(cNew)
FOREACH (x IN c1s |
CREATE (cNew)-[:Foo]->(x)
DELETE r1)
RETURN c, rNew, cNew;
-
To replace the Child
在索引 4(即第 5 个孩子)处Child
有一个id
of 123
:
MATCH (p:Parent { name:"Fred" })
MATCH (p)-[:Foo*4]->(c0)-[r:Foo]->(c:Child)
OPTIONAL MATCH (c)-[r1:Foo]->(c1:Child)
WITH c0, r, c, r1, COLLECT(c1) AS c1s
MERGE (cNew:Child { id:123 })
CREATE (c0)-[rNew:Foo]->(cNew)
DELETE r, c
FOREACH (x IN c1s |
CREATE (cNew)-[:Foo]->(x)
DELETE r1)
RETURN c0, rNew, cNew;
注:DELETE r, c
子句总是删除被替换的节点(c
)。仅当这是您真正想要发生的事情时才合适,并且只有在以下情况下才会成功c
没有其他关系r
。要探索如何满足更具体的需求,请提出一个新问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)